Jak bezpiecznie zmienić nazwę niestandardowego typu postu?


19

Zrobiłem niestandardowy typ posta o nazwie „portfolio”, ale chcę go zmienić na „projekty”. Jakie dokładnie kroki należy podjąć, aby bezpiecznie zmienić nazwę i zapobiec zniknięciu niestandardowych postów na pulpicie nawigacyjnym?

Uwaga: są już posty, portfoliowięc nie mogę się po prostu portfolioz nimi zrezygnować projects.

/* Register Portfolio Post Type */
add_action('init', 'create_portfolio');

function create_portfolio() {

    $labels = array(
        'name' => __('Portfolio', 'post type general name'),
        'singular_name' => __('Project', 'post type singular name'),
        'add_new' => __('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

/* Register Skills Taxonomy */
register_taxonomy("Skills", array("portfolio"), array("hierarchical" => true, "label" => "Skills", "singular_label" => "Skill", "rewrite" => true));

/* Add Fields */
add_action("admin_init", "add_portfolio_fields");

function add_portfolio_fields(){
    add_meta_box("website_url", "Website URL", "website_url", "portfolio", "side", "low");
    add_meta_box("view_more", "View More", "view_more", "portfolio", "side", "low");
    add_meta_box("screenshot_name", "Screenshot Name", "screenshot_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_name", "Thumbnail Name", "thumbnail_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_alt", "Thumbnail Alt", "thumbnail_alt", "portfolio", "side", "low");
}

function website_url(){
    global $post;
    $custom = get_post_custom($post->ID);
    $website_url = $custom["website_url"][0];
    ?>
    <label>Website URL:</label>
    <input size="50" name="website_url" value="<?php echo $website_url; ?>" />
    <?php
}

function view_more() {
    global $post;
    $custom = get_post_custom($post->ID);
    $view_more = $custom["view_more"][0];
    ?>
    <label>View More:</label>
    <input size="50" name="view_more" value="<?php echo $view_more; ?>" />
    <?php
}

function screenshot_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $screenshot_name = $custom["screenshot_name"][0];
    ?>
    <label>Screenshot Name:</label>
    <input name="screenshot_name" value="<?php echo $screenshot_name; ?>" />
    <?php
}

function thumbnail_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_name = $custom["thumbnail_name"][0];
    ?>
    <label>Thumbnail Name:</label>
    <input name="thumbnail_name" value="<?php echo $thumbnail_name; ?>" />
    <?php
}

function thumbnail_alt() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_alt = $custom["thumbnail_alt"][0];
    ?>
    <label>Thumbnail Alt:</label>
    <input name="thumbnail_alt" value="<?php echo $thumbnail_alt; ?>" />
    <?php
}

add_action('save_post', 'save_portfolio_details');

function save_portfolio_details(){
    global $post;

    update_post_meta($post->ID, "website_url", $_POST["website_url"]);
    update_post_meta($post->ID, "view_more", $_POST["view_more"]);
    update_post_meta($post->ID, "screenshot_name", $_POST["screenshot_name"]);
    update_post_meta($post->ID, "thumbnail_name", $_POST["thumbnail_name"]);
    update_post_meta($post->ID, "thumbnail_alt", $_POST["thumbnail_alt"]);
}

/* Custom Columns */
add_action("manage_posts_custom_column",  "portfolio_custom_columns");
add_filter("manage_edit-portfolio_columns", "portfolio_edit_columns");

function portfolio_edit_columns($columns){
    $columns = array(
        "cb" => "<input type=\"checkbox\" />",
        "title" => "Project Title",
        "description" => "Description",
    );

    return $columns;
}

function portfolio_custom_columns($column){
    global $post;

    switch ($column) {
        case "description":
        the_excerpt();
        break;
    }
}

co powiesz na zastąpienie samych etykiet?
Bainternet 24.04.13

Tylko etykiety? Nie jestem pewien, co dokładnie masz na myśli, ale wolałbym to dokładnie zmienić.
Desi

Odpowiedzi:


2

Jeśli nie masz jeszcze żadnych postów w swoim portfolio.

To byłoby naprawdę proste. Zmień nazwę wszystkiego za pomocą „Portfolio” na „Projekty”. Nic nie stracisz i zmienisz nazwę.

Edytować :

Spróbuj użyć tej wtyczki http://wordpress.org/extend/plugins/ptypeconverter/, aby bezpiecznie wyeksportować bieżące posty i zaimportować je do nowego niestandardowego typu.

Kroki są następujące:

1 Pobierz i użyj wtyczki: http://wordpress.org/extend/plugins/ptypeconverter/

2 Skopiuj gdzieś zapisany plik „portfolio” niestandardowego typu posta. nazwij to na przykład portfolio_post_typeBACKUP.php

