返回

WordPress:如何限制仪表盘访问,同时允许 AJAX 请求?

php

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 请求正常工作。这使我们可以保护网站的管理区域,同时保持其核心功能。

常见问题解答

  1. 为什么我们使用 DOING_AJAX 常量?
    它允许我们区分非 AJAX 请求和 AJAX 请求,从而我们可以有针对性地限制对仪表盘的访问。
  2. 除了功能/角色列表之外,我还可以使用哪些其他标准来限制访问?
    你可以使用元数据、自定义字段或其他 WordPress 提供的条件来进一步限制访问。
  3. 自定义的 AJAX URL 有什么用?
    它使我们可以定义一个自定义的 URL 用于 AJAX 请求,从而进一步加强网站的安全性。
  4. .htaccess 规则做什么?
    它重定向所有非 AJAX 请求到 WordPress 仪表盘,从而确保仅允许 AJAX 请求访问仪表盘。
  5. 这种方法会影响插件和主题吗?
    不会,只要插件和主题使用标准的 AJAX 实现,它们应该可以正常工作。