Özel bir gönderi türünün adını nasıl güvenli bir şekilde değiştirebilirim?


19

'Portföy' adı verilen özel bir yazı türü yaptım ancak onu 'projeler' olarak değiştirmek istiyorum. Adı güvenli bir şekilde değiştirmek ve özel yazı türü yayınların kontrol panelinde kaybolmasını önlemek için atmam gereken tam adımlar nelerdir?

Not: gönderileri zaten var portfolioben sadece dışarı geçemezsiniz böylece portfolioile 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;
    }
}

sadece etiketleri değiştirmeye ne dersiniz?
Bainternet

Sadece etiketler mi? Ne demek istediğinizden tam olarak emin değilim ama bunu baştan sona değiştirmeyi tercih ederim.
Desi

Yanıtlar:


2

Portföyünüzde henüz hiç yayın yoksa.

Gerçekten çok basit olurdu. "Portföy" ile her şeyi "Projeler" olarak yeniden adlandırın. Hiçbir şey kaybetmeyecek ve adını değiştireceksiniz.

Düzenle :

Mevcut yayınları güvenle dışa aktarmak ve yeni özel yayın türünüze aktarmak için bu eklentiyi http://wordpress.org/extend/plugins/ptypeconverter/ kullanmayı deneyin .

Yani adımlar:

1 Eklentiyi indirin ve kullanın: http://wordpress.org/extend/plugins/ptypeconverter/

2 Özel yazı tipi "portföy" dosyanızı bir yere kaydedin. örneğin portföy_post_türüBACKUP.php

3 Şimdi bu yöntemin ne zaman başarısız olacağından eminsiniz. onu kurtarabilirsin.

4 " Portföy " ü " projeler " olarak değiştirin

5 Eklenti ve viyola ile yayınları içe aktarın!

Umarım bu işe yarar.


Ah, özür dilerim. portfolioŞimdiden çok sayıda yayın var .
Desi

Cevabı düzenledim. iyi şanslar!
Wesley Cheung

Bu harika bir eklenti!
realph

1
bu eklenti artık düzgün çalışmıyor. denedim ve tüm 'eski' yazı türlerini değişmedi. ancak mysql çözümü (Will tarafından cevap) iyi çalışıyor.
honk31

Eklenti iki yıldır güncellenmedi.
rhand

18

Bunu doğrudan MySQL ile de yapabilirsiniz.

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'

Dikkat edilmesi gereken iki şey:

  1. Kodunuzdaki bu yazı türüne ilişkin referansları güncellemeniz gerekir (örneğin, şablonlar, CMB2 tanımları veya sınıflandırma tanımları).
  2. Bu yazı türüne herhangi bir referansı wp_postmetaserileştirilmiş diziler içinde sakladıysanız, onları patlatacağı için basit bir GÜNCELLEME / DEĞİŞTİRME yapmak istemezsiniz! Hem yeni hem de eski yazı tipi dizeleri tam olarak aynı uzunlukta değilse.

7

Will'in cevabını biraz daha genişletmek ... ve özellikle eklentinizden yapıyorsanız:

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

Buradaki değişiklik, doğrudan kılavuzdaki eski türün yerini almaz, ancak yalnızca "post_type = old_type" veya "/ old_type /" varsa değiştirir. Bu, geçerli salyangozların yanlışlıkla değiştirilmesini önler. (örneğin, özel posta türünüz portföydür ve bir sayfanın bilgi sayfasında da portföy bulunur)

Başka bir alternatif, böyle bir şey yapmaktır:

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!


Teşekkürler. Bu çalışıyor. Küçük bir şey: döngüdeki ikinci sorgunun son kısmı "% post_type = {$ type}%" değil, "% post_type = {$ old_type}%" olmalıdır.
Betty

3

WordPress Veritabanı Sorgusu Kullanın, ancak Seri Seçenek Verilerini Unutmayın

Benim için çalışan yöntem, WordPress veritabanı içinde bir arama yapmak ve değiştirmek, ancak işlemdeki serileştirilmiş seçenek verilerini kesmemeyi sağlamaktı. Bulduğum en iyi yol güvenli aramayı kullanmak ve interconnect / it'den veritabanı yardımcı programını kullanmaktır . Asla sadece ne yaptığınızı bilmeden SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')tipinde bir sorgu yapmayın ya da seri hale getirilmiş veriler bir sağlama toplamını koruduğu ve doğru şekilde serileştiremeyeceği için kesilecektir.

Bunu körü körüne takip etmeden önce Potansiyel Sorunlar bölümünü okuyun

