根据自定义用户和帖子元数据限制对帖子的访问

时间:2020-05-21 作者:Carri

我有一个名为俱乐部页面的自定义帖子类型,还有一个名为“俱乐部领袖”的自定义角色。俱乐部领导目前只能阅读、修改和删除所有俱乐部页面的帖子。然而,有许多不同的俱乐部在这种帖子类型中有自己的页面集,我需要确保俱乐部领导只能在WP Admin中阅读、编辑和删除与其特定俱乐部相关的页面。

目前,每个俱乐部页面都有一个自定义元数据字段,名为club_name. 我并没有使用分层的帖子类型来表示每个俱乐部,因为它们大约有100个——所有这些都需要使用相同的模板和菜单,对于超级管理员来说,这似乎是一个超级混乱和难以管理的管理区域。我不反对使用子帖子类型,如果我need 不过,我想。

所以,我的计划是添加一个自定义用户元字段,也称为club_name, 表示与哪些俱乐部领导相关,并以某种方式过滤WP Admin中的帖子列表,以仅显示具有相同内容的帖子club_name 作为该用户。所以我认为这个过滤器的逻辑应该是这样的:

If User->Role == \'Club Leader\'
 get `user->club_name`
For each Post
 If `post->club_name` == `user->club_name`
  return `post_item`
 Else 
  return nothing
我希望每个俱乐部领导都只与一个俱乐部相关,但您的解决方案允许我让一个俱乐部领导访问多个俱乐部的页面,以防将来发生变化。

此外,我知道我只提供了伪代码,但我正在寻找完整的PHP代码解决方案。

1 个回复
最合适的回答,由SO网友:Tony Djukic 整理而成

在一个类似的用例场景中,我有一个客户机,它有5个位置可以分配给用户。这需要为您进行更改,因为它基于分配给用户和帖子的位置,而您只是将整个帖子分配给用户,而不是匹配帖子元。

function filter_by_user_club( $query ) {
  if( is_admin() ) {
    $user_id        = get_current_user_id();
    $user_location  = get_user_meta( $user_id, \'myplugin_user_location\', true );
    $currentscreen  = get_current_screen();
    if ( $currentscreen->post_type == \'custom_post_type\' ) {
        if( !empty( $user_location ) ) {
            $location_meta_query = array(
                \'key\'   => \'cpt_location\',
                \'value\' => $user_location,
                \'compare\'   => \'IN\'
            );
            $query->set(\'meta_query\', array( $location_meta_query ) );
        }
    }
  }
add_action( \'pre_get_posts\', \'filter_by_user_club\', 9998 );
我猜,如果我正确理解了你的结构,这种修改将需要应用于你的方法。。。

您需要更改meta_query 而是使用post_in, 像这样:

    function filter_by_user_club( $query ) {
      if( is_admin() ) {
        $user_id        = get_current_user_id();
        $user_clubs     = get_user_meta( $user_id, \'myplugin_user_clubs\', true );
        $currentscreen  = get_current_screen();
        if ( $currentscreen->post_type == \'club_post_type\' ) {
            if( !empty( $user_clubs ) ) {
                //if you\'ve saved the user club IDs as an array (recommended)
                $query->set(\'post_in\', $user_clubs );
                //if you\'ve saved the user club IDs as a string use this...
                //$query->set(\'post_in\', array( $user_clubs ) );
            }
        }
      }
    add_action( \'pre_get_posts\', \'filter_by_user_club\', 9998 );
显然,要获得与用户相关联的俱乐部ID还有很多工作要做,等等。但这将根据用户过滤俱乐部帖子类型列表。

我们正在使用$query->set() 本质上是在屏幕的默认值中添加一个参数get_posts() 查询虽然这里的查询在默认情况下会获取所有帖子(根据每个屏幕设置的帖子数量分页),但我们现在告诉它只显示posts_in 检查用户与哪些俱乐部关联时提供的数组。

相关推荐

正在尝试获取wp-includes/capabilities.php中非对象的属性

在调试中,我每分钟都会收到以下通知序列。日志:[23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/capabilities.php on line 1022 [23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/