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.