Tout savoir sur WordPress

Autoriser la prévisualisation des articles aux visiteurs

Par défaut, la pré-visualisation d’un article avant sa mise en ligne est réservé aux auteurs et aux administrateurs. Afin de permettre à quiconque de voir un aperçu d’un article avant sa publication, nous allons créer un lien d’accès temporaire.

Par défaut, les auteurs et les administrateurs peuvent pré­visualiser un article en cours de rédaction. Cela permet de se relire, de vérifier la mise en page, ou aussi de faire valider un texte sans devoir se connecter pour lire l’article à partir de l’espace d’administration.

Dans mon cas, j’aime bien donner à lire mes articles à quelques amis avant la publication d’un article. J’ai donc créé une astuce qui permet aux anonymes de lire vos articles en avance.

Pour cela, nous allons ajouter un lien « Guest Preview » à côté du lien « Aperçu ». Ce lien sera le clone de « Aperçu » avec une variable supplémentaire : un nonce.

Pour rappel, un nonce est un jeton de sécurité (une chaîne de caractères pseudo-­aléatoire) qui sert de vérification en matière de sécurité. On peut faire en sorte que la prévisualisation soit visible par tous, mais cela veut signifie qu’à tout moment, n’importe quel visiteur peut pré-visualiser les articles.

Pour créer un lien de pré-visualisation temporaire et accesible à tous, copiez le code suivant dans le fichier functions.php présent à la racine de votre thème :

add_filter( 'page_row_actions', 'baw_post_row_actions', 10, 2 );
add_filter( 'post_row_actions', 'baw_post_row_actions', 10, 2 );
function baw_post_row_actions( $actions, $post ) {
    
    $nonce = substr(wp_hash(ceil(time()/(60*6)).__FILE__.$post->ID, 'nonce'), -12, 10 );
    
    $url = add_query_arg( 
        array( 'p'=>$post->ID, 
               'preview'=>'true', 
               '_previewnonce'=>$nonce 
        ), 
        home_url( '/?p=' . $post->ID ) 
    );
    
    $actions['guest_preview'] = '<a href="'.$url.'">Guest Preview</a>';
    return $actions;
}

A noter que la première ligne n’apparaît pas dans la vidéo. Ceci est un oubli de ma part.
page_row_actions insère ce lien sur tous les types de post hiérarchique, tandis que post_row_actions le fait pour les types non hiérarchiques.

Ensuite il nous faut gérer ce nonce, avec le hook posts_results qui contient en paramètre le retour des posts trouvés pour cette requête :

add_filter( 'posts_results', 'baw_posts_results' );
function baw_posts_results( $posts ) {

    if( !empty( $posts ) && isset( $_GET['preview'], $_GET['p'], $_GET['_previewnonce'] ) )
        if( $_GET['_previewnonce']==substr(wp_hash(ceil(time()/(60*6)).__FILE__.$_GET['p'], 'nonce'), ­-12, 10 ) )
             $posts[0]­>post_status = 'publish';
        else wp_die( __('You do not have permission to preview drafts.') );
    return $posts;
 }

Il nous suffit de vérifier notre nonce de la même façon que nous l’avons créé. L’astuce réside dans le fait de modifier à la volée le status du seul article retourné en “publié”, ainsi les visiteurs auront les droits de le visualiser. J’ai ajouté une message au cas où le nonce ne serait plus actif.

Pour utiliser l’astuce, vous devez copier le lien du Guest Preview et le donner à qui vous voulez. Attention, si ils ne ferment pas ou ne rafraîchissent pas la page, il est évident que l’article leur est toujours dispo en lecture.

Cet article a été mis à jour il y a 1849 jours - Il n'est peut être plus à jour !

Article écrit par Julio P.

Co-fondateur de WP Media, la startup Lyonnaise qui a créé WP Rocket et Imagify, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

