您描述的需求需要更多的解释,而不是这里真正适合的解释。一个简单的解决方案可能是通过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,这是您在开发主题和插件代码时应该始终渴望做的事情。