Sur mon site Web, les utilisateurs enregistrés (rôle d’abonné) peuvent envoyer des brouillons. Si les administrateurs les valident, ils sont publiés.
J'essaie d'ajouter une boîte de balise à l'éditeur de frontend utilisé pour envoyer de nouveaux messages. Pour implémenter la fonctionnalité de saisie semi-automatique, je passe un appel AJAX à cette URL:
http://example.com/wp-admin/admin-ajax.php?action=ajax-tag-search&tax=post_tag
Cela fonctionne très bien pour un utilisateur administrateur, mais pas pour les abonnés. Est-ce que quelqu'un sait comment y parvenir sans avoir à appeler admin-ajax.php
?
Tous les appels WordPress AJAX doivent être traités par le admin-ajax.php
, qu'ils soient sur le frontend ou dans le backend. Pour accorder l'accès, vous devez enregistrer la callbackfuntion pour l'appel AJAX, ajoutez ces lignes à votre fichier:
add_action( 'wp_ajax_prefix_update_post', 'prefix_update_post' );
add_action( 'wp_ajax_nopriv_prefix_update_post', 'prefix_update_post' );
Assurez-vous d'ajouter une validation dans la fonction prefix_update_post
, car un utilisateur non connecté ne devrait pas être autorisé à envoyer le brouillon.
Donc, cette ligne devrait faire l'affaire:
function prefix_update_post() {
if ( current_user_can( 'edit_post' ) ) {
// your goodies here
}
}
Si tout se passe bien, parfait, sinon vous devrez peut-être envoyer l'ID utilisateur avec l'appel AJAX et vérifier si l'utilisateur dispose des autorisations appropriées (get_user_by('id', $userid)
).
Pourquoi ne pas faire de vos utilisateurs des contributeurs plutôt que des abonnés? Par défaut, les contributeurs peuvent soumettre des brouillons, mais pas publier, plus la fonction AJAX fonctionnera.
Si vous ne souhaitez pas que les contributeurs accèdent au tableau de bord, vous pouvez les exclure avec cet extrait:
function wpse_77140_restrict_admin() {
if ( ! current_user_can( 'publish_posts' ) )
wp_redirect( home_url() );
}
add_action( 'admin_init', 'wpse_77140_restrict_admin' );