Adım 1 - Veritabanınızı Yeni Adla Güvenle Güncelleyin

  1. Aşağıdaki değişikliklerin onu bozma potansiyeli çok yüksek olduğundan veritabanınızı yedekleyin.
  2. güvenli aramayı indirip sıkıştırın ve veritabanı yardımcı programını interconnect'den değiştirin / it
  3. ayıklanan dizini web kökünüze ekleyin (alt dizinlerde de çalışır)
  4. dizine göz atın, örneğin: /mywebsite.com/path/to/utility/directory/
  5. yönergeleri takip et. değişiklikleri görmek için paronoid iseniz 'kuru çalıştırma' seçeneğini tıklayın (değiştirilen gönderi türünden birkaç gönderiniz olsa bile yüzlerce tane olacak)
  6. değişiklikleri tamamlamak için 'canlı yayın'ı tıklayın.
  7. güvenli arama dizinini bir güvenlik sorunu olduğundan wordpress dizininizden kaldırın

Adım 2 - Kalıcı Bağlantılarınızı Sıfırlayın

Kalıcı bağlantılar kullanıyorsanız, veritabanınızdaki güncellemeler yönlendirmelerinizi özel posta türlerinize bağlar. Ancak kolay bir düzeltme var, sadece WordPress ayarlarına / kalıcı bağlantılarına gidin ve mevcut ayarı not edin (benimki 'posta adı'). Ardından varsayılana geri dönün, 'kaydet'i tıklayın, ardından önceki ayara geri dönün ve tekrar kaydedin. Yönlendirme sorunlarınızı çözdünüz.

3. Adım - Temanızın Özel Yazı Türü Şablonlarını Yeniden Adlandırma

Benim gibiyseniz ve özel yazı türü şablonları oluşturduysanız, bunları yeniden adlandırmanız gerekir, aksi takdirde özel yayınlarınız berbat görünecektir. Temanıza gidin ve dosya adında eski yazı türü adınız olan herhangi bir dosyayı bulun ve yeni posta adınızı kullanarak dosyayı yeniden adlandırın. Örneğin, ben değiştirmek zorunda single-project-portfolio.phpiçin single-before-after.phpben benim yazı alanı değişince project-portfolioiçin before-after.

5. Adım - Herhangi Bir Kodu Güncelleyin

Bir dosya araması yapın ve tema ve eklentiler klasöründeki eski özel gönderi türü adınızı değiştirin. Benim için, özel posta türlerimden birini kullanıp kullanmadığım konusunda karar vermeye dayanan birkaç özel kısa kodum vardı.

Her Şeyi Test Edin

Olası Sorunlar (bu prosedüre başlamadan önce okuyun)

Sendikasyon Sorunları

Özel yayın türleriniz ortak kullanıma sunulduysa, ilk arama ve değiştirme işlemlerinizin yayınlarınızın kılavuzlarını da değiştireceğini unutmayın; bu, tüm aboneleri eski yayınları yeni yayınlar olarak görmeye zorlar. Bununla uğraşmak zorunda kalmadım, ancak gerekirse, daha sonra güvenli arama yardımcı programının işlediği tabloları seçip, ardından aşağıdaki sorguyu kullanarak herhangi bir serileştirilmemiş veriyi manuel olarak güncelleştirmeyi düşünün:

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

Tüm bunları listelemek çok temiz. sonunda sql sorgusu tamamlanmadı, çünkü kılavuzu unuttun, ancak Wills cevabında listeleniyorlar. artı ben gitmek olmaz WHERE 'post_type' LIKE '%old_post_type%', ben kullanmak istiyorum WHERE 'post_type' = 'old_post_type', çünkü yolunuzu değiştirmek için bazı diğer yazı türlerine neden olabilir ..
honk31

0

Yorum yapabileceğim bir şöhretim yok, bu yüzden buraya koyacağım. Will'in örneğini genişletmek. LIKE'leri "=" olarak değiştirdim ve ikisini de NEREDE işaret ettimpost_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'

Ayrıca Yönetici> Ayarlar> Kalıcı Bağlantılar'a girmeyi ve "Değişiklikleri Kaydet" i tıklamayı da unutmayın. Aksi takdirde bağlantılarınız kesilecektir.

Ayrıca, 'tek yazı tipi' şablon adlarını da düzenlemeniz gerekir.

Tüm yapmanız gereken bu olmalı.


0

İşte gerçekten basit bir yol:

  1. Wordpress Exporter'ı (Araçlar> Dışa Aktar) çalıştırın - yalnızca adını değiştirmek istediğiniz posta türünü dışa aktarın
  2. Oluşturulan .xml dosyasını açın ve eski yazı türü adının tüm sözlerini yeni adla değiştirin ("custom_post_type" meta alanında ve kalıcı bağlantı alanında)
  3. Yeni yazı türünüzü düzenlenen .xml ile aynı ada sahip olarak oluşturun (ancak başarısız olması durumunda eskisini de saklayın)
  4. Düzenlenen .xml dosyasını Wordpress İçe Aktarıcı aracılığıyla içe aktarın (eklenti doğrudan Araçlar> İçe Aktarma'dan edinilebilir)
  5. İçeriğin yeni gönderi türünde bulunduğunu kontrol edin ve ardından eskisini kaldırın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.