web-dev-qa-db-ja.com

特定のカテゴリのカスタム投稿タイプを変更するためのクエリ

カスタム投稿タイプを持つ数百の投稿を通常の投稿タイプに変更する必要がありますが、そのカスタム投稿タイプ内の1つのカテゴリからのみです。

だから私はカスタムの投稿タイプ 'フィルム'を持っていて、その投稿タイプの中に私は数十のカテゴリがあります。カテゴリ「監督」を持たない他の「映画」投稿に影響を与えることなく、カテゴリ「監督」を持つカスタム投稿タイプ「映画」から標準の投稿タイプにすべての投稿を変更します。

私は周りを検索し、以下のクエリを使用して投稿タイプ内のすべての投稿を正常に変更する方法を見つけましたが、もっと具体的にする必要があります。

UPDATE  `wp_posts` 
SET  `post_type` =  '<new post type name>' 
WHERE  `post_type` = '<old post type name>';

私は ' 投稿タイプの変換 'のようなプラグインを使ってみましたが、残念ながらカスタム投稿タイプからカテゴリを引き出すことはできません。

私はこれに関するたくさんのドキュメントを読みましたが、私はこの種の仕事に全く新しいので、構文のいくつかに頭を包むのに苦労しています。

2
Kristopher

安全上の理由から、たとえば "functions.php"のように、1つの大きな生のSQL文ではなく、2つの部分に分けてphpで行います。

function wpse160706() {
    $old_post_type = 'films';
    $new_post_type = 'post';
    $category_slug = 'directors';
    $taxonomy = 'category';

    global $wpdb;
    $sql = $wpdb->prepare( 'SELECT p.ID FROM ' . $wpdb->posts . ' AS p'
        . ' JOIN ' . $wpdb->term_relationships . ' AS tr ON p.ID = tr.object_id'
        . ' JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id'
        . ' JOIN ' . $wpdb->terms . ' AS t ON tt.term_id = t.term_id'
        . ' WHERE p.post_type = %s AND t.slug = %s AND tt.taxonomy = %s'
        , $old_post_type, $category_slug, $taxonomy );
    $post_ids = $wpdb->get_col( $sql );
    print("post_ids=" . implode( ',', $post_ids));
    foreach ( $post_ids as $post_id ) {
        $sql = $wpdb->prepare( 'UPDATE ' . $wpdb->posts
            . ' SET post_type = %s WHERE ID = %d AND post_type = %s'
            , $new_post_type, $post_id, $old_post_type );
        // Uncomment the following if happy that $post_ids correct.
        //$wpdb->query( $sql );
    }
}

それからそれを呼び出して、あなたが望む投稿だけを取得していることを確認してから、データベースなどをバックアップして更新クエリのコメントを外し、一度実行してからwpse160706()呼び出しを削除します。

1
bonger