如何在WordPress循环中排除受密码保护的帖子

时间:2011-09-24 12:19:29

标签: wordpress

我有一个支持密码保护条目的自定义帖子类型。在使用新WP_Query对象的自定义循环中,我想从结果中排除那些受密码保护的帖子。为了做到这一点,我需要设置什么参数?我正在使用WordPress 3.2.1的最新主干版本。

5 个答案:

答案 0 :(得分:8)

我真的很喜欢凯文的方法,但我稍微调整了一下:

// Create a new filtering function that will add our where clause to the query
function my_password_post_filter( $where = '' ) {
    // Make sure this only applies to loops / feeds on the frontend
    if (!is_single() && !is_admin()) {
        // exclude password protected
        $where .= " AND post_password = ''";
    }
    return $where;
}
add_filter( 'posts_where', 'my_password_post_filter' );

答案 1 :(得分:7)

我提出这个问题,我在寻找同样的问题。但是,我逐行读取WP_Query文档然后找到了非常简单的解决方案,这只是为查询添加'has_password' => false参数$args

所以代码如下......

$args  = [
    'post_type'      => [ 'post', 'page' ],
    'posts_per_page' => 3,
    'post__not_in'   => get_option( 'sticky_posts' ),
    'has_password'   => FALSE
];

在这里,您可以看到我排除了StickyPassword Protected个帖子。

答案 2 :(得分:1)

您是否看过WP_Query的post_status argument

“受保护”似乎是排除的好选择。

编辑: 好的,您似乎必须修改where子句才能实现您的目标:

// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
    // exclude password protected
    $where .= " AND post_password = ''";
    return $where;
}

if (!is_single()) { add_filter( 'posts_where', 'filter_where' ); }
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );

答案 3 :(得分:1)

经过一段时间的游戏,我发现posts_where过滤器对我想做的事情有点过于干扰,所以我提出了一个替代方案。作为我为自定义帖子类型附加的“save_post”操作的一部分,我添加了以下逻辑;

$visibility = isset($_POST['visibility']) ? $_POST['visibility'] : '';
$protected  = get_option('__protected_posts', array());

if ($visibility === 'password' && !in_array($post->ID, $protected)) {
    array_push($protected, $post->ID);
}
if ($visibility === 'public' && in_array($post->ID, $protected)) {
    $i = array_search($post->ID, $protected);
    unset($protected[$i]);
}
update_option('__protected_posts', $protected);

这样做是在选项表中保存一个帖子ID数组,其中帖子受密码保护。然后在自定义查询中,我只是将此数组作为post__not_in选项的一部分传递,例如。

$query = new WP_Query(array(
    'post_type' => 'my_custom_post_type',
    'post__not_in' => get_option('__protected_posts'),
));

这样我可以从存档页面中排除受保护的帖子,但仍允许用户登陆受密码保护的页面输入密码。

答案 4 :(得分:1)

除了@Peter Chester的回答:

您可能还希望从Previous PostNext Post链接中排除受密码保护的帖子,如果您的帖子页面底部有这些帖子。

为此,您可以将排除项添加到get_previous_post_whereget_next_post_where挂钩。

add_filter( 'get_previous_post_where', 'my_theme_mod_adjacent' );
add_filter( 'get_next_post_where', 'my_theme_mod_adjacent' );
function my_theme_mod_adjacent( $where ) {
    return $where . " AND p.post_password = ''";
}