返回
WordPress:如何限制仪表盘访问,同时允许 AJAX 请求?
php
2024-03-09 20:07:33
WordPress:限制仪表盘访问,同时允许 AJAX 请求
作为一名 WordPress 爱好者,我遇到了一个棘手的挑战:如何拒绝用户访问 WordPress 仪表盘,同时允许 AJAX 请求。在本文中,我将与你分享解决方案,让你可以轻松实现这一目标,从而保护你的网站管理区域。
问题:访问限制与 AJAX 兼容
默认情况下,WordPress 允许所有用户访问仪表盘,包括订阅者和投稿者等低权限用户。然而,有时候我们需要限制对仪表盘的访问,只允许特定的用户组(例如管理员)进入。
然而,问题在于,许多插件和功能(如私信系统)使用 AJAX 来在用户之间发送消息和数据。如果我们完全限制对仪表盘的访问,这些功能将无法正常工作。
解决方案:过滤非 AJAX 请求
为了解决这一困境,我们需要找到一种方法来区分非 AJAX 请求和 AJAX 请求。WordPress 提供了 DOING_AJAX
常量,当一个请求是通过 AJAX 发送时,该常量为 true。
我们可以利用这个常量来过滤非 AJAX 请求,如下所示:
// functions.php
add_action( 'init', 'my_custom_dashboard_access_handler' );
function my_custom_dashboard_access_handler() {
// 如果当前页面是管理页面并且不是 AJAX 请求,则执行以下操作
if ( is_admin() && !( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
// 获取当前用户的所有功能
$user = get_userdata( get_current_user_id() );
$caps = ( is_object( $user) ) ? array_keys($user->allcaps) : array();
// 列出所有无法查看仪表盘的功能/角色
$block_access_to = array('subscriber', 'contributor', 'my-custom-role', 'my-custom-capability');
// 如果用户不具有查看仪表盘的权限,则重定向到主页
if(array_intersect($block_access_to, $caps)) {
wp_redirect( home_url() );
exit;
}
}
}
其他注意事项
除了上面提到的方法,还有一些其他注意事项可以帮助我们实现这一目标:
- 修改
wp-config.php
文件: 添加以下行以定义自定义的 AJAX URL:
define( 'ADMIN_AJAX_URL', '/wp-admin/admin-ajax.php' );
- 修改
.htaccess
文件: 添加以下规则以重定向非 AJAX 请求:
RewriteRule ^wp-admin/!ajax$ /wp-admin/ [R=301,L]
总结
通过结合上述解决方案,我们能够限制对 WordPress 仪表盘的访问,同时仍然允许 AJAX 请求正常工作。这使我们可以保护网站的管理区域,同时保持其核心功能。
常见问题解答
- 为什么我们使用
DOING_AJAX
常量?
它允许我们区分非 AJAX 请求和 AJAX 请求,从而我们可以有针对性地限制对仪表盘的访问。 - 除了功能/角色列表之外,我还可以使用哪些其他标准来限制访问?
你可以使用元数据、自定义字段或其他 WordPress 提供的条件来进一步限制访问。 - 自定义的 AJAX URL 有什么用?
它使我们可以定义一个自定义的 URL 用于 AJAX 请求,从而进一步加强网站的安全性。 - .htaccess 规则做什么?
它重定向所有非 AJAX 请求到 WordPress 仪表盘,从而确保仅允许 AJAX 请求访问仪表盘。 - 这种方法会影响插件和主题吗?
不会,只要插件和主题使用标准的 AJAX 实现,它们应该可以正常工作。