列出用户有权读取的所有个人主页

时间:2021-04-01 作者:Jospo

我试图列出用户有权读取的所有私人页面。为了更详细地解释,以下是初始设置:

每个用户都创建了一个特定的角色,并仅分配了读取私人页面的能力。然后为特定页面选择这些角色,以限制对该页面的访问。

Example:

<保险商实验室;用户1“;角色名称=“”;用户\\u 1\\u角色“;,能力=“”;阅读私人网页“
  • “li>
  • ”;用户2“;角色名称=“”;用户\\u 2\\u角色“;,能力=“”;阅读私人网页“
  • “li>
  • ”;第1页;,可见性设置为Private,限制访问;用户\\u 1\\u角色“
  • “li>
  • ”;第2页“;,可见性设置为Private,限制访问;用户\\u 1\\u角色“;和;“用户2\\u角色”
  • Goal:

    <当;用户1“;已登录,我想列出此用户能够阅读的所有页面。在本例中,这将是;第1页“;仅限表示;用户2“;该列表将是;第1页“;和;第2页“;因为该用户能够阅读这两个页面我尝试了以下代码,但这列出了所有现有的私人页面,而不仅仅是那些对当前登录用户的访问权限有限的页面:

        $pages = get_pages(
            array(\'post_status\' => array( \'private\' ),
        ));
        foreach ( $pages as $page ) {
          if (current_user_can( \'read_private_pages\', $page->ID )) {
              echo $page->post_title . "<br/>";
          }
        }
    
    任何帮助都将不胜感激。

    EDIT: 我在最初的帖子中并没有提到可以有无限数量的页面,也可以有用户角色和用户。因此,理想情况下,该解决方案应适用于任意数量的帖子、用户和角色。

    我还尝试了以下类似于上面的代码,但结果相同:

        $user = wp_get_current_user();
        $pages = get_pages(
            array(\'post_status\' => array( \'private\' ),
        ));
        foreach ( $pages as $page ) {
          if ($user->has_cap( \'read_private_pages\', $page->ID )) {
              echo $page->post_title . "<br/>";
          }
        }
    
    当我尝试将功能更改为时,例如。current_user_can( \'read_pages\', $page->ID ), 它正确地没有显示列表中的任何页面,因为没有具有read\\u pages权限的用户,只有read\\u private\\u页面。所以current_user_can() 不知怎么回事,我认为第二个参数$page->ID 由于某些原因未考虑在内。

    EDIT 2:我还忘了提到我正在使用第三方插件create rolesrestrict pages, 被称为MembersPress, 因此,答案/代码必须能够与上述插件结合使用。

    1 个回复
    最合适的回答,由SO网友:Anake.me 整理而成

    我为您制作了以下代码,以便复制并粘贴到functions.php 文件

    我相信有一个更简单的解决方案,但这是我想出的有效解决方案。

    本节第一部分adds the new roles.

    function anakeme_custom_roles() {
    
        add_role(
            \'level_1\',
            \'Level 1\',
            [
                \'read_private_pages\' => true,
                \'read_level_1\' => true,
            ]
        );
    
        add_role(
            \'level_2\',
            \'Level 2\',
            [
                \'read_private_pages\' => true,
                \'read_level_2\' => true,
            ]
        );
    
    }
    add_action( \'init\', \'anakeme_custom_roles\' );
    
    代码的第二部分创建foreach循环,并根据用户功能和页面级别添加条件。

    function anakeme_shortcode_level() {
    
        $pages = get_pages(
            array(
                \'post_status\' => array( \'private\' ),
            )
        );
    
        foreach ( $pages as $page ) {
    
            $page_level = get_post_meta( $page->ID, \'visibility_level\', true );
            $read_1 = current_user_can( \'read_level_1\', $page->ID );
            $read_2 = current_user_can( \'read_level_2\', $page->ID );
    
            if ( $read_1 && $page_level == 1 ) {
    
                echo $page->post_title . "<br/>";
    
            } else if( $read_2 && $page_level >= 1 ) {
    
                echo $page->post_title . "<br/>";
    
            }
    
        }
    
    }
    add_shortcode( \'list_pages_level\', \'anakeme_shortcode_level\' );
    
    现在,要使其工作,您必须创建custom field 在页面中,您希望对某些角色/级别保持独占。我在示例中创建的角色使用编号系统。

    所以对于Level 1 用户要访问级别1页面,我只需添加自定义字段visibility_level 以及价值1. 同样适用于Level 2 用户,只需交换值1 对于2.

    一旦建立了编号系统,我就使用一个条件来检查编号是否等于1 或更多,然后相应地显示结果。

    To implement this anywhere in your site, use the shortcode list_pages_level.

    如果您希望在理解上述代码方面获得进一步帮助,或希望在代码上得到扩展,请回答您的问题

    EDIT

    上面的代码将在不使用第三方插件的情况下工作,但是OP需要一个代码与一个称为\'MembersPress\', 下面的代码应该满足OP显示当前登录用户有权访问的页面的要求。

    function anakeme_shortcode_level() {
        
        global $current_user;
    
        /**
          *
          * Get \'private\' pages as array.
          *
          */
        $pages = get_pages(
            array(
                \'post_status\' => \'private\',
            )
        );
        
        /**
          *
          * Loop through all pages.
          *
          */
        foreach ( $pages as $page ) {
            
            /**
              *
              * Get current users role.
              *
              */
            $user_roles = $current_user->roles;
            $user_role = array_shift( $user_roles );
            
            /**
              *
              * Check the current user can read private pages.
              *
              */
            $private = current_user_can( \'read_private_pages\', $page->ID );
            
            /**
              *
              * Get the roles that have access to the associated page.
              *
              */
            $restricted = get_post_meta( $page->ID, \'_members_access_role\' );
            
            /**
              *
              * Find and echo only pages where the user has access to private pages and the `users role` is equal to the `role` restriction on the page set by MembersPress.
              *
              */
            if( ( $private ) && ( $user_role == in_array( $user_role, $restricted ) ) ) {
                    
                echo $page->post_title . "<br/>";
                
            }
    
        }
    
    }
    add_shortcode( \'list_pages_level\', \'anakeme_shortcode_level\' );
    
    请注意,上面提供的代码是NOT 通常由StackOverflow成员提供,因为它与第三方插件(MembersPress)相关。请确保以后联系插件的客户支持以获取任何编码请求。

    请务必mark the answer as correct 如果这是您所需要的upvote 答案是一种感谢:)