カスタム投稿タイプの名前を安全に変更するにはどうすればよいですか?


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

ラベルだけ?私はあなたが何を言っているのか正確にはわかりませんが、全体を通してそれを徹底的に変更したいと思います。
デジ

回答:


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

プラグインは2年間更新されていません。
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'

注意すべき2つのこと:

  1. コード内のこの投稿タイプへの参照(テンプレート、CMB2定義、分類法定義など)を更新する必要があります。
  2. wp_postmetaシリアル化された配列内にこの投稿タイプへの参照を保存している場合、単純なUPDATE / REPLACEを実行したくないでしょう。さて、新旧両方の投稿タイプ文字列がまったく同じ長さでない限り。

6

Willの答えをもう少し拡張します。特に、プラグインから行う場合:

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!


3

WordPressデータベースクエリを使用しますが、シリアル化されたオプションデータを忘れないでください

私のために働いた方法は、WordPressデータベース内で検索と置換を行うことでしたが、プロセス中にシリアル化されたオプションデータを台無しにしないようにしました。私が見つけた最良の方法は、安全な検索を使用して、interconnect / itからデータベースユーティリティを置き換えることです。ただ決してしないSETpost_typeの= REPLACE(post_typeの,'old_post_type','new_post_type')あなたがやっているか、チェックサムを保つため、シリアル化されたデータが破壊されると、正しくアンシリアライズすることができなくなるか知らなくてもタイプのクエリを。

盲目的にこれに従う前に、潜在的な問題のセクションをお読みください

ステップ1-新しい名前でデータベースを安全に更新する

  1. 以下の変更が破損する可能性が非常に高いため、データベースをバックアップします。
  2. セーフサーチをダウンロードして解凍し、interconnect / itからデータベースユーティリティを置き換えます
  3. 抽出したディレクトリをwebrootに追加します(サブディレクトリでも機能します)
  4. ディレクトリを参照します。例:/mywebsite.com/path/to/utility/directory/
  5. 指示に従ってください。パロノイドである場合は「ドライラン」をクリックして変更を確認します(変更された投稿タイプの投稿が数件ある場合は数百になります)
  6. 「ライブラン」をクリックして、変更を確定します。
  7. セキュリティ上の問題があるため、ワードプレスのディレクトリから安全な検索ディレクトリを削除します

ステップ2-パーマリンクをリセットする

パーマリンクを使用している場合、データベースの更新により、カスタム投稿タイプへのリダイレクトが台無しになります。ただし、簡単な修正方法があります。WordPressの設定/パーマリンクに移動して、現在の設定を確認してください(私の名前は「投稿名」でした)。次に、デフォルトに切り替え、「保存」をクリックしてから、前の設定に戻り、再度保存します。リダイレクトの問題を修正しました。

ステップ3-テーマのカスタム投稿タイプテンプレートの名前を変更する

あなたが私のような人で、カスタム投稿タイプのテンプレートを作成した場合は、これらの名前を変更する必要があります。そうしないと、カスタム投稿がめちゃくちゃになります。テーマに移動して、ファイル名に古い投稿タイプ名が含まれているファイルを見つけ、新しい投稿名を使用してファイル名を変更します。たとえば、投稿タイプをからに変更single-project-portfolio.phpしたsingle-before-after.phpときはに変更する必要がありました。project-portfoliobefore-after

ステップ5-コードを更新する

ファイル検索を実行し、テーマとプラグインフォルダー内の古いカスタム投稿タイプ名を置き換えます。私にとっては、カスタムポストタイプの1つを使用しているかどうかを判断することに依存するカスタムショートコードがいくつかありました。

すべてをテストする

潜在的な問題(この手順を開始する前に読んでください)

シンジケーションの問題

カスタムの投稿タイプがシンジケートされた場合、最初の検索と置換によって投稿のGUIDも変更されるため、すべてのサブスクライバーが古い投稿を新しい投稿として表示することになります。これに対処する必要はありませんでしたが、必要な場合は、safesearchユーティリティが処理するテーブルを手動で選択し、次のクエリを使用して非シリアル化データを手動で更新することを検討してください。

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

これらすべてをリストするのは非常にきちんとしている。guidを忘れたため、最後のsqlクエリは完全ではありませんが、それらはWills answerにリストされています。プラス私は行かないだろうWHERE 'post_type' LIKE '%old_post_type%'、私が使用することになり、WHERE 'post_type' = 'old_post_type'あなたの方法にもいくつかの他のポストタイプの原因..変更する可能性があるので、
honk31

0

コメントする評判がありませんので、これをここに掲載します。Willの例を拡張します。LIKEを「=」に変更し、両方がWHEREを指すようにしました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」メタおよびパーマリンクフィールド内)
  3. 編集した.xmlと同じ名前で新しい投稿タイプを作成します(ただし、失敗した場合に備えて古い投稿タイプを保持します)
  4. 編集した.xmlファイルをWordpressインポーターからインポートします(プラグインは[ツール]> [インポート]から直接利用可能)
  5. コンテンツが新しい投稿タイプに存在することを確認してから、古い投稿を削除します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.