Ich lasse Benutzer Beiträge erstellen und Bilder über das Frontend hochladen / an diesen Beitrag anhängen . Das funktioniert gut. Wenn ich jedoch 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 (BEARBEITEN) mit einem Umleitungscode
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 Medien-Upload funktioniert nicht mehr (Meldung "Fehler"). Dieses Problem wurde an anderer Stelle diskutiert :
Ich fand heraus, dass die Rolle, die keinen Zugriff [auf das Backend] hatte, auch ihre Fähigkeit zum Hochladen von Dateien im Frontend beeinträchtigte.
Gibt es eine Möglichkeit, Benutzer daran zu hindern, auf das Backend zuzugreifen, ohne ihre Fähigkeit zum Hochladen von Bildern auf das Frontend zu beeinträchtigen?
Vielen Dank!
/wp-admin/
damit Sie nicht mit Berechtigungen herumspielen.Antworten:
Zunächst ist es wichtig zu überlegen, warum Sie den Zugriff auf einschränken
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 über das Back-End bereitgestellte Funktionen ausführen können, sollten Sie stattdessen die integrierte Rollen- und Funktions-API von WordPress verwenden. Geben Sie Ihren Benutzern eine Rolle mit nur den Funktionen, die sie haben sollen. Andernfalls können sie durch das Gewähren des Zugriffs 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 gesehen ein Back-End, selbst wenn er vom Front-End aufgerufen wird. Ihr Code, an den Sie angeschlossen'admin_init'
sind, wird also ausgelöst. Sie müssen lediglich prüfen, ob es sich bei der Anforderung um eine Ajax-Anforderung in dieser Funktion handelt, und nur beenden / umleiten, wenn dies nicht der Fall ist. Seit WP 4.7 können Sie diewp_doing_ajax()
Funktion jetzt dafür verwenden .Wenn Sie Ihren Benutzern nur den Zugriff auf das Hochladen von Anhängen ermöglichen möchten, können Sie die Bedingung möglicherweise folgendermaßen ändern:
Beachten Sie jedoch, dass viele Plugins auch ihre eigenen Ajax-Aktionen bereitstellen, die in diesem Fall blockiert würden. Sie sind also besser dran, wenn Sie die oben angegebene Rollen- und Fähigkeits-API verwenden.
quelle
wp-admin
vollständige Einschränkung vornehmen möchten, aber dennoch Ajax-Anforderungen berücksichtigen müssen, bin ich mir nicht sicher, wie Sie dies sonst tun würden. Natürlich sollte jeder Ajax-Rückruf seine eigenen Fähigkeitsüberprüfungen haben, aber das ist meines Erachtens ein separates Problem. Dies überschreibt keine Fähigkeitsüberprüfungen, die die Ajax-Rückrufe selbst durchführen. Die Ajax-Rückrufe sind davon überhaupt nicht betroffen, nur die Möglichkeit, auf das Back-End zuzugreifen. Dies ist das einzige, was das OP einschränken wollte. Nicht die Ajax-Aktionen. :-)Um es einfach zu halten, es gibt zwei Plugins, mit denen ich das gleiche, was Sie suchen, effektiv erreichen kann:
WP Admin No SHow : https://wordpress.org/plugins/wp-admin-no-show/
Nach dem Anmelden umleiten : https://wordpress.org/plugins/redirect-after-login/
Mit der ersten Option können Sie mehrere Rollen auswählen und umleiten, wenn sie auf wp-admin zugreifen möchten. Mit der zweiten Option können Sie einzelne Rollen bei der Anmeldung umleiten.
Hoffe das hilft.
quelle