0

如果他们不是管理员,我想重定向用户,我在一个add_action('init'...函数中做

但是,如果 URL 路径类似于/wp-json(v1/...(所以不是用户而是自定义 REST API 请求) ,我不想重定向用户

我如何获取请求的 URL 并做出决定?我应该在init钩子内这样做吗?

        function redirect_users()
        {

            global $wp;
// $url = get_url();
// if ($url === 'whatever') {
//  return;
// }

            if (get_current_user_id()) {
                $user = get_userdata(get_current_user_id());
                $user_roles = $user->roles;
                if (!in_array('administrator', (array) $user_roles)) {
                    wp_logout();
                    wp_redirect($url);
                    exit;
                }
            }
        }
        add_action('init', '\kw_signup\redirect_non_admin_users', 15);

从接受的答案

            if (!preg_match('/^wp-json\//', $wp->request)) {
                if (!get_current_user_id()) {
                    wp_redirect($url);
                    exit();
                }
                if (get_current_user_id()) {
                    $user = get_userdata(get_current_user_id());
                    $user_roles = $user->roles;
                    if (!in_array('administrator', (array) $user_roles)) {
                        wp_redirect($url);
                        exit();
                    }
                }
            }
        }
        add_action('parse_request', '\kw_signup\redirect_non_admin_users', 15);

我使用钩子,parse_request或者template_redirect使用前者,您将wp对象作为参数接收

4

1 回答 1

1

我如何获取请求的 URL 并做出决定?

要获取请求的 URL,您可以使用$_SERVER超全局。不过,在您的情况下,我更喜欢使用$wp->request,其中包括您的 URL 的路径部分。

我应该在init钩子内这样做吗?

我会说最适合重定向的钩子是template_redirect.

所以,把它们放在一起:

<?php
namespace kw_signup;

add_action( 'template_redirect', __NAMESPACE__ . '\redirect_non_admin_users' );

function redirect_non_admin_users() {
  global $wp;

  // Check if the requested URL does not start with a specific string
  if ( ! preg_match( '/^wp-json\//', $wp->request ) ) {
    // URL is not a custom REST API request
    // Check if user is an administrator, redirect, …
  }
}
于 2020-04-09T20:07:09.120 回答