我如何让每个人都能看到一篇选秀帖子?

时间:2013-07-18 作者:Amal Murali

我有几个unpublished 在我的Wordpress网站上发布帖子,我正试图让普通用户(未登录的用户)可以使用普通的帖子slug访问它(site.com/post-here). 我知道这可能不是最好的做法,但出于我的特殊目的,这需要做到。

我已尝试将以下代码段添加到functions.php 文件:

function enable_view_drafts() {
$role = get_role( \'subscriber\' ); 
$role->add_cap( \'read_private_posts\' ); 
$role->add_cap( \'edit_posts\' );
}
add_action( \'after_setup_theme\', \'enable_view_drafts\');
我也试过了init 钩子代替after_setup_theme. 没有运气。

我的理解是,对角色的更改会保存到数据库中,因此只需执行一次。这就是我使用after_setup_theme 钩子调用函数。

但是,当我尝试以普通用户的身份访问该页面时,会显示一个404页面,而不是显示帖子内容。我还尝试加载预览URL(site.com/?p=212&preview=true) 但这也没用。

以下是我的猜测:

普通用户没有足够的caps 阅读草稿帖子为了完成我要做的事情,我需要做哪些改变?如果不可能,您建议什么替代解决方案?

Note: 我不是在寻找基于插件的解决方案。

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

无法将功能分配给未知用户。如果要使帖子对所有人可见,请为这些帖子创建一个单独的URL,并向帖子编辑器添加一个控件元素,以便仅对选定帖子启用预览
调用此类URL时,请检查是否允许预览帖子,以及帖子是否尚未发布。还要确保搜索引擎忽略此URL。

对于URL,我将使用endpoint:

add_rewrite_endpoint( \'post-preview\', EP_ROOT );
现在您可以创建URL,如…

http://example.com/post-preview/123
…在哪里123 列出帖子ID。

然后使用回调处理程序检查post ID,检查其是否有效,并覆盖主查询。这可能是query_posts(). :)

假设端点是一个类T5_Endpoint (一个模型),而输出处理程序是一个类T5_Render_Endpoint (一个视图),该视图获取先前传递的模型。那么可能有一种方法render() 已调用template_redirect:

public function render()
{
    $post_id = $this->endpoint->get_value();

    if ( ! $post_id )
        return;

    if ( 1 !== $this->meta->get_value( $post_id )
        or \'publish\' === get_post_status( $post_id )
        )
    {
        wp_redirect( get_permalink( $post_id ) );
        exit;
    }

    $query = array (
        \'suppress_filters\' => TRUE,
        \'p\'                => $post_id,
        \'post_type\'        => \'any\'
    );

    query_posts( $query );

    add_action( \'wp_head\', \'wp_no_robots\' );
}
$this->meta 是另一个模型(类T5_Post_Meta) 用于控制是否允许预览的post meta值。控件设置为Publish 盒子(action post_submitbox_misc_actions), 由另一个获取相同元类的视图呈现。

screen shot

所以T5_Post_Meta 知道在何处和何时存储元值,视图会对其进行处理
此外,hook into transition_post_status 发布帖子时删除帖子元字段。我们不想浪费资源,对吧?

这只是一个提纲。有很多细节需要涵盖……我编写了一个小插件,展示了如何实现这一点:T5 Public Preview.

SO网友:goldenapples

我用我认为比上面的@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”。这将返回归档列表中的草稿帖子

SO网友:Georgi Demirev

我认为WordPress提供了“用户角色编辑器”插件。org的网站可能就是你要找的。顺便问一下,为什么你想让每个人都可以访问你的草稿?我个人想不出有哪种情况需要这样做。

SO网友:TomC

我认为G.M.的评论是这里最好的。我假设您正在尝试执行以下操作:

写一篇文章另存为草稿允许外部(未登录)用户查看草稿以供批准是否正确?

不幸的是,我想不出任何简单的方法来做到这一点。您可以将其作为私人帖子发布,以便他们需要输入密码才能查看它,但您需要为此登录。你也可以用密码保护它,但它仍然会出现在你的订阅源和最近的帖子列表中,等等。你能不能在给他们URL时创建一个来宾用户帐户并给他们用户名/密码?

阅读此处了解更多信息:http://codex.wordpress.org/Content_Visibility

或者,有一个插件可以满足您的需要:http://wordpress.org/extend/plugins/shareadraft/我快速查看了代码,似乎开发人员正在修改get\\u post\\u status返回的值,以便您可以使用它:

http://codex.wordpress.org/Function_Reference/get_post_status

HTH公司

SO网友:NickJAB

您只需将页面/帖子上的可见性更改为“私有”,这只对编辑和管理员可见,而对公众访问者、搜索引擎、rss提要等不可见。

结束