Пользователи не могут загружать изображения на интерфейсе, если у них нет доступа к wp-серверу

Я позволяю пользователям создавать сообщения и загружать / прикреплять изображения к этому сообщению через интерфейс . Это прекрасно работает. Однако, когда я ограничиваю доступ к бэкэнду 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 ); 

или (EDIT) с кодом перенаправления

 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' ); 

Загрузка мультимедиа больше не работает (сообщение «Ошибка»). Эта проблема обсуждалась в другом месте :

Я понял, что если роль не имела этого доступа [к бэкэнд], это также убило их способность загружать файлы на переднем конце.

Есть ли способ предотвратить доступ пользователей к бэкэнд, не убивая их способность загружать изображения во внешний интерфейс?

Спасибо!

Во-первых, важно учитывать, почему вы ограничиваете доступ к wp-admin . Если вы делаете это в основном в эстетических целях, то решение, представленное ниже, прекрасно. Однако, если вы делаете это, потому что вы не хотите, чтобы ваши пользователи могли выполнять определенные функции, предоставляемые с помощью внешнего сервера, вместо этого вы должны использовать встроенные функции и возможности WordPress. Предоставьте своим пользователям роль только тех возможностей, которые вы хотите, чтобы они имели. В противном случае предоставление доступа к действиям Ajax, вероятно, позволит им делать то, что вы пытались помешать им.

Это подводит нас к причине вашей проблемы. Ajax участвует в загрузке изображения, а обработчик Ajax ( wp-admin/admin-ajax.php ) является технически back-end, даже если он вызван из интерфейса. Таким образом, ваш код, подключенный к '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 роли и возможностей, как указано выше.