管理页面和管理菜单。权限插件

时间:2016-05-18 作者:Mr 660

我正在尝试编写一个简单的权限管理页面插件。到目前为止,我制作了一个包含每个角色的页面,在这里我可以从菜单中检查要禁用的特定菜单页面。我只是global $menu 并保存到编码为JSON数组的选项。

示例:

    array(2) {
  ["sub_administrator"]=>
  array(11) {
    [0]=>
    string(10) "menu-posts"
    [1]=>
    string(19) "toplevel_page_wpcf7"
    [2]=>
    string(15) "menu-appearance"
    [3]=>
    string(12) "menu-plugins"
    [4]=>
    string(10) "menu-tools"
    [5]=>
    string(13) "menu-settings"
    [6]=>
    string(32) "toplevel_page_edit?post_type=acf"
    [7]=>
    string(30) "toplevel_page_bwp_capt_general"
    [8]=>
    string(40) "toplevel_page_mr_permissions_admin_pages"
    [9]=>
    string(23) "toplevel_page_Wordfence"
    [10]=>
    string(28) "toplevel_page_wp-user-avatar"
  }
}
以后使用admin_menu 挂钩I从显示中删除某个菜单项

function mr_permissions_roles_admin_menu_restriction() {
        echo\'<pre>\';
        global $menu;
        $restricted=array();

        $current_user=wp_get_current_user();        
        $role_restriction=get_option(\'mr_permissions_roles\');
        $role_restriction=(array)json_decode($role_restriction);
        $role=$current_user->roles[0];
        if(!empty($role_restriction[$role]))
        {
            $restricted=$role_restriction[$role];
        }


        foreach ( $menu as $item => $data ) {
            if ( ! isset( $data[5] ) ) {
                continue; // Move along if the current $item doesn\'t have a slug.
            } elseif ( in_array( $data[5], $restricted ) ) {
                unset( $menu[$item] ); // Remove the current $item from the $menu.
            }
        }
        echo\'</pre>\';
    }

    add_action( \'admin_menu\', \'mr_permissions_roles_admin_menu_restriction\',20);
这是这里最简单的部分。

现在我想在每个管理页面加载之前检查用户是否有插件权限进入页面(人们仍然可以通过url进入页面)。

我做了一些有用的东西,但不是无处不在。我在代码下解释。

function mr_permissions_roles_admin_page_restriction($screen)
    {

        global $menu;
        $current_user=wp_get_current_user();
        $role_restriction=get_option(\'mr_permissions_roles\');
        $role_restriction=(array)json_decode($role_restriction);
        $role=$current_user->roles[0];
        if(in_array($screen->base,$role_restriction[$role]))
            exit(\'<!DOCTYPE html> <!-- Ticket #11289, IE bug fix: always pad the error page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono --> <html xmlns="http://www.w3.org/1999/xhtml" lang="pl-PL"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width"> <title>WordPress &rsaquo; Błąd</title> <style type="text/css"> html { background: #f1f1f1; } body { background: #fff; color: #444; font-family: "Open Sans", sans-serif; margin: 2em auto; padding: 1em 2em; max-width: 700px; -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13); box-shadow: 0 1px 3px rgba(0,0,0,0.13); } h1 { border-bottom: 1px solid #dadada; clear: both; color: #666; font: 24px "Open Sans", sans-serif; margin: 30px 0 0 0; padding: 0; padding-bottom: 7px; } #error-page { margin-top: 50px; } #error-page p { font-size: 14px; line-height: 1.5; margin: 25px 0 20px; } #error-page code { font-family: Consolas, Monaco, monospace; } ul li { margin-bottom: 10px; font-size: 14px; } a { color: #0073aa; } a:hover, a:active { color: #00a0d2; } a:focus { color: #124964; -webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8); box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8); outline: none; } .button { background: #f7f7f7; border: 1px solid #ccc; color: #555; display: inline-block; text-decoration: none; font-size: 13px; line-height: 26px; height: 28px; margin: 0; padding: 0 10px 1px; cursor: pointer; -webkit-border-radius: 3px; -webkit-appearance: none; border-radius: 3px; white-space: nowrap; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-box-shadow: 0 1px 0 #ccc; box-shadow: 0 1px 0 #ccc; vertical-align: top; } .button.button-large { height: 30px; line-height: 28px; padding: 0 12px 2px; } .button:hover, .button:focus { background: #fafafa; border-color: #999; color: #23282d; } .button:focus { border-color: #5b9dd9; -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); outline: none; } .button:active { background: #eee; border-color: #999; -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); -webkit-transform: translateY(1px); -ms-transform: translateY(1px); transform: translateY(1px); } </style> </head> <body id="error-page"> <p>Nie posiadasz wystarczających uprawnień, by wejść na tę stronę.</p></body> </html> \');
        if($current_user->ID!=38)
        {
            echo \'<pre>\';
            //var_dump($screen);
            echo \'</pre>\';
        }
    }
    add_action(\'current_screen\',\'mr_permissions_roles_admin_page_restriction\');
我发现了current_screen 钩我想要钩,但不完全是。例如,发布菜单项slug是menu-posts. 在里面$screen variable和$menu variable没有一件事我可以比较。对于自定义管理菜单页面,它工作得很好$菜单slug在$screen->base中,所以我可以比较它。但当谈到内置页面时,它就不起作用了。这里有几个问题可以解决我的问题。

如何获取管理菜单项。然后我可以用不同的方式保存它,并进行不同的比较。

有什么方法可以从current_screen.

还有其他想法吗?

如何获取子菜单页,例如帖子。global $menu 没有。我想在我的插件中添加禁用访问子菜单页面的可能性(例如,其中的一些页面并非全部页面)

我甚至试图在数据库中查找任何信息,但什么也找不到。

我还制作了一个自定义页面来编辑每个用户,让他们在我的一篇或几篇自定义帖子中添加帖子。因此,对于默认编辑器,它无权自定义\\u帖子。当我想让某人添加公司(custom\\u post)时,我会转到用户,选中复选框并保存。从现在起,这个具有角色编辑器的用户可以编辑公司,但其他编辑器不能。

2 个回复
最合适的回答,由SO网友:Mr 660 整理而成

伙计们,我为所有感兴趣的人发布了answet!我编辑过mr_permissions_roles_admin_page_restriction 因为我注意到一件事:我保存的限制是URL!

这就是:

function mr_permissions_roles_admin_page_restriction($screen)
{
    $block=FALSE;
    $url=str_replace(\'/wp-admin/\',\'\',$_SERVER[\'REQUEST_URI\']);
    global $menu;
    $current_user=wp_get_current_user();        
    $role_restriction=get_option(\'mr_permissions_roles\');
    $role_restriction=(array)json_decode($role_restriction);
    $role=$current_user->roles[0];

    if(in_array($screen->base,$role_restriction[$role]))
        $block=TRUE;
    else if(in_array($url,$role_restriction[$role]))
        $block=TRUE;
    else if(in_array($_GET[\'page\'],$role_restriction[$role]))
        $block=TRUE;
    if($block)
        wp_die(\'Nie posiadasz wystarczających uprawnień, by wejść na tę stronę.\');          
}
add_action(\'current_screen\',\'mr_permissions_roles_admin_page_restriction\');

SO网友:Andy Macaulay-Brook

WordPress已经有了一个相当好的角色和能力系统,而且,依我看,你会发现使用它更容易。

构建管理菜单时,管理菜单上的每个项目都要检查相关功能。同样,每次尝试使用管理屏幕时都会进行检查。

可以使用map\\u meta\\u cap来修改其中一些权限。例如,我喜欢让我的客户编辑他们的网站,但也允许他们管理小部件和菜单,而不需要进行其他主题更改。我使用以下代码段:

add_filter( \'map_meta_cap\', \'tbdn_map_meta_cap\', 10, 4 );

function tbdn_map_meta_cap( $caps, $cap, $user_id, $args ) {

    if ( \'edit_theme_options\' == $cap ) {

        $screen = get_current_screen();

        $caps = array( \'edit_theme_options\' );

        switch ( $screen->id ) {
            case \'widgets\':
                $caps[] = \'manage_widgets\';
                break;
            case \'nav-menus\':
                $caps[] = \'manage_nav_menus\';
                break;

        }

    }
    return $caps;
}
这会限制对edit\\u theme\\u选项默认功能的检查,如果您试图访问widgets屏幕,则会将manage\\u widgets功能添加到使用此屏幕的足够功能列表中。同样,nav menus(导航菜单)屏幕也有自己的功能。

然后,可以使用现有的角色管理插件关闭角色或用户的edit\\u theme\\u选项,从而删除对所有主题选项屏幕的访问权限。然后为角色/用户提供manage\\u小部件和manage\\u nav\\u菜单功能,这样他们就可以访问这些屏幕,而无需进一步访问主题选项。

结合你的管理菜单编辑这一点,你应该很好去。

相关推荐

WP-ADMIN:“对不起,您不能访问此页面。”

两周后不使用我们的WP站点,登录/wp-admin/ 出现白屏错误:抱歉,不允许您访问此页面。我有:重命名plugins 到plugins.temp.通过phpMyAdmin创建了一个新的管理员用户。新用户已user_meta 的作用a:1:{s:13:"administrator";s:1:"1";}.</已重命名themes 到themes.temp.</删除核心WordPress文件,并替换为新上载的文件</已替换.htaccess 使用默认