web-dev-qa-db-fra.com

Comment rendre le programme de publication visible à n'importe qui?

Lorsque j'écris un message et que je le programme pour une publication ultérieure, WordPress me permet de prévisualiser le message comme s'il avait déjà été publié, mais je dois être connecté en tant qu'administrateur (ou à toute personne autorisée à prévisualiser le message).

Existe-t-il un moyen, éventuellement un paramètre de chaîne de requête, de rendre la publication prévisualisable par quiconque, c'est-à-dire également par des utilisateurs anonymes? Quelque chose comme my-post?previewsecret=645732116468?

2
Borek Bernard

Avant-premières brouillons

Jetez un coup d’œil à cette partie du code principal dans query.php qui

[Vérifie] post status pour déterminer si post doit être affiché.

http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2658

if ( ! is_user_logged_in() ) {
  // User must be logged in to view unpublished posts.
  $this->posts = array();
}

... est ce qui rend le contournement assez simple pour les utilisateurs non connectés. Vous pouvez remplacer le résultat de cette fonction en allant dans deeper puis en prenant soin des rôles. Mais cela représente trop de frais généraux et peut contribuer à la sécurité exposée.

Si vous regardez un peu plus haut http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2632 à la ligne 2632, vous constaterez que la publication est en fait extraite de la base de données et peut être filtrée davantage à l’aide du crochet posts_results qui contient quelques lignes plus bas.

Stocke la valeur de la publication et l’injecte vers la fin après toutes les vérifications qui annulent le tableau posts. http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2740the_posts hook attend avec impatience.

Donc, quelque chose de rugueux ressemblerait à ceci:

add_filter( 'posts_results', 'wpse46014_peek_into_private', null, 2 );
function wpse46014_peek_into_private( $posts, &$query ) {

    if ( sizeof( $posts ) != 1 ) return $posts; /* not interested */

    $status = get_post_status( $posts[0] );
    $post_status_obj = get_post_status_object( $status );

    if ( $post_status_obj->public ) return $posts; /* it's public */

    if ( !isset( $_GET['key'] ) || $_GET['key'] != 'foryoureyesonly' )
        return $posts; /* not for your eyes */

    $query->_my_private_stash = $posts; /* stash away */

    add_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
}

function wpse46014_inject_private( $posts, &$query ) {
    /* do only once */
    remove_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
    return $query->_my_private_stash;
}

Ajoutez le lien de prévisualisation de votre message avec la clé secrète ?p=4601&key=foryoureyesonly et le message est affiché pour tous. Le code a des conneries sales, comme le stash, vous pouvez utiliser globals à la place (non recommandé), ou l'envelopper dans un objet (oui!) Et étendre la fonctionnalité avec des mots de passe personnalisés pour chaque publication, etc.

Aperçus programmés

Les aperçus planifiés fonctionnent de manière très similaire. Les posts_results sont remplis avec les messages d'état 'future' de la même manière et les mêmes points d'accroche peuvent être exploités. Le code fonctionnera sans changement pour les publications programmées.

/2012/07/12/one-two-three/ - 404 NOT FOUND

/2012/07/12/one-two-three/?key=foryoureyesonly - 200 OK

7
soulseekah

La réponse de Soulseekah est incroyable, et c'est exactement ce que je cherchais. En cherchant cela, je suis également tombé sur un plugin (qui pourrait être basé sur ce post pour autant que je sache).

Aperçu de la publication publique

1
hookedonwinter