3 Teraz masz pewność, że ta metoda zawiedzie. możesz to odzyskać.

4 Zmień „ portfolio ” na „ projekty

5 Zaimportuj posty z wtyczką i altówką!

Mam nadzieję, że to zadziała.


Ach, przepraszam, że powinienem wspomnieć. Jest już wiele postów portfolio.
Desi

zredagowałem odpowiedź. powodzenia!
Wesley Cheung

To fantastyczna wtyczka!
realph

1
ta wtyczka nie działa już poprawnie. próbowałem i nie zmieniło to wszystkich „starych” typów postów. ale rozwiązanie mysql (odpowiedź Willa) działa dobrze.
honk31

Wtyczka nie była aktualizowana od dwóch lat.
rhand

18

Możesz to zrobić również bezpośrednio za pomocą MySQL.

UPDATE `wp_posts`
SET 
    # Update the post_type column
    `post_type` = REPLACE(`post_type`,'name_of_old_post_type','name_of_new_post_type'),
    # Update the urls
    `guid` = REPLACE(`guid`,'name_of_old_post_type','name_of_new_post_type')
WHERE `post_type` = 'name_of_old_post_type'

Dwie rzeczy do zapamiętania:

  1. Musisz zaktualizować wszelkie odniesienia do tego typu postów w kodzie (powiedzmy, szablony, definicje CMB2 lub definicje taksonomiczne).
  2. Jeśli przechowujesz jakiekolwiek odniesienia do tego typu postów wp_postmetaw szeregach tablic, nie chcesz wykonywać prostej AKTUALIZACJI / WYMIANY, ponieważ spowoduje to ich wysadzenie! Cóż, chyba że zarówno ciąg nowego, jak i starego typu posta ma dokładnie taką samą długość.

7

Rozszerzając odpowiedź Willa nieco dalej ..., a zwłaszcza jeśli robisz to ze swojej wtyczki:

global $wpdb;
$old_post_types = array('old_type' => 'new_type');
foreach ($old_post_types as $old_type=>$type) {
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_type = REPLACE(post_type, %s, %s) 
                         WHERE post_type LIKE %s", $old_type, $type, $old_type ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "post_type={$old_type}", "post_type={$type}", "%post_type={$type}%" ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "/{$old_type}/", "/{$type}/", "%/{$old_type}/%" ) );
}

Zmiana polega na tym, aby nie zastępować bezpośrednio starego typu w GUID, ale zastępować tylko wtedy, gdy „post_type = old_type” lub „/ old_type /” jest obecny. Pozwala to uniknąć przypadkowego zastąpienia ważnych ślimaków. (np. Twój niestandardowy typ posta to portfolio, a ślimak strony też ma w nim portfolio)

Inną alternatywą jest zrobienie czegoś takiego:

global $wpdb, $wp_rewrite;
foreach ($old_post_types as $old_type=>$type) {
    $q = 'numberposts=-1&post_status=any&post_type='.$old_type;
    $items = get_posts($q);
    foreach ($items as $item) {
        $update['ID'] = $item->ID;
        $update['post_type'] = $type;
        wp_update_post( $update );
    }
}
$wp_rewrite->flush_rules();

HTH!


Dzięki. To działa. Jedna drobna rzecz: ostatnia część drugiego zapytania w pętli powinna brzmieć „% post_type = {$ old_type}%”, a nie „% post_type = {$ type}%”.
Betty

3

Użyj zapytania do bazy danych WordPress, ale nie zapomnij o danych opcji zserializowanych

Metodą, która działała dla mnie, było wyszukiwanie i zamiana w bazie danych WordPress, ale upewnienie się, że nie zepsuję szeregowych danych opcji w tym procesie. Najlepszym sposobem, jaki znalazłem, jest skorzystanie z bezpiecznego wyszukiwania i zastąpienie narzędzia bazy danych z interconnect / it . Nigdy nie SETwykonuj po = REPLACE(prostu ,'old_post_type','new_post_type')zapytania typu post_type typu post_type bez wiedzy o tym, co robisz, ponieważ dane serializowane ulegną awarii, ponieważ zachowuje sumę kontrolną i nie można poprawnie odserializować.

Przeczytaj sekcję Potencjalne problemy przed ślepym śledzeniem tego

