Як безпечно змінити ім’я користувацького типу публікації?


19

Я створив спеціальний тип публікації під назвою "портфоліо", але хочу змінити його на "проекти". Які саме дії потрібно зробити, щоб безпечно змінити ім’я та не допустити зникнення користувацьких публікацій типу публікацій на інформаційній панелі?

Примітка. У ньому вже є публікації, portfolioтому я не можу просто вийти portfolioз 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;
    }
}

як щодо заміни лише міток?
Бейнтернет

Просто етикетки? Я не впевнений, що саме ви маєте на увазі, але я вважаю за краще ретельно змінювати це протягом усього часу.
Дезі

Відповіді:


2

Якщо у вас ще немає публікацій у вашому портфоліо.

Це було б справді просто. Перейменуйте все за допомогою "Портфоліо" в "Проекти". Ви нічого не втратите і зміните ім’я.

Редагувати:

Спробуйте використовувати цей плагін http://wordpress.org/extend/plugins/ptypeconverter/, щоб безпечно експортувати поточні публікації та імпортувати їх у ваш новий користувацький тип публікації.

Отже, кроки такі:

1 Завантажте та використовуйте плагін: http://wordpress.org/extend/plugins/ptypeconverter/

2 Скопіюйте файл власного типу типу "портфоліо" десь збережіть. назвіть його, наприклад, portfolio_post_typeBACKUP.php

3 Тепер ви впевнені, коли цей метод виходить з ладу. ви можете відновити його.

4 Змініть " портфоліо " на " проекти "

5 Імпортуйте публікації за допомогою плагіна та віоли!

Сподіваюся, це працює.


Ах, вибачте, мав би згадати. У публікаціях portfolioвже багато.
Дезі

я відредагував відповідь. Щасти!
Веслі Чеун

Це фантастичний плагін!
realph

1
цей плагін більше не працює належним чином. Я спробував це, і він не змінив усіх "старих" постів. але рішення mysql (відповідь Віл) працює чудово.
honk31

Плагін не оновлювався протягом двох років.
rhand

18

Ви також можете це зробити безпосередньо з 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'

Дві речі, які слід зазначити:

  1. Вам потрібно буде оновити будь-які посилання на цей тип публікації у своєму коді (скажімо, шаблони, визначення CMB2 або визначення таксономії).
  2. Якщо ви зберегли будь-які посилання на цей тип публікації в wp_postmetaмежах серіалізованих масивів, ви не хочете робити просте ОНОВЛЕННЯ / ЗАМІНА, оскільки це підірве їх! Ну, якщо тільки нові і старі рядки типу публікації не мають однакової довжини.

7

Подовжуючи відповідь Вілла трохи далі ..., і особливо, якщо ви це робите зі свого плагіна:

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}/%" ) );
}

Зміни тут полягають у тому, щоб не замінювати старий тип у напрямі безпосередньо, а замінювати лише за наявності "post_type = old_type" або "/ old_type /". Це дозволяє уникнути заміни дійсних слимаків помилково. .

Ще одна альтернатива - зробити щось подібне:

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!


Спасибі. Це працює. Одне незначне: остання частина другого запиту в циклі повинна бути "% post_type = {$ old_type}%", а не "% post_type = {$ type}%".
Бетті

3

Використовуйте запит бази даних WordPress, але не забувайте про дані серіалізованих опцій

Метод, який працював для мене, полягав у тому, щоб здійснити пошук та заміну в базі даних WordPress, але переконайтеся, що в процесі не видаляються серіалізовані параметри даних. Найкращий спосіб, який я знайшов, - це використовувати безпечний пошук та заміну утиліти бази даних із взаємозв'язку / її . Ніколи просто не SETвиконайте = REPLACE(запит ,'old_post_type','new_post_type')типу post_type, не знаючи, що ви робите, або серіалізовані дані зламаються, оскільки він зберігає контрольну суму і не зможе належним чином скасувати серіалізацію.

Прочитайте розділ "Потенційні проблеми", перш ніж сліпо слідувати цьому

