WordPress:如何在钩子上获取'init'完整路径?还是另一个钩子更可取?



如果用户不是管理员,我想重定向用户,并且我在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_signupredirect_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_signupredirect_non_admin_users', 15);

我使用钩子parse_requesttemplate_redirect,前者将接收wp对象作为参数

我如何获取请求的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, …
}
}

相关内容

  • 没有找到相关文章

最新更新