Benutzer können keine Bilder im Frontend hochladen, wenn sie keinen Zugriff auf das wp-Backend haben

Ich lasse die Benutzer Beiträge erstellen und Bilder an diesen Beitrag über das Frontend hochladen / anhängen. Das funktioniert gut. Allerdings, wenn ich den Zugriff auf das WordPress-Backend (/ wp-admin /) über ein Code-Snippet wie dieses einschränke

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

oder (EDIT) mit einem Weiterleitungscode

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

Der Media Upload funktioniert nicht mehr (Fehlermeldung “Error”). Dieses Problem wurde an anderer Stelle diskutiert:

Ich fand heraus, dass, wenn die Rolle diesen Zugriff [auf das Backend] nicht hatte, auch ihre Fähigkeit zum Hochladen von Dateien am Frontend zunichte gemacht wurde.

Gibt es eine Möglichkeit, Benutzer daran zu hindern, auf das Back-End zuzugreifen, ohne ihre Fähigkeit zum Hochladen von Bildern auf dem Frontend zu zerstören?

Vielen Dank!

Solutions Collecting From Web of "Benutzer können keine Bilder im Frontend hochladen, wenn sie keinen Zugriff auf das wp-Backend haben"

Zunächst ist es wichtig zu überlegen, warum Sie den Zugriff auf wp-admin . Wenn Sie dies hauptsächlich aus ästhetischen Gründen tun, ist die unten angegebene Lösung in Ordnung. Wenn Sie dies jedoch tun, weil Sie nicht möchten, dass Ihre Benutzer bestimmte functionen über das Back-End ausführen können, sollten Sie stattdessen die integrierte Rollen- und functions-API von WordPress verwenden. Geben Sie Ihren Benutzern nur die functionen, die sie haben sollen. Andernfalls können Sie durch das Gewähren von Zugriff auf die Ajax-Aktionen wahrscheinlich Dinge tun, die Sie verhindern wollten.

Das bringt uns zur Ursache Ihres Problems. Ajax ist am Hochladen des Bildes beteiligt, und der Ajax-Handler ( wp-admin/admin-ajax.php ) ist technisch Back-End, auch wenn er vom Frontend aufgerufen wird. Dein Code, der an 'admin_init' ist, wird also ausgetriggers. Was Sie tun müssen, ist zu überprüfen, ob die Anfrage eine Ajax-Anfrage in dieser function ist, und nur zu beenden / umzuleiten, wenn dies nicht der Fall ist. Seit WP 4.7 können Sie nun die function wp_doing_ajax() verwenden.

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

Wenn Sie Ihren Benutzern nur den Zugriff auf das Hochladen von Anhängen erlauben möchten, können Sie die Bedingung wahrscheinlich folgendermaßen ändern:

  if ( wp_doing_ajax() && isset( $_POST['action'] ) && 'upload-attachment' === $_POST['action'] ) { return; // Don't block attachment upload requests. } 

Beachten Sie jedoch, dass viele Plugins auch eigene Ajax-Aktionen bereitstellen, die in diesem Fall blockiert wären. Sie werden also besser die Rollen- und functions-API verwenden, wie oben beschrieben.