限制 WordPress 后端访问,没有冲突的形式

Restrict WordPress backend access, without conflicting forms

我在 WordPress 中有一个标准表单,我正在努力限制对 WordPress 后端和正常工作表单的访问,因为表单是通过 wp-admin 处理的,如果受到限制,则不会处理表单。

<form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
...
</form>

限制后端访问:

// Restrict users to enter backend
add_action('init', 'restrict_backend_access');

function restrict_backend_access() {
    if (is_admin() && current_user_can('subscriber') && !(defined('DOING_AJAX') && DOING_AJAX)){
        wp_redirect( '/dashboard/' );
        exit;
    }
}

我错过了什么吗?我知道这是可能的,因为我构建了很多次,但这次有些不同,我不知道为什么。

谢谢!

请找到正确的代码如下:

add_action( 'init', 'restrict_backend_access' );

function restrict_backend_access() {
    if( is_admin() && ! current_user_can( 'subscriber' ) && !( defined( ‘DOING_AJAX’ ) && DOING_AJAX ) ) {
        wp_redirect( home_url() );  
        exit;
    }
}

您可以根据需要设置重定向。 例如替换

wp_redirect( home_url() ) 

wp_redirect( '/dashboard/' );

您可以在表单中添加隐藏字段

<form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
...
<input type="hidden" name="admin_post_request" value="1" />
</form>

然后用它绕过重定向

add_action( 'init', 'restrict_backend_access' );
function restrict_backend_access() {
    if( is_admin() && ! current_user_can( 'subscriber' ) && !( defined( ‘DOING_AJAX’ ) && DOING_AJAX && !isset( $_GET['admin_post_request'] ) ) ) {
        wp_redirect( home_url() );  
        exit;
    }
}