Bagaimana cara mengubah nama jenis posting khusus dengan aman?

19

Saya membuat jenis pos kustom yang disebut 'portofolio' tetapi saya ingin mengubahnya menjadi 'proyek'. Apa langkah tepat yang harus saya ambil untuk mengubah nama dengan aman dan mencegah posting tipe posting kustom menghilang di dasbor?

Catatan: Sudah ada posting di portfoliojadi saya tidak bisa hanya beralih portfoliodengan 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;
    }
}
Desi
sumber
bagaimana kalau mengganti label saja?
Bainternet
Hanya labelnya? Saya tidak yakin persis apa yang Anda maksudkan tetapi saya lebih suka mengubahnya secara menyeluruh.
Desi

Jawaban:

2

Jika Anda belum memiliki pos di portofolio Anda.

Itu akan sangat sederhana. Ganti nama semuanya dengan "Portofolio" menjadi "Proyek". Anda tidak akan kehilangan apa pun dan mengubah nama.

Edit:

Coba gunakan plugin ini http://wordpress.org/extend/plugins/ptypeconverter/ untuk mengekspor posting saat ini dengan aman dan mengimpornya ke jenis posting kustom baru Anda.

Jadi langkah-langkahnya adalah:

1 Unduh dan gunakan plugin: http://wordpress.org/extend/plugins/ptypeconverter/

2 Salin file "portofolio" jenis pos kustom Anda di suatu tempat simpan. sebut saja misalnya portfolio_post_typeBACKUP.php

3 Sekarang Anda yakin ketika metode ini gagal. Anda dapat memulihkannya.

4 Ubah " portofolio " menjadi " proyek "

5 Impor posting dengan plugin dan biola!

Semoga ini berhasil.

Wesley Cheung
sumber
Ah, maaf seharusnya sudah disebutkan. Sudah ada banyak posting portfolio.
Desi
saya mengedit jawabannya. semoga berhasil!
Wesley Cheung
Ini adalah plugin yang luar biasa!
realph
1
plugin ini sudah tidak berfungsi dengan baik lagi. saya mencobanya dan tidak mengubah semua jenis posting 'lama'. tetapi solusi mysql (dijawab oleh Will) berfungsi dengan baik.
honk31
Plugin belum diperbarui dalam dua tahun.
ulas
18

Anda dapat melakukan ini secara langsung dengan MySQL juga.

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'

Dua hal yang perlu diperhatikan:

  1. Anda harus memperbarui referensi untuk jenis posting ini dalam kode Anda (misalnya, templat, definisi CMB2, atau definisi taksonomi).
  2. Jika Anda telah menyimpan referensi untuk jenis posting ini di wp_postmetadalam array serial, Anda tidak ingin melakukan UPDATE / REPLACE sederhana karena itu akan meledakkan mereka! Yah, kecuali kedua string tipe posting baru dan lama memiliki panjang yang sama persis.
Akan
sumber
7

Memperluas jawaban Will sedikit lebih jauh ..., dan terutama jika Anda melakukannya dari plugin Anda:

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

Perubahan di sini adalah untuk tidak mengganti tipe lama dalam panduan secara langsung, tetapi ganti hanya jika "post_type = old_type" atau "/ old_type /" ada. Ini menghindari kesalahan penggantian siput yang valid. (mis. jenis pos kustom Anda adalah portofolio, dan siput halaman juga memiliki portofolio di dalamnya)

Alternatif lain adalah melakukan sesuatu seperti ini:

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!

Nirav Mehta
sumber
Terima kasih. Ini bekerja. Satu hal kecil: bagian terakhir dari kueri kedua dalam loop harus "% post_type = {$ old_type}%", bukan "% post_type = {$ type}%".
Betty
3

Gunakan Kueri Basis Data WordPress tetapi Jangan Lupa Tentang Data Opsi Serius

Metode yang bekerja untuk saya adalah melakukan pencarian dan penggantian dalam database WordPress, tetapi pastikan untuk tidak mengacaukan data opsi serial dalam proses. Cara terbaik yang saya temukan adalah menggunakan pencarian aman dan mengganti utilitas basis data dari interkoneksi / itu . Jangan sekali-kali melakukan kueri tipe SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')tanpa mengetahui apa yang Anda lakukan atau data serial akan terputus karena ia menyimpan checksum dan tidak akan dapat di-unserialize dengan benar.

Baca bagian Masalah Potensial sebelum secara membabi buta mengikuti ini