43 Commentaires

  1. Il y a justement un plugin qui fait ça. On ne va pas recommencer la guerre plugins/functions mais le plugin a l’intérêt d’être désactivable si on a juste le besoin au coup par coup de ce genre de choses.

  2. @li-an SI tu veux l’astuce en plugin désactivable, tu fais comme pour toutes les astuces, tu colles dans un .php, tu ajoutes une entête de plugin comme

    /*
    Plugin Name: Guest Preview
    */

    Et tu mets ça dans /wp-content/plugins/
    Terminé tu as un plugin désactivable ;)

    Pour le plugin existant, j’ai trouvé ça : http://plugins.svn.wordpress.org/public-post-preview/tags/2.1.1/public-post-preview.php
    Je vous laisse juge du poids du fichier par rapport à mon astuce…

  3. @Li-an : Désolé, mais l’argument du coup par coup du plugin n’est pas valable. On peut très bien mettre en commentaire 2 lignes de code pour désactiver le code…

  4. @ Jonathan Buttigieg: si on a été capable de modifier functions.php, on est capable de mettre des lignes en commentaire, mais c’est un peu moins pratique et pluss long, et si on a ajouté cette astuce pas seulement pour soi mais pour un utilisateur lambda qui n’y connaît rien ?

  5. @Christophe : Je suis conscient que les astuces sont réservées aux développeurs. Pour les plugins il y a une section pour ça sur le site :)

    Et au pire, rien n’empêche de faire comme Julio vient de le mentionner plus haut dans son commentaire.

  6. Sympa ça !
    J’avais en effet présenté une fois une extension pouvant faire cela, mais finalement un bout de code comme celui-là est beaucoup mieux. Merci Julio :)

  7. hors sujet : OH MON DIEU, Valentin, le retour, ça fait bien un an que je t’ai pas vu parler, nul part (à part twitter). Content de te voir ici :D

    @Greg : on apprends tous les jours, je me répète !

    @Constantin : de rien

  8. Ca ne réponds pas à « Dans quel post mets tu le shortcode de quel guest preview ».
    Comment un shortcode peut il donner l’accès à un preview de façon attendue ? As tu regardé la vidéo ?

  9. Et puis dans le footer il y a deux types louches qui me bloquent. Ils me mettent les chocottes.
    Bon, l’avantage c’est qu’on n’est pas spammés par les mails d’abo aux commentaires.

    @Jo : justement j’en vois pas du flash, mais en haut il y a un gros pavé avec une image pixelisée qui me dit « Vous devez mettre à jour la version de votre Adobe Flash Player pour regarder cette vidéo. » ^^

  10. @Greg : Ah bin le coup de la daube Flash à mettre, ce n’est pas de ma faute =D

    Pour les mails d’abo, c’est un problème du serveur qui n’arrive plus à envoyer les mails. Je m’occupe de ce détail demain matin (enfin j’essaye !).

  11. Merci Julio, je ne pensais pas que c’était possible juste en changeant ce fichier avec ce bout de code, pas compliquer à mettre en place.

    Je vais tester :)

  12. @cecile & @arnaud : même chose, perso ma femme me dit « tu as lu mon dernier article ? » « non il est pas publié » … et donc je me suis dit « ça serait bien qu’elle puisse me filer son lien de preview sans que je doive me connecter au site, et paf ça fait des chocapic.
    De rien, si ça sert, je suis content :D

  13. Bonjour, excellent!
    est-il possible d’offrir un tel lien preview sur une page de formulaire public ou des utilisateurs non-connectés peuvent poster (mais en mode brouillon bien-sûr, l’administrateur modère avant publication définitive)?
    Le lien apparaitrait une fois le formulaire envoyé.
    L’ exemple classique: une annonce d’événements public sur un site d’agenda ouvert.

    Je suis en train de faire ça avec Gravity Form (qui génère toujours un nonce) + Sugar Event Calendar.

    Merci

  14. Oui tu peux, tu affiches ça :

    $link = baw_post_row_actions( array(), $post ); // $post étant l'article ajouté en pending
    echo $link['guest_post'];
    
  15. Très sympathique ce code. C’est vrai que c’est toujours bien d’avoir un avis extérieur sur nos articles sans pour autant être obligé de valider l’article ou de donner un accès à cette personne pour qu’elle puisse le voir.
    Merci pour le partage ;)

  16. Le code est top, il permet effectivement de faire lire un article de son blog et de récupérer de bonnes idées avant de publier.
    le coup du filtre posts_results x est une trouvaille.

    Finalement il est bien ce wordpress!

  17. je suis tout à fait d’accord avec toi @Christelle, ce genre de de code devrait être inséré par défaut, pour la simple raison que je n’y comprends rien, c’est du chinois pour moi !

    Est ce qu’il y a un tuto plus facile à comprendre (pour débutants) ?

    Merci pour cet effort !

  18. Merci beaucoup pour cette petite manip ;)

    Mais je me pose la question de l’intérêt ?

    Pourquoi vouloir faire lire un article qui n’est pas encore validé ? (Excepté le fait de le faire voir par des amis) ;)

    Merci

  19. @Baptiste : La réponse est dans votre dernière parenthèse ;)

    Et autre le fait de vouloir partagé avec des « amis », si vous avez un site avec plusieurs contributeurs, cela permet de leur partager l’article afin de récolter des divers avis avant la publication.

  20. Excellente manipulation. il est intéressant de pouvoir suggérer une amélioration d’un article avant la publication finale. Il y un réel intérêt.

  21. Excellente astuce et travail de recherche.
    Pouvoir présenter sa copie avant publication pour l’approbation ou une correction éventuelle de l’article sans bouleverser les droits d’accès via l’admin c’est un gain de temps considérable et surtout c’est beaucoup plus efficace. Bravo pour l’idée !

  22. C’est une très bonne astuce, mais je pense aussi qu’un plugin est plus simple pour les personnes qui , comme moi ne comprennent pas grand chose au code.

    Certes, j’arrive a me depatouiller, mais je n’obtiens jamais ce que je veux exactement. Et c’est la qu’intervient les plugin qui me permette d’obtenir simplement et sans programmation une fonction voulue.

  23. Bonjour

    Une question sur le widget calendrier, j’aimerai désactiver le lien de la date lié à un article. Ne laisser que la date du jour (d’une autre couleur mais ca c’est bon)
    merci

  24. Bonjour,

    je viens de tomber grâce à google sur votre astuce, qui m’intéresserais bien, mais lorsque je l’utilise j’ai l’erreur suivante : Parse error: syntax error, unexpected ‘­’ (T_STRING) in /home/dinosowl/www/wp-content/themes/portfolio-press/functions.php on line 257

    à ma décharge je n’ai pas poussé très loin les recherches mais plutôt copier coller votre code.

    Merci!

0f6abd28505e2a3c34ecb38fc4ba9806nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn