我用我认为比上面的@toscho的答案更简单的方法解决了这个问题。
我的用例是,我对内部intranet临时站点和面向公众的站点使用相同的数据库,工作流是作者编写草稿,并在发布之前与在intranet站点上查看这些草稿的其他用户共享。我特别不想要求审阅者登录以查看草稿,所以我只依赖一个常量,ENV_PRODUCTION
根据中的主机名在wp配置文件中设置$_SERVER[\'SERVER_NAME\']
. 这就是支票的目的ENV_PRODUCTION
在这里做;如果正在查看生产站点,只需缩短所有这些过滤器。
这有点奇怪,因为您必须在WP\\u Query从$WP\\u Query->posts数组中删除所有帖子之后才能加入,但对我来说,这似乎是稳定和安全的。
/*
* On staging site home and archives, drafts should be visible.
*/
function show_drafts_in_staging_archives( $query ) {
if ( ENV_PRODUCTION )
return;
if ( is_admin() || is_feed() )
return;
$query->set( \'post_status\', array( \'publish\', \'draft\' ) );
}
add_action( \'pre_get_posts\', \'show_drafts_in_staging_archives\' );
/*
* Make drafts visible on staging site single views.
*
* (Because on single views, WP_Query goes through logic to make sure the
* current user can edit the post before displaying a draft.)
*/
function show_single_drafts_on_staging( $posts, $wp_query ) {
if ( ENV_PRODUCTION )
return $posts;
//making sure the post is a preview to avoid showing published private posts
if ( ! is_preview() )
return $posts;
if ( count( $posts ) )
return $posts;
if ( !empty( $wp_query->query[\'p\'] ) ) {
return array ( get_post( $wp_query->query[\'p\'] ) );
}
}
add_filter( \'the_posts\', \'show_single_drafts_on_staging\', 10, 2 );
过滤器有两个独立的部分。
“pre\\u get\\u posts”挂钩上的过滤器将临时站点上的默认post\\u状态设置为“publish,draft”。这将返回归档列表中的草稿帖子对于单个视图,需要一个单独的过滤器,因为WP\\u查询类中有一些令人讨厌的逻辑,可以从查询结果中删除草稿帖子,除非当前用户可以编辑它们。我通过过滤“the\\u posts”并将我想要的帖子直接添加到结果中来解决这个问题