Krok 1 - Bezpiecznie zaktualizuj bazę danych o nową nazwę

  1. zrób kopię zapasową bazy danych, ponieważ poniższe zmiany mają bardzo realny potencjał, aby ją uszkodzić.
  2. pobierz i rozpakuj bezpieczne wyszukiwanie i zastąp narzędzie bazy danych z interconnect / it
  3. dodaj wyodrębniony katalog do katalogu głównego (działa również w podkatalogach)
  4. przejdź do katalogu, np .: /mywebsite.com/path/to/utility/directory/
  5. Podążaj za wskazówkami. kliknij „uruchom na sucho”, jeśli jesteś paronoikiem, aby zobaczyć zmiany (będą setki, jeśli masz nawet kilka postów o zmienionym typie postu)
  6. kliknij „uruchom na żywo”, aby sfinalizować zmiany.
  7. usuń katalog bezpiecznego wyszukiwania z katalogu wordpress, ponieważ jest to problem bezpieczeństwa

Krok 2 - Zresetuj swoje łącza bezpośrednie

Jeśli korzystasz z permalinków, aktualizacje Twojej bazy danych przekręcą twoje przekierowania do twoich niestandardowych typów postów. Jest jednak łatwa poprawka, po prostu przejdź do ustawień WordPressa / permalinków i zanotuj bieżące ustawienie (moje to „post name”). Następnie wróć do ustawień domyślnych, kliknij „zapisz”, następnie wróć do poprzedniego ustawienia, a następnie zapisz ponownie. Właśnie rozwiązałeś problemy z przekierowaniem.

Krok 3 - Zmień nazwę niestandardowych szablonów typów postów

Jeśli jesteś podobny do mnie i masz utworzone niestandardowe szablony typów postów, musisz zmienić ich nazwy, w przeciwnym razie niestandardowe posty będą wyglądać na popsute. Po prostu przejdź do motywu i znajdź dowolny plik, który ma nazwę starego typu postu w nazwie pliku i zmień nazwę pliku, używając nowej nazwy posta. Na przykład musiałem zmienić single-project-portfolio.phpna, single-before-after.phpkiedy zmieniłem typ posta z project-portfoliona before-after.

Krok 5 - Zaktualizuj dowolny kod

Wyszukaj plik i zastąp starą niestandardową nazwę typu posta w folderze motywu i wtyczek. Dla mnie miałem kilka niestandardowych skrótów, które polegały na podjęciu decyzji, czy korzystam z jednego z moich niestandardowych typów postów.

Przetestuj wszystko

Potencjalne problemy (przeczytaj przed rozpoczęciem tej procedury)

Problemy z syndykowaniem

Jeśli niestandardowe typy postów zostały syndykowane, pamiętaj, że początkowe wyszukiwanie i zamiana również zmienią prowadnice swoich postów, co zmusi wszystkich subskrybentów do zobaczenia starych postów jako nowych. Nie musiałem sobie z tym poradzić, ale jeśli musisz, rozważ ręczne wybranie tabel przetwarzanych przez narzędzie Safesearch, a następnie ręczną aktualizację danych nieserializowanych za pomocą następującego zapytania:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';

bardzo fajnie jest wymienić to wszystko. z wyjątkiem tego, że zapytanie sql na końcu nie jest kompletne, ponieważ zapomniałeś o guid, ale są one wymienione w odpowiedzi Wills. a poza tym nie skorzystałbym WHERE 'post_type' LIKE '%old_post_type%', WHERE 'post_type' = 'old_post_type'
użyłbym

0

Nie mam reputacji, aby komentować, więc umieszczę to tutaj. Rozszerzając przykład Willa. Zmieniłem LIKE na „=” i oba wskazują na GDZIEpost_type

UPDATE `wp_posts`
    SET `guid` = REPLACE(`guid`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'    

UPDATE `wp_posts`
    SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'

Pamiętaj także, aby przejść do Administratora> Ustawienia> Permalinki i kliknąć „Zapisz zmiany”. W przeciwnym razie Twoje linki prawdopodobnie zostaną zepsute.

Będziesz także musiał edytować dowolne nazwy szablonów typu „pojedynczy post”.

To powinno być wszystko, co musisz zrobić.


0

Oto naprawdę prosty sposób:

  1. Uruchom Wordpress Exporter (Narzędzia> Eksportuj) - eksportuj tylko typ postu, którego nazwę chcesz zmienić
  2. Otwórz wygenerowany plik .xml i zastąp wszystkie wzmianki o starej nazwie typu postu nową nazwą (w meta „custom_post_type”, a także w polu bezpośredniego połączenia)
  3. Utwórz nowy typ posta o takiej samej nazwie jak w edytowanym pliku .xml (ale zachowaj stary, na wypadek niepowodzenia)
  4. Zaimportuj edytowany plik .xml za pomocą importera Wordpress (wtyczka dostępna bezpośrednio z Narzędzia> Importuj)
  5. Sprawdź, czy treść jest obecna w nowym typie postu, a następnie usuń stary
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.