权限不足;为由自定义功能管理的插件编写操作

时间:2012-04-13 作者:James Revillini

我正在对WP Super Cache进行修改,添加了两个新功能,可以更好地控制某些功能的限制。我的目标是a)允许编辑器看到管理栏上的删除缓存按钮,b)使用它删除他们正在编辑的页面的缓存。我得到了“a”,但当编辑器单击“删除缓存”时,他们会得到“您没有足够的权限访问此页面”

我找不到插件的哪一部分强制进行此权限检查,但我想知道这是否与菜单项指向的URL有关。

以下是添加菜单项的函数和挂钩:

function supercache_admin_bar_render() {
    global $wp_admin_bar, $wp_cache_not_logged_in;
    if ( !is_user_logged_in() && !$wp_cache_not_logged_in ) 
        return false;

    // ORIGINALLY if ( wp_supercache_admin() )
    if ( !current_user_can(\'wp_supercache_delete_page_cache\') && !current_user_can(\'wp_supercache_manage_options\') )
        return false;

    $wp_admin_bar->add_menu( array(
                \'parent\' => \'\',
                \'id\' => \'delete-cache\',
                \'title\' => __( \'Delete Cache\', \'wp-super-cache\' ),
                \'href\' => wp_nonce_url( admin_url( \'admin.php?page=wpsupercache&action=wpsupercachedelete&path=\' . urlencode( $_SERVER[ \'REQUEST_URI\' ] ) ), \'delete-cache\' ) // ORIGINALLY pointed to options.general.php?page=wpsupercache&action=delete... 
                ) );
}
add_action( \'wp_before_admin_bar_render\', \'supercache_admin_bar_render\');
我认为这一部分也与解决这个问题有关。。。这在插件文件的其他地方,而不是在任何函数中(我需要提高优先级吗?)

if ( isset( $_GET[ \'page\' ] ) && $_GET[ \'page\' ] == \'wpsupercache\' )
    add_action( \'admin_init\', \'wp_cache_manager_updates\' );
我已经对wp_cache_manager_updates 因此,它说明了上述功能。事实上,此函数从未运行过。我放了一个die(\'got to wp_cache_manager_updates\'); 看看有没有碰过它。事实并非如此。有东西截获并将我发送到权限不足的ville。

1 个回复
SO网友:James Revillini

您不应该使用page 参数,除非您要转到选项页,因为“manage\\u options”功能的检查是默认权限检查。“删除缓存”链接的目标是运行一个操作,然后重定向到当前页面/帖子;不查看选项页。WP Super Cache插件有点滥用其设置页面作为管理设置和运行操作(如“删除页面缓存”)的总括。

在代码方面,解决方案涉及以下更改。

将“删除缓存”添加到管理栏时需要进行一些更改:

function supercache_admin_bar_render() {
    global $wp_admin_bar, $wp_cache_not_logged_in;
    if ( !is_user_logged_in() || !$wp_cache_not_logged_in ) 
        return false;

    if ( !current_user_can(\'wp_supercache_delete_page_cache\') && !current_user_can(\'wp_supercache_manage_options\') )
        return false;

    $wp_admin_bar->add_menu( array(
                \'parent\' => \'\',
                \'id\' => \'delete-cache\',
                \'title\' => __( \'Delete Cache\', \'wp-super-cache\' ),
                \'meta\' => array( \'title\' => __( \'Delete cache of the current page\', \'wp-super-cache\' ) ),
                // NOTE: post.php is irrelevant; stripping page=xxx IS relevant; changed action value from \'delete\' to \'wpsupercache-delete-page-cache\' to keep it in a sensible namespace
                \'href\' => wp_nonce_url( admin_url( \'post.php?action=wpsupercache-delete-page-cache&path=\' . urlencode( $_SERVER[ \'REQUEST_URI\' ] ) ), \'delete-cache\' )
                ) );
}
还更改了将挂钩添加到admin\\u init以查找此新操作的代码:

if ( ( isset( $_GET[ \'page\' ] ) && $_GET[ \'page\' ] == \'wpsupercache\' ) || ( isset( $_GET[ \'action\' ] ) && $_GET[ \'action\' ] == \'wpsupercache-delete-page-cache\' ) ) {
    add_action( \'admin_init\', \'wp_cache_manager_updates\' );
}
最后,修改了wp_cache_manager_updates 函数将新操作考虑在内,并允许在用户具有wpsupercache\\u delete\\u page\\u缓存功能时运行该函数。我没有发布这段代码,因为它与解决方案无关,而且很长。

结束

相关推荐

Recommended File Permissions

嘿,伙计们,我花了很长时间试图解决这个问题。我想知道WordPress中的文件权限应该是什么样子in order to use the autoupdate feature. 到目前为止,我的wordpress安装程序一直在询问我的FTP信息,我不想使用那种升级/安装方法,我想使用纯/直接PHP。某些上下文:Web服务器和php fcgi守护程序运行为www-data:www-data</wordpress安装位于/home/blaenk/sites/domain.tld/</首先,我read