Langkah 1 - Perbarui Database Anda dengan Aman dengan Nama Baru

  1. backup database Anda karena perubahan berikut memiliki potensi yang sangat nyata untuk merusaknya.
  2. unduh dan unzip pencarian aman dan ganti utilitas basis data dari interkoneksi / itu
  3. tambahkan direktori yang diekstrak ke webroot Anda (ini juga berfungsi di subdirektori)
  4. browse ke direktori, misalnya: / mywebsite.com/path/to/utility/directory/
  5. ikuti arah. klik 'dry-run' jika Anda paronoid untuk melihat perubahan (akan ada ratusan jika Anda bahkan memiliki beberapa posting dari jenis posting yang diubah)
  6. klik 'live run' untuk menyelesaikan perubahan.
  7. hapus direktori pencarian aman dari direktori wordpress Anda karena ini merupakan masalah keamanan

Langkah 2 - Setel Ulang Permalink Anda

Jika Anda menggunakan permalinks, pembaruan ke basis data Anda akan mengacaukan pengalihan Anda ke jenis posting khusus Anda. Ada perbaikan yang mudah, hanya masuk ke pengaturan WordPress / permalinks dan perhatikan pengaturan saat ini (milik saya adalah 'nama posting'). Kemudian beralih kembali ke default, klik 'simpan', lalu kembali ke pengaturan sebelumnya, lalu simpan lagi. Anda baru saja memperbaiki masalah pengalihan Anda.

Langkah 3 - Ganti Nama Template Jenis Posting Kustom Tema Anda

Jika Anda seperti saya, dan Anda membuat templat jenis kiriman khusus, Anda harus mengganti namanya atau kiriman khusus Anda akan terlihat kacau. Masuk saja ke tema Anda dan temukan file apa pun yang memiliki nama tipe posting lama di nama file-nya dan ganti nama file menggunakan nama posting baru Anda. Sebagai contoh, saya harus mengubah single-project-portfolio.phpke single-before-after.phpketika saya mengubah jenis posting saya dari project-portfolioke before-after.

Langkah 5 - Perbarui Kode Apa Saja

Lakukan pencarian file dan gantilah nama jenis pos kustom lama di folder tema dan plugin. Bagi saya, saya memiliki beberapa shortcode khusus yang bergantung pada pengambilan keputusan apakah saya menggunakan salah satu jenis posting kustom saya.

Uji Segalanya

Masalah Potensial (baca sebelum memulai prosedur ini)

Masalah Sindikasi

Jika jenis posting khusus Anda disindikasikan, sadari bahwa pencarian dan penggantian awal Anda juga akan mengubah panduan posting Anda, yang akan memaksa semua pelanggan untuk melihat posting lama sebagai yang baru. Saya tidak harus berurusan dengan ini, tetapi jika Anda perlu, maka pertimbangkan untuk memilih secara manual tabel yang proses utilitas safeSearch, kemudian secara manual memperbarui data non-serial menggunakan permintaan berikut:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';
AndrewD
sumber
sangat rapi untuk mendaftar semua ini. kecuali permintaan sql pada akhirnya tidak lengkap, karena Anda lupa tentang panduan, tetapi mereka terdaftar dalam jawaban Wills. ditambah saya tidak akan pergi dengan WHERE 'post_type' LIKE '%old_post_type%', saya akan menggunakan WHERE 'post_type' = 'old_post_type', karena cara Anda juga dapat menyebabkan beberapa jenis postingan lainnya, untuk berubah ..
honk31
0

Saya tidak memiliki reputasi untuk berkomentar jadi saya akan menempatkan ini di sini. Memperluas contoh Will. Saya mengubah LIKEs menjadi "=" dan minta keduanya menunjuk ke MANApost_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'

Ingat juga untuk masuk ke Admin> Pengaturan> Permalinks dan tekan "Simpan Perubahan". Kalau tidak, tautan Anda kemungkinan akan rusak.

Anda juga perlu mengedit nama templat 'jenis tunggal'.

Ini yang harus Anda lakukan.

Bullyen
sumber
0

Inilah cara yang sangat sederhana:

  1. Jalankan Eksportir Wordpress (Alat> Ekspor) - hanya ekspor jenis posting yang ingin Anda ubah namanya
  2. Buka file .xml yang dihasilkan dan ganti semua sebutan nama jenis posting lama dengan nama baru (dalam meta "custom_post_type" serta di bidang permalink)
  3. Buat jenis posting baru Anda dengan nama yang sama dengan di .xml yang diedit (tapi tetap yang lama kalau-kalau gagal)
  4. Impor file .xml yang diedit melalui Wordpress importir (plugin tersedia langsung dari Tools> Import)
  5. Periksa apakah konten ada dalam jenis posting baru dan kemudian hapus yang lama
Dagobert Renouf
sumber