查询以更改特定类别的自定义帖子类型

时间:2014-09-09 作者:Kristopher

我需要将数百篇具有自定义帖子类型的帖子更改为常规帖子类型,但只能从该自定义帖子类型中的一个类别更改。

所以我有一个自定义的帖子类型“电影”,在这个帖子类型中我有几十个类别。我想做的是将所有贴子从同样包含“导演”类别的自定义贴子类型“电影”更改为标准贴子类型,而不影响其他不包含“导演”类别的“电影”贴子。

我已经四处搜索,找到了一种方法,可以使用下面的查询成功更改某个帖子类型中的所有帖子,但我需要更具体一些。

UPDATE  `wp_posts` 
SET  `post_type` =  \'<new post type name>\' 
WHERE  `post_type` = \'<old post type name>\';
我也尝试过使用诸如\'Convert Post Types\' 但不幸的是,他们没有从自定义帖子类型中提取类别。

我已经阅读了大量关于这方面的文档,但我对这类工作完全陌生,所以我很难理解其中的一些语法。

1 个回复
SO网友:bonger

出于安全考虑,我会在php中分两部分进行,而不是一个大的原始sql语句,例如在“functions.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() 呼叫

结束