如果用户无法访问wp后台,则无法在前端上传图片

时间:2014-04-10 作者:SPi

我允许用户创建帖子,并通过frontend. 这很好用。然而,当我通过这样的代码片段限制对Wordpress后端(/wp admin/)的访问时

function wpse_11244_restrict_admin() {
    if ( ! current_user_can( \'manage_options\' ) ) {
        wp_die( __(\'You are not allowed to access this part of the site\') );
    }
}
add_action( \'admin_init\', \'wpse_11244_restrict_admin\', 1 );
或使用重定向代码(编辑)

function redirect_non_admin_users() {
    if ( ! current_user_can( \'manage_options\' ) && \'/wp-admin/admin-ajax.php\' != $_SERVER[\'PHP_SELF\'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( \'admin_init\', \'redirect_non_admin_users\' );
媒体上载不再工作(“错误”消息)。这个问题已经讨论过了elsewhere:

我发现,如果角色(对后端)没有访问权限,那么也会扼杀他们在前端上传文件的能力。

有没有一种方法可以防止用户访问后端,而不影响他们在前端上传图像的能力?

非常感谢。

2 个回复
SO网友:J.D.

首先,重要的是要考虑为什么要限制访问wp-admin. 如果您这样做主要是为了美观,那么下面提供的解决方案就可以了。但是,如果您这样做是因为不希望用户能够执行通过后端提供的某些功能,那么您应该改用WordPress的内置角色和功能API。为您的用户提供一个角色,该角色仅具有您希望他们拥有的功能。否则,授予对Ajax操作的访问权可能会允许他们执行您试图阻止他们执行的操作。

这就引出了你问题的原因。Ajax参与上传图像,以及Ajax处理程序(wp-admin/admin-ajax.php) 从技术上讲是后端的,即使从前端调用也是如此。所以你的代码\'admin_init\' 正在触发。您需要做的是检查该函数中的请求是否是Ajax请求,如果不是,则仅退出/重定向。从WP 4.7开始,您现在可以使用wp_doing_ajax() 函数。

function redirect_non_admin_users() {
    if ( wp_doing_ajax() ) {
        return; // Don\'t block Ajax requests.
    }

    if ( ! current_user_can( \'manage_options\' ) && \'/wp-admin/admin-ajax.php\' != $_SERVER[\'PHP_SELF\'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( \'admin_init\', \'redirect_non_admin_users\' );
如果您只想允许用户访问上载附件,您可以将条件更改为:

    if ( wp_doing_ajax() && isset( $_POST[\'action\'] ) && \'upload-attachment\' === $_POST[\'action\'] ) {
        return; // Don\'t block attachment upload requests.
    }
然而,请注意,许多插件也提供自己的Ajax操作,在这种情况下,这些操作将被阻止。因此,如上所述,您最好使用角色和功能API。

SO网友:Samuel Kazeem

为了简单起见,我使用了两个插件来有效地实现您所寻求的相同功能:

  1. WP Admin No SHow : https://wordpress.org/plugins/wp-admin-no-show/

  2. Redirect After Login: https://wordpress.org/plugins/redirect-after-login/

第一个选项允许您选择多个角色,并在他们试图访问wp Admin时重定向他们。第二个选项允许您在他们登录时重定向单个角色。

希望这有帮助。

结束