对未登录用户隐藏帖子

时间:2016-04-28 作者:Enok82

我希望为未登录的任何人隐藏某些帖子。我尝试了限制内容(RC)插件,但那只隐藏了帖子的内容,我希望完全忽略帖子。

使用RC作为基础,我尝试了以下方法:

function hideFromUnknownUsers($postObject) {
    $rcUserLevel = get_post_meta ( $postObject->ID, \'rcUserLevel\', true );

    if(have_posts())
    {
        if (!(
                !current_user_can ( \'read\' ) &&
                (
                    $rcUserLevel == \'Administrator\' ||
                    $rcUserLevel == \'Editor\' ||
                    $rcUserLevel == \'Author\' ||
                    $rcUserLevel == \'Contributor\' ||
                    $rcUserLevel == \'Subscriber\'
                )
            )) {
            the_post();
        }
    }
}

add_action ( \'the_post\', \'hideFromUnknownUsers\' );
这有一个系统性的缺点。不能忽略最后一篇文章。不过,我现在可以接受这一点。另一个问题是,这也会导致无限循环,一遍又一遍地重复相同的帖子。我发现这是因为have_posts() 它不仅告诉我们已经到达最后一篇文章的结尾,而且还有一个副作用,那就是文章计数器也被重置,阻止我的主循环到达它的结尾。制作have_posts() 由于我不知道如何到达$wp_query->current_post$wp_query->post_count 从插件。

一种解决方案是将上述逻辑直接放在主题PHP文件中,但这必须在我想要访问帖子的任何地方重复,使其变得繁琐且容易出错。

有没有其他方法可以对未知用户隐藏某些帖子?

2 个回复
SO网友:bosco

摆弄用户角色可能是最可靠的解决方案,但要设置一种快速而肮脏的方法post meta-data 要标记应隐藏的帖子,请添加meta-query 使用发布查询a pre_get_posts hook 为了将结果限制为非登录用户的非隐藏帖子。

以下内容将限制all 已注销访问者的帖子查询到那些没有关联hide_from_guests 元数据,或将该元数据设置为\'false\':

function wpse225120_hide_posts_from_guests( $query ) {
  // If the user\'s logged in, exit the function now.
  if( is_user_logged_in() )
    return;

  // Get the current metadata query so we can alter it instead of overwriting it
  $meta_query = $query->get( \'meta_query\' );

  // Create a meta-query filtering out hidden posts
  $hidden_meta_query = array(
    \'relation\' => \'OR\',
    array(
      \'key\'     => \'hide_from_guests\',
      \'value\'   => \'false\'
    ),
    array(
      \'key\'     => \'hide_from_guests\',
      \'compare\' => \'NOT_EXISTS\'
    ) 
  );

  // If there\'s not already a meta-query, supply the one for hidden posts and exit
  if( ! is_array( $meta_query ) || empty( $meta_query ) ) {
    $query->set( \'meta_query\', $hidden_meta_query );
    return;
  }

  // If there is an existing meta-query, modify it to support our new hidden posts
  // meta-query as a top-level \'AND\' condition, if need be
  if( isset( $meta_query[ \'relation\' ] ) && \'OR\' === $meta_query[ \'relation\' ] )
    $meta_query = array(
      \'relation\'  => \'AND\',
      $meta_query
    );
  }

  // Add the hidden posts meta-query and overwrite $query\'s old meta-query
  $meta_query[] = $hidden_meta_query;
  $query->set( \'meta_query\', $meta_query );
}
add_action( \'pre_get_posts\', \'wpse225120_hide_posts_from_guests\' );
Note 像这样对每个查询进行全局更改通常被认为是一种不好的做法。如果可能,使用is_main_query() 和其他conditional tags 限制查询修改仅限于相关查询,以防止意外行为和性能影响。

这个\'hide_from_guests\' 可以使用custom fields 界面post metadata functions, 或实现自定义metabox 并以其他方式将其附加到相关的职位类型。

SO网友:MAN5

在子主题的函数中使用此代码。php文件。。

//Hide for non-logged-in users (public visitors)
 function bp_logged_out_page_template_redirect() { if( ! is_user_logged_in() && is_page( \'members\' )|| is_page( \'activity\' ) || bp_is_user() ) { wp_redirect( home_url( \'/register/\' ) ); exit(); } } 
add_action( \'template_redirect\', \'bp_logged_out_page_template_redirect\' );
上述代码段将执行以下操作:

如果用户未登录。。页面名称为“成员”或“活动”或bp配置文件页面。。然后它将重定向到注册页面。

参考号:https://vvcares.com/w/wordpress-hide-pages-for-non-logged-in-users/

相关推荐

如何修改WP_INCLUDE/BLOCKS/LATEST_posts.php

我是WordPress开发的初学者,希望得到一些帮助。我在一个简单的WordPress网站上工作。基本上,用户希望在主页上显示最新的帖子。我使用了最新帖子块,并将其设置为显示整个帖子内容,现在用户不希望帖子标题链接到单个帖子页面(因为帖子的内容显示在主页上)。如何安全地修改模板文件,使其像h2标记一样使用,而不是在主题中使用的href标记。我知道您可以创建子主题并修改wp_content 文件,但我不确定如何处理中的文件wp_include. 我读到一些关于修改functions.php 但我不确定,如果