只能编辑特定(非自定义类型)页面和所有子页面的自定义用户角色

时间:2018-02-06 作者:nViz

我的网站有几个静态页面和几个自定义帖子类型。我正在尝试创建一个名为students 并且只允许学生访问特定的自定义帖子类型和特定的静态页面。

我了解如何通过使用add_cap() 并填充传递给的“capability\\u type”和“map\\u meta\\u cap”字段register_post_type 对于该自定义帖子类型。

However, I don\'t understand how to do this for generic pages (which are not custom, but have been populated with different content). 具体来说,我想创建一个名为internal-resources 并给出student 用户编辑特定页面的功能。中有一些子页internal-resources 他们也应该能够编辑页面。最后,我希望他们能够在internal-resources. 但是,其他静态页面ResearchPeople 他们应该无法编辑。这应该不会太难吧?

谢谢你的帮助!!

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

WordPress无法将编辑(或任何操作)特定帖子的功能分配给角色。

但是,您可以使用筛选功能检查并动态更改它们map_meta_cap.

在处理帖子权限时,WordPress最终只处理4项功能:

  • edit_post
  • read_post
  • delete_post
  • publish_post
然后,每当对post执行操作时,它都会将这些功能映射到“基本”功能。以下是您将更熟悉的功能:

  • publish_posts
  • edit_posts
  • edit_others_posts
  • edit_private_posts
  • edit_published_posts
  • read
  • read_private_posts
  • delete_posts
  • delete_private_posts
  • delete_published_posts
  • delete_others_postscreate_posts, 但据我所知,这只用于某些REST端点,并用于控制是否显示某些UI。保存帖子时create_posts 已映射到edit_posts.

    什么map_meta_cap() 它的作用是,当有人试图编辑帖子时,它会确定需要哪种基本功能。

    因此,如果用户试图编辑帖子,map_meta_cap() 检查他们是否是该帖子的作者。如果他们是edit_post 元功能将映射到edit_posts. 如果他们不是作者,则将映射到edit_others_posts. WordPress将检查用户是否具有映射的功能,并做出相应的响应。

    因此,如果您想更改每页的权限,则需要筛选map_meta_cap 更改分配元功能的方式。

    在您的示例中,您希望让用户edit_page 对于内部资源页面(和其他页面),但不编辑任何其他页面。这有点棘手,因为要做到这一点,他们需要访问仪表板中的“页面”菜单。所以你需要student 角色edit_pagespublish_pages 功能,然后使用筛选器逐页撤销这些功能:

    function wpse_293259_map_meta_cap( $required_caps, $cap, $user_id, $args ) {
        if ( in_array( $cap, [\'edit_post\', \'publish_post\'] ) ) {
            $page_id = $args[0]; // The ID of the post being edited.
            $student_pages = [1,2,3]; // The IDs of the pages students are allowed to edit.
    
            /**
             * If the page being edited is not one students can edit, check if the user
             * is a student. If they are, set the required capabilities to \'do_not_allow\'
             * to prevent them editing.
             */
            if ( ! in_array( $page_id, $student_pages ) ) {
                $user = new WP_User( $user_id );
    
                if ( in_array( \'students\', $user->roles ) ) {
                    $required_caps = [\'do_not_allow\'];
                }
            }
        }
    
        return $required_caps;
    }
    add_filter( \'map_meta_cap\', \'wpse_293259_map_meta_cap\', 10, 4 );
    
    这将阻止发布或编辑不在$student_pages.

    我还没有找到一种允许用户发布页面的好方法,但前提是他们是特定页面的子页面。我尝试过的各种编辑和发布功能都会导致奇怪的行为。我认为子页面不是管理权限的好方法,因为它们可以在页面编辑器上更改。这意味着您将在发布帖子和被重定向回编辑帖子之间更改权限。

    您最好使用我描述的允许编辑内部资源页面的技术,然后将子页面拆分为具有自己权限的单独帖子类型。

结束
只能编辑特定(非自定义类型)页面和所有子页面的自定义用户角色 - 小码农CODE - 行之有效找到问题解决它

只能编辑特定(非自定义类型)页面和所有子页面的自定义用户角色

时间:2018-02-06 作者:nViz

我的网站有几个静态页面和几个自定义帖子类型。我正在尝试创建一个名为students 并且只允许学生访问特定的自定义帖子类型和特定的静态页面。

我了解如何通过使用add_cap() 并填充传递给的“capability\\u type”和“map\\u meta\\u cap”字段register_post_type 对于该自定义帖子类型。

However, I don\'t understand how to do this for generic pages (which are not custom, but have been populated with different content). 具体来说,我想创建一个名为internal-resources 并给出student 用户编辑特定页面的功能。中有一些子页internal-resources 他们也应该能够编辑页面。最后,我希望他们能够在internal-resources. 但是,其他静态页面ResearchPeople 他们应该无法编辑。这应该不会太难吧?

谢谢你的帮助!!

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

WordPress无法将编辑(或任何操作)特定帖子的功能分配给角色。

但是,您可以使用筛选功能检查并动态更改它们map_meta_cap.

在处理帖子权限时,WordPress最终只处理4项功能:

  • edit_post
  • read_post
  • delete_post
  • publish_post
然后,每当对post执行操作时,它都会将这些功能映射到“基本”功能。以下是您将更熟悉的功能:

  • publish_posts
  • edit_posts
  • edit_others_posts
  • edit_private_posts
  • edit_published_posts
  • read
  • read_private_posts
  • delete_posts
  • delete_private_posts
  • delete_published_posts
  • delete_others_postscreate_posts, 但据我所知,这只用于某些REST端点,并用于控制是否显示某些UI。保存帖子时create_posts 已映射到edit_posts.

    什么map_meta_cap() 它的作用是,当有人试图编辑帖子时,它会确定需要哪种基本功能。

    因此,如果用户试图编辑帖子,map_meta_cap() 检查他们是否是该帖子的作者。如果他们是edit_post 元功能将映射到edit_posts. 如果他们不是作者,则将映射到edit_others_posts. WordPress将检查用户是否具有映射的功能,并做出相应的响应。

    因此,如果您想更改每页的权限,则需要筛选map_meta_cap 更改分配元功能的方式。

    在您的示例中,您希望让用户edit_page 对于内部资源页面(和其他页面),但不编辑任何其他页面。这有点棘手,因为要做到这一点,他们需要访问仪表板中的“页面”菜单。所以你需要student 角色edit_pagespublish_pages 功能,然后使用筛选器逐页撤销这些功能:

    function wpse_293259_map_meta_cap( $required_caps, $cap, $user_id, $args ) {
        if ( in_array( $cap, [\'edit_post\', \'publish_post\'] ) ) {
            $page_id = $args[0]; // The ID of the post being edited.
            $student_pages = [1,2,3]; // The IDs of the pages students are allowed to edit.
    
            /**
             * If the page being edited is not one students can edit, check if the user
             * is a student. If they are, set the required capabilities to \'do_not_allow\'
             * to prevent them editing.
             */
            if ( ! in_array( $page_id, $student_pages ) ) {
                $user = new WP_User( $user_id );
    
                if ( in_array( \'students\', $user->roles ) ) {
                    $required_caps = [\'do_not_allow\'];
                }
            }
        }
    
        return $required_caps;
    }
    add_filter( \'map_meta_cap\', \'wpse_293259_map_meta_cap\', 10, 4 );
    
    这将阻止发布或编辑不在$student_pages.

    我还没有找到一种允许用户发布页面的好方法,但前提是他们是特定页面的子页面。我尝试过的各种编辑和发布功能都会导致奇怪的行为。我认为子页面不是管理权限的好方法,因为它们可以在页面编辑器上更改。这意味着您将在发布帖子和被重定向回编辑帖子之间更改权限。

    您最好使用我描述的允许编辑内部资源页面的技术,然后将子页面拆分为具有自己权限的单独帖子类型。

相关推荐

如何从wp-admin/edit.php重定向到特定定制帖子类型的前端页面?

我正在基于Wordpress构建一个非常小的web应用程序。为此,我为用户可以在应用程序中管理的项目创建了自定义帖子类型。我已经创建了一个非常漂亮、优化的概览页面作为前端页面。然而,为了节省开发时间,编辑每个项目仍然在后端进行。后端中的某些操作(即删除项目)会将用户带到后端中的项目概述页面(/wp-admin/edit.php?post_type=my_item_post_type) 而不是我漂亮的前端页面。我想防止这种情况发生,这样当用户/wp-admin/edit.php?post_type=my_i