如何合并两个或更多的WordPress帖子?

时间:2012-09-06 作者:Ciprian

我需要能够合并两个或更多的职位。实现这一点的确切查询是什么?

场景是需要将多个建议合并为一个。我已经整理好了评论合并和元合并。

假设用户推荐Bill Gates, 另一个Gates Bill 另一个输入错误并添加Bil Gates. 我需要合并这三篇文章并选择目标文章。

UPDATE:

我需要的是一个完整的SQL查询,用于删除帖子和对该帖子的所有引用。类似于以下伪代码:

DELETE FROM wp_posts WHERE id = X;
DELETE FROM wp_posts_meta WHERE id = X;
DELETE FROM wp_another_table WHERE id = X;
DELETE FROM wp_yet_another_table WHERE id = X;
其中X是我帖子的ID。

代码(或插件)不应自动检测重复项。我将向用户提供一个下拉列表,其中包含帖子列表和“删除”选项。删除之前,我将使用SQL更新查询将帖子内容从一篇帖子复制到另一篇帖子。

UPDATE 2:

我想我找到了什么,但我必须检查一下:

    $custom_field_keys = get_post_custom_keys($postid);
    foreach($custom_field_keys as  $key => $value) {
        $valuet = trim($value);
        if(\'_\' != $valuet{0} ){
               delete_post_meta($postid, $key, \'\');
        }
   }
   $result = wp_delete_post($postid);

1 个回复
最合适的回答,由SO网友:Bendoh 整理而成

您描述的需求需要更多的解释,而不是这里真正适合的解释。一个简单的解决方案可能是通过post屏幕上的元框将重复的帖子标记为重复。这个元框将有一个输入:对另一篇文章的引用。

看看这个tutorial on how to build a custom meta box.

假设您设置了一个元框,允许用户将一篇文章标记为另一篇文章的副本。假设重复的帖子用元键标记_duplicate_of_post, 其元值是规范帖子的帖子ID。

然后您可以使用过滤器the_posts 过滤器将所有副本放在一起,将规范帖子及其任何副本折叠在一起:

function my_the_posts_filter( $posts, $query ) {
    // Only operate on the main query.
    if( !$query->is_main_query() )
         return $posts;

    // Store canonical posts here. 
    $canonicals = array();

    // Store the duplicates here, keyed by canonical post ID
    $duplicates = array();

    foreach( $posts as $post ) {
        if( $dupe_id = get_post_meta( $post->ID, \'_duplicate_of_post\', true ) ) {
           $canonicals[] = get_post( $dupe_id ); 

           $duplicates[$dupe_id] = get_posts( array( \'meta_key\' => \'_duplicate_of_post\', \'meta_value\' => $dupe_id, \'posts_per_page\' => -1, \'post__not_in\' => $post->ID ) );
        }
        else {
           $canonicals[] = $post;

           // Get all posts who have this marked as duplicate
           $duplicates[$post->ID] = get_posts( array( \'meta_key\' => \'_duplicate_of_post\', \'meta_value\' => $post->ID, \'posts_per_page\' => -1 ) );
        }
    }

    // Append all of the other post content to the canonicals separated
    // by two newlines
    foreach( $canonicals as $post )
       $post->post_content .= array_join( "\\n\\n", wp_list_pluck( $duplicates[$dupe_id], \'post_content\' ) );

    return $canonicals;
}
add_filter( \'the_posts\', \'my_the_posts_filter\', 10, 2 );
在实现post引用元框时需要注意的一点是,如果一篇帖子已经被另一篇帖子标记为“master”帖子,则必须实现逻辑,以确保不能将其设置为重复帖子。如果没有这一限制,上述示例将以意想不到的方式中断。

Update

你也可以save_post, 合并,然后标记为重复的垃圾桶:

function my_save_post( $post ) {
    // Don\'t do on autosave
    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;

    if( isset( $_POST[\'_duplicate_of_post\'] ) && ( $dupe_of_id = (int) $_POST[\'_duplicate_of_post\'] ) && ( $source = get_post( $dupe_of_id ) ) ) {  
       // Add this post\'s content to the canonical version               
       $update = array( \'ID\' => $source->ID, \'post_content\' => $source->post_content );
       $update[\'post_content\'] .= "\\n\\n" . $post->post_content;

       // Update canonical
       wp_update_post( $update );

       // Trash this post
       wp_trash_post( $post->ID );
    }
}
add_action( \'save_post\', \'my_save_post\' );
这是最基本的例子。在编辑帖子屏幕上需要一个名为_duplicate_of_post 其中包含规范帖子的ID。请注意,我只使用WordPress API,这是您在开发主题和插件代码时应该始终渴望做的事情。

结束

相关推荐

Match two posts in categories

我有博客帖子,每一篇都有三个或三个以上的类别。问题是我需要搜索相关帖子,我必须匹配至少两个类别,即必须有两个常见类别。我正在使用此查询: $args = wp_parse_args($args, array( \'showposts\' => 10, \'post__not_in\' => array($post_id), \'ignore_sticky_posts\' => 1, \'category__in\' =&