ฉันจะเปลี่ยนชื่อประเภทโพสต์ที่กำหนดเองได้อย่างปลอดภัยได้อย่างไร


19

ฉันสร้างโพสต์แบบกำหนดเองที่เรียกว่า 'ผลงาน' แต่ฉันต้องการเปลี่ยนเป็น 'โครงการ' ขั้นตอนที่แน่นอนที่ฉันต้องดำเนินการเพื่อเปลี่ยนชื่ออย่างปลอดภัยคืออะไรและป้องกันไม่ให้โพสต์ประเภทโพสต์ที่กำหนดเองหายไปในแผงควบคุม

หมายเหตุ: มีอยู่แล้วโพสในportfolioดังนั้นผมจึงไม่สามารถเพียงแค่สลับออกมาด้วยportfolioprojects

/* 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;
    }
}

วิธีการเกี่ยวกับการเปลี่ยนเพียงแค่ฉลาก?
Bainternet

เพียงแค่ฉลาก ฉันไม่แน่ใจว่าคุณหมายถึงอะไร แต่ฉันต้องการที่จะเปลี่ยนแปลงอย่างทั่วถึง
Desi

คำตอบ:


2

หากคุณไม่มีโพสต์ในผลงานของคุณ

มันจะง่ายจริงๆ เปลี่ยนชื่อทุกอย่างด้วย "ผลงาน" เป็น "โครงการ" คุณจะไม่สูญเสียอะไรเลยและเปลี่ยนชื่อ

แก้ไข:

ลองใช้ปลั๊กอินนี้http://wordpress.org/extend/plugins/ptypeconverter/เพื่อส่งออกกระทู้ปัจจุบันอย่างปลอดภัยและนำเข้าลงในประเภทโพสต์ที่คุณกำหนดเองใหม่

ดังนั้นขั้นตอนคือ:

1ดาวน์โหลดและใช้ปลั๊กอิน: http://wordpress.org/extend/plugins/ptypeconverter/

2คัดลอกไฟล์ "แฟ้มสะสมผลงาน" ของโพสต์แบบกำหนดเองที่ใดที่หนึ่งบันทึก เรียกมันว่าตัวอย่างเช่น portfolio_post_typeBACKUP.php

3ตอนนี้คุณมั่นใจเมื่อวิธีนี้ล้มเหลว คุณสามารถกู้คืนได้

4เปลี่ยน " ผลงาน " เป็น " โครงการ "

5นำเข้าโพสต์ด้วยปลั๊กอินและวิโอลา!

หวังว่างานนี้


อาควรขอโทษที่ได้กล่าวถึง มีโพสต์จำนวนมากในportfolioแล้ว
Desi

ฉันแก้ไขคำตอบ โชคดี!
Wesley Cheung

นี่เป็นปลั๊กอินที่ยอดเยี่ยม!
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}/%" ) );
}

การเปลี่ยนแปลงที่นี่คือไม่แทนที่ชนิดเก่าใน guid โดยตรง แต่แทนที่เฉพาะเมื่อ "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}%"
Betty

3

ใช้การสืบค้นฐานข้อมูล WordPress แต่อย่าลืมข้อมูลเกี่ยวกับตัวเลือกที่ต่อเนื่องกัน

วิธีการที่ได้ผลสำหรับฉันคือทำการค้นหาและแทนที่ภายในฐานข้อมูล WordPress แต่ต้องแน่ใจว่าจะไม่ทำให้เสียข้อมูลตัวเลือกต่อเนื่องในกระบวนการ วิธีที่ดีที่สุดที่ฉันได้พบคือการใช้การค้นหาปลอดภัยและแทนที่ยูทิลิตี้ฐานข้อมูลจากการเชื่อมต่อ / มัน ไม่เพียงแค่ทำSETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')แบบสอบถามชนิดไม่ทราบว่าสิ่งที่คุณกำลังทำหรือข้อมูลต่อเนื่องจะทำลายเพราะมันช่วยให้การตรวจสอบและจะไม่สามารถที่จะ unserialize อย่างถูกต้อง

อ่านหัวข้อปัญหาที่อาจเกิดขึ้นก่อนที่จะติดตามสิ่งนี้

ขั้นตอนที่ 1 - อัปเดตฐานข้อมูลของคุณอย่างปลอดภัยด้วยชื่อใหม่

  1. สำรองฐานข้อมูลของคุณเนื่องจากการเปลี่ยนแปลงต่อไปนี้มีโอกาสที่จะเกิดความเสียหายได้
  2. ดาวน์โหลดและเปิดเครื่องรูดค้นหาที่ปลอดภัยและแทนที่ยูทิลิตี้ฐานข้อมูลจากการเชื่อมต่อ / มัน
  3. เพิ่มไดเรกทอรีที่แยกไปยัง webroot ของคุณ (มันยังทำงานในไดเรกทอรีย่อย)
  4. เรียกดูไดเรกทอรีเช่น: /mywebsite.com/path/to/utility/directory/
  5. ทำตามคำแนะนำ คลิก 'dry-run' หากคุณมี paronoid เพื่อดูการเปลี่ยนแปลง (จะมีหลายร้อยถ้าคุณยังมีโพสต์ที่เปลี่ยนประเภทโพสต์ไม่กี่)
  6. คลิก 'เรียกใช้สด' เพื่อเสร็จสิ้นการเปลี่ยนแปลง
  7. ลบไดเรกทอรีการค้นหาที่ปลอดภัยจากไดเรกทอรี wordpress ของคุณเนื่องจากปัญหาด้านความปลอดภัย

ขั้นตอนที่ 2 - รีเซ็ต Permalinks ของคุณ

หากคุณใช้ลิงก์ถาวรการอัปเดตฐานข้อมูลของคุณจะทำให้การเปลี่ยนเส้นทางของคุณไปยังประเภทโพสต์ที่คุณกำหนดเอง มีการแก้ไขที่ง่ายเพียงแค่เข้าไปที่การตั้งค่า WordPress / permalinks และบันทึกการตั้งค่าปัจจุบัน (ของฉันคือ 'ชื่อโพสต์') จากนั้นสลับกลับเป็นค่าเริ่มต้นคลิก 'บันทึก' จากนั้นกลับสู่การตั้งค่าก่อนหน้าจากนั้นบันทึกอีกครั้ง คุณเพิ่งแก้ไขปัญหาการเปลี่ยนเส้นทางของคุณ

ขั้นตอนที่ 3 - เปลี่ยนชื่อเทมเพลตประเภทโพสต์ที่กำหนดเองของธีมของคุณ

หากคุณเป็นเหมือนฉันและคุณสร้างเทมเพลตประเภทโพสต์ที่กำหนดเองคุณจะต้องเปลี่ยนชื่อโพสต์เหล่านี้มิฉะนั้นโพสต์ที่กำหนดเองของคุณจะดูสับสน เพียงเข้าไปที่ธีมของคุณและค้นหาไฟล์ใด ๆ ที่มีชื่อโพสต์เก่าของคุณในชื่อไฟล์และเปลี่ยนชื่อไฟล์โดยใช้ชื่อโพสต์ใหม่ของคุณ ตัวอย่างเช่นฉันต้องเปลี่ยนsingle-project-portfolio.phpเป็นsingle-before-after.phpเมื่อฉันเปลี่ยนประเภทโพสต์จากproject-portfolioเป็นbefore-afterไป

ขั้นตอนที่ 5 - อัปเดตรหัสใด ๆ

ค้นหาไฟล์และแทนที่ชื่อโพสต์แบบกำหนดเองเก่าของคุณในโฟลเดอร์ธีมและปลั๊กอิน สำหรับฉันฉันมีรหัสย่อที่กำหนดเองหลายอย่างซึ่งใช้ตัดสินใจว่าฉันใช้โพสต์ที่กำหนดเองประเภทใดประเภทหนึ่ง

ทดสอบทุกอย่าง

ปัญหาที่อาจเกิดขึ้น (อ่านก่อนที่จะเริ่มขั้นตอนนี้)

ปัญหาการเผยแพร่

หากประเภทโพสต์ที่กำหนดเองของคุณถูกรวบรวมให้ตระหนักว่าการค้นหาและแทนที่ครั้งแรกของคุณจะเปลี่ยน guids ของโพสต์ของคุณด้วยซึ่งจะบังคับให้สมาชิกทั้งหมดเห็นโพสต์เก่าเป็นโพสต์ใหม่ ฉันไม่ต้องจัดการกับเรื่องนี้ แต่ถ้าคุณต้องการให้พิจารณาเลือกตารางที่ยูทิลิตี้ Safesearch ดำเนินการด้วยตนเองจากนั้นอัปเดตข้อมูลที่ไม่ต่อเนื่องด้วยตนเองโดยใช้แบบสอบถามต่อไปนี้:

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

เรียบร้อยมากรายการทั้งหมดนี้ขึ้น ยกเว้นแบบสอบถาม sql ในตอนท้ายจะไม่สมบูรณ์เนื่องจากคุณลืม guid แต่พวกเขาอยู่ในคำตอบพินัยกรรม รวมทั้งฉันจะไม่ไปด้วยWHERE 'post_type' LIKE '%old_post_type%'ฉันจะใช้WHERE 'post_type' = 'old_post_type'เนื่องจากวิธีการของคุณอาจทำให้โพสต์ประเภทอื่น ๆ เปลี่ยนได้ ..
honk31

0

ฉันไม่มีชื่อเสียงที่จะแสดงความคิดเห็นดังนั้นฉันจะใส่ที่นี่ ตัวอย่างที่ขยายจะ ฉันเปลี่ยน LIKEs เป็น "=" และให้ทั้งคู่ชี้ไปที่ไหนpost_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 Exporter (เครื่องมือ> ส่งออก) - ส่งออกเฉพาะโพสต์ประเภทที่คุณต้องการเปลี่ยนชื่อ
  2. เปิดไฟล์. xml ที่สร้างขึ้นและแทนที่การกล่าวถึงชื่อโพสต์เก่าทั้งหมดด้วยชื่อใหม่ (ในเมตา "custom_post_type" เช่นเดียวกับในฟิลด์ Permalink)
  3. สร้างประเภทโพสต์ใหม่ของคุณด้วยชื่อเดียวกับใน. xml ที่แก้ไข (แต่ยังคงประเภทเก่าไว้ในกรณีที่ล้มเหลว)
  4. นำเข้าไฟล์. xml ที่แก้ไขผ่าน Wordpress Importer (มีปลั๊กอินจากเครื่องมือ> นำเข้าโดยตรง)
  5. ตรวจสอบว่ามีเนื้อหาอยู่ในประเภทโพสต์ใหม่แล้วลบเนื้อหาเก่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.