Крок 1 - Безпечно оновіть свою базу даних за допомогою нового імені

  1. створити резервну копію вашої бази даних, оскільки наступні зміни мають дуже реальний потенціал для її пошкодження.
  2. завантажте та розпакуйте безпечний пошук та замініть утиліту бази даних із взаємозв'язку / її
  3. додайте витягнутий каталог у свою веб-кореневу систему (вона також працює у підкаталогах)
  4. перейдіть до каталогу, наприклад: /mywebsite.com/path/to/utility/directory/
  5. слідувати вказівкам. натисніть "сухий прогон", якщо ви є паронієм, щоб побачити зміни (їх буде сотні, якщо у вас навіть є кілька публікацій зміненого типу публікації)
  6. для завершення змін натисніть кнопку "живий запуск".
  7. видаліть каталог безпечного пошуку з каталогу Wordpress з моменту його безпеки

Крок 2 - Скиньте свої постійні посилання

Якщо ви використовуєте постійні посилання, оновлення вашої бази даних призведе до переадресації ваших спеціальних типів публікацій. Однак є легке виправлення, просто зайдіть у налаштування / постійні посилання WordPress та відзначте поточні налаштування (у мене було "ім'я посади"). Потім поверніться до типового значення, натисніть «зберегти», потім поверніться до попереднього налаштування, а потім знову збережіть. Ви щойно вирішили проблеми з переадресацією.

Крок 3 - Перейменуйте власні шаблони типу публікації вашої теми

Якщо ви схожі на мене, і ви створили власні шаблони типу публікацій, вам потрібно буде перейменувати ці, або ваші користувацькі публікації виглядатимуть накрученими. Просто увійдіть у свою тему і знайдіть будь-який файл, у якому є ваше старе ім’я типу публікації, і перейменуйте файл, використовуючи нове ім’я допису. Наприклад, мені довелося змінити , single-project-portfolio.phpщоб , single-before-after.phpколи я змінив свій пост типу від project-portfolioдо before-after.

Крок 5 - Оновіть будь-який код

Виконайте пошук та заміну файлів у старому власному імені типу публікації у темі та плагінах. Для мене було кілька спеціальних шорт-кодів, які покладалися на прийняття рішення щодо того, чи використовую я один із моїх спеціальних типів публікацій.

Тестуйте все

Потенційні проблеми (читайте перед початком цієї процедури)

Проблеми синдикації

Якщо ваші користувальницькі типи публікацій були синдиковані, розумійте, що ваш початковий пошук та заміна також змінять посібники ваших публікацій, що змусить усіх підписників бачити старі повідомлення як нові. Мені з цим не доводилося стикатися, але якщо вам потрібно, то розгляньте вручну вибираючи таблиці, які обробляє утиліта safesearch, а потім вручну оновляючи будь-які не серіалізовані дані за допомогою наступного запиту:

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

дуже акуратно перераховувати все це. крім запиту sql, врешті-решт, не є повним, оскільки ви забули про настанови, але вони вказані у відповіді Wills. плюс я б не пішов WHERE 'post_type' LIKE '%old_post_type%', я б скористався WHERE 'post_type' = 'old_post_type', оскільки ваш шлях також міг би змінити деякі інші типи публікацій ..
honk31

0

У мене немає репутації коментувати, тому я викладу це тут. Розширення прикладу Вілла. Я змінив LIKEs на "=" і обидва вони вказують на WHEREpost_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'

Також не забудьте зайти в Адміністратор> Налаштування> Постійні посилання та натиснути "Зберегти зміни". Інакше ваші посилання, ймовірно, будуть порушені.

Вам також потрібно буде відредагувати будь-які імена шаблонів "один-пост".

Це має бути все, що вам потрібно зробити.


0

Ось дійсно простий спосіб:

  1. Запустіть експортер Wordpress (Інструменти> Експорт) - експортуйте лише тип публікації, для якої потрібно змінити ім'я
  2. Відкрийте згенерований файл .xml та замініть всі згадки старого імені типу публікації новим іменем (у мета "custom_post_type", а також у полі постійної посилання)
  3. Створіть новий тип публікації з тим самим іменем, що і в відредагованому .xml (але все ж зберігайте стару, якщо вона не виходить)
  4. Імпортуйте відредагований .xml файл через Wordpress Importer (плагін доступний безпосередньо з Інструменти> Імпорт)
  5. Перевірте, чи є вміст у новому типі публікації, а потім видаліть старий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.