it-swarm.com.de

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

Ich lasse Benutzer Beiträge erstellen und Bilder über das Frontend an diesen Beitrag hochladen/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 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). Dieses Problem wurde anderswo diskutiert:

Ich fand heraus, dass die Rolle, wenn sie nicht über diesen Zugriff [auf das Backend] verfügte, auch ihre Fähigkeit zum Hochladen von Dateien auf das 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!

7
SPi

Zunächst ist zu überlegen, warum Sie den Zugriff auf wp-admin einschränken. 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 Funktionen ausführen können, die über das Back-End bereitgestellt werden, sollten Sie stattdessen die integrierte Rollen- und Funktions-API von WordPress verwenden. Geben Sie Ihren Benutzern nur die Funktionen, die Sie möchten. Wenn Sie anderenfalls Zugriff auf die Ajax-Aktionen gewähren, können sie möglicherweise Aktionen ausführen, 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 ein Back-End, selbst wenn er vom Front-End aufgerufen wird. Also wird Ihr Code, der an 'admin_init' angehängt ist, 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 dafür jetzt die Funktion 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 gewähren möchten, können Sie die Bedingung möglicherweise 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ürden. Daher ist es für Sie besser, die oben angegebene Rollen- und Funktions-API zu verwenden.

1
J.D.

Um es einfach zu halten, es gibt zwei Plugins, die ich verwende, um dasselbe zu erreichen, wonach Sie effektiv suchen:

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

  2. Nach dem Login 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 umleiten, wenn sie sich anmelden.

Hoffe das hilft.

0
Chuck G