我正在对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。
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缓存功能时运行该函数。我没有发布这段代码,因为它与解决方案无关,而且很长。