隐藏来自wordpress循环的密码保护帖子

时间:2014-04-09 15:11:19

标签: php wordpress

我在codex中找到了这个:

// Filter to hide protected posts
function exclude_protected($where) {
    global $wpdb;
    return $where .= " AND {$wpdb->posts}.post_password = '' ";
}

// Decide where to display them
function exclude_protected_action($query) {
    if( !is_single() && !is_page() && !is_admin() ) {
        add_filter( 'posts_where', 'exclude_protected' );
    }
}

// Action to queue the filter at the right time
add_action('pre_get_posts', 'exclude_protected_action');

但它没有用。也许是因为我已经定制了我的循环。我希望按照这些方式做一些简单的事情:

<?php $postsLatest = get_posts('numberposts=10&passwordproteced=false'); foreach($postsLatest as $post) { ?>

这可能吗?

2 个答案:

答案 0 :(得分:4)

WordPress 3.9 +中的has_passwordpost_password参数

您写道:

  

我希望按照以下方式做一些简单的事情:

passwordproteced=false

你非常接近,因为你可以使用布尔has_password参数:

$postsLatest = get_posts( 'has_password=false' ); 

获取没有密码的帖子。

您可以在Codex for WP_Query()中阅读有关此参数的更多信息,因为get_posts只是WP_Query()的包装,并且共享输入参数。

注意,这只适用于WordPress 3.9+

  

has_password(bool) - 对于带密码的帖子为true;错误的帖子   没有密码;对于包含和不包含密码的所有帖子均为null   (适用于3.9版)。

还有另一个新的post_password参数,其中包含可能的值:

  • null(忽略)
  • false(仅限没有密码的帖子)
  • true(仅限带有密码的帖子)
  • 一个字符串(使用此确切密码的帖子)

您可以查看Trac Ticket

pre_get_posts过滤器与get_posts一起使用:

您使用pre_get_posts过滤器失败的原因是默认情况下get_posts()会抑制所有pre_get_posts过滤器。使用suppress_filters=false参数应用它。

答案 1 :(得分:1)

您可以在自定义循环中执行此操作。

<?php
    if ( post_password_required() ) {
            continue;
    } else {
           echo 'normal post';
    }
?>