web-dev-qa-db-fra.com

Les utilisateurs ne peuvent pas télécharger d'images sur le front-end s'ils n'ont pas accès au backend wp

Je laisse les utilisateurs créer des publications et télécharger/joindre des images à cette publication via le frontend . Cela fonctionne bien. Cependant, lorsque je restreins l'accès au backend Wordpress (/ wp-admin /) via un fragment de code comme celui-ci

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

ou (EDIT) avec un code de redirection

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

le chargement du support ne fonctionne plus (message "Erreur"). Ce problème a été discuté ailleurs :

Je me suis dit que si le rôle ne disposait pas de cet accès [au backend], sa capacité de télécharger des fichiers sur le serveur principal était également affaiblie.

Existe-t-il un moyen d'empêcher les utilisateurs d'accéder au back-end sans compromettre leur capacité à télécharger des images sur le front-end?

Je vous remercie!

7
SPi

Premièrement, il est important de déterminer pourquoi vous restreignez l'accès à wp-admin. Si vous le faites principalement à des fins esthétiques, la solution proposée ci-dessous convient parfaitement. Toutefois, si vous ne le faites pas parce que vous ne voulez pas que vos utilisateurs puissent exécuter certaines fonctions fournies via le back-end, utilisez plutôt l'API intégrée des rôles et des fonctionnalités de WordPress. Attribuez à vos utilisateurs un rôle avec uniquement les fonctionnalités que vous souhaitez leur attribuer. Autrement, accorder l'accès aux actions Ajax leur permettra probablement de faire les choses que vous tentiez de les empêcher de faire.

Ce qui nous amène à la cause de votre problème. Ajax est impliqué dans le téléchargement de l'image, et le gestionnaire Ajax (wp-admin/admin-ajax.php) est techniquement back-end, même lorsqu'il est appelé depuis le front-end. Donc, votre code accroché à 'admin_init' est en cours de déclenchement. Ce que vous devez faire est de vérifier si la requête est une requête Ajax dans cette fonction, et uniquement quitter/rediriger si ce n’est pas le cas. Depuis WP 4.7, vous pouvez maintenant utiliser la fonction wp_doing_ajax() pour cela.

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

Si vous souhaitez uniquement autoriser vos utilisateurs à télécharger des pièces jointes, vous pouvez probablement modifier la condition comme suit:

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

Cependant, notez que de nombreux plugins fournissent également leurs propres actions Ajax, qui seraient bloquées dans ce cas. Vous ferez donc mieux d'utiliser l'API de rôle et de fonctionnalité, comme indiqué ci-dessus.

1
J.D.

Pour rester simple, il existe deux plugins que j'utilise pour obtenir la même chose que vous recherchez efficacement:

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

  2. Rediriger après la connexion : https://wordpress.org/plugins/redirect-after-login/

La première option vous permet de sélectionner plusieurs rôles et de les rediriger lorsqu'ils cherchent à accéder à wp-admin. La deuxième option vous permet de rediriger des rôles individuels lors de la connexion.

J'espère que cela t'aides.

0
Chuck G