Comment puis-je rendre un brouillon accessible à tout le monde?

12

J'ai plusieurs publications non publiées sur mon site Web Wordpress et j'essaie de le rendre accessible aux utilisateurs normaux (qui ne sont pas connectés) à l'aide des slug de publication normales ( site.com/post-here ). Je comprends que ce n’est peut-être pas la meilleure pratique, mais pour ce qui est spécial, cela doit être fait.

J'ai essayé d'ajouter l'extrait de code suivant dans mon fichier functions.php :

function enable_view_drafts() {
$role = get_role( 'subscriber' ); 
$role->add_cap( 'read_private_posts' ); 
$role->add_cap( 'edit_posts' );
}
add_action( 'after_setup_theme', 'enable_view_drafts');

J'ai aussi essayé init hook au lieu de after_setup_theme . Pas de chance.

D'après ce que j'ai compris, les modifications apportées aux rôles sont enregistrées dans la base de données; elles ne doivent donc être effectuées qu'une seule fois. C'est pourquoi j'utilise after_setup_theme hook pour appeler la fonction.

Mais lorsque j'essaie d'accéder à la page en tant qu'utilisateur normal, on me montre une page 404 au lieu d'afficher le contenu du message. J'ai également essayé de charger l'URL d'aperçu ( site.com/?p=212&preview=true ), mais cela ne fonctionnait pas non plus.

Ce sont mes suppositions:

  • l'utilisateur normal n'a pas assez de caps pour lire le brouillon.
  • tester et afficher des brouillons sur le front-end n’est pas possible pour les utilisateurs (administrateurs compris).

Quels changements dois-je effectuer pour accomplir ce que j'essaie de faire? Si ce n’est pas possible, quelles solutions de rechange proposez-vous?

Remarque: je ne cherche pas de solutions basées sur des plugins.

    
posée Amal Murali 18.07.2013 - 22:14

6 réponses

12

Vous ne pouvez pas attribuer de fonctionnalités à des utilisateurs inconnus. Si vous souhaitez rendre un message visible pour tout le monde, créez une URL distincte pour ces messages et ajoutez un élément de contrôle à l'éditeur de publication pour permettre l'aperçu des publications sélectionnées uniquement.
Lorsque cette URL est appelée, vérifiez si un aperçu est autorisé pour le message et si le message n'a pas encore été publié. Assurez-vous également que les moteurs de recherche ignorent cette URL.

Pour l'URL, j'utiliserais un noeud final :

.
add_rewrite_endpoint( 'post-preview', EP_ROOT );

Vous pouvez maintenant créer des URL comme…

http://example.com/post-preview/123

… où 123 est l'identifiant de la publication.

Utilisez ensuite un gestionnaire de rappel pour inspecter l'ID de publication, vérifiez s'il est valide et écrasez la requête principale. C'est probablement le seul cas d'utilisation acceptable pour query_posts() . :)

Supposons que le point final est une classe T5_Endpoint (un modèle) et que le gestionnaire de sortie est une classe T5_Render_Endpoint (une vue) qui obtient le modèle passé plus tôt. Ensuite, il existe probablement une méthode render() appelée sur template_redirect :

public function render()
{
    $post_id = $this->endpoint->get_value();

    if ( ! $post_id )
        return;

    if ( 1 !== $this->meta->get_value( $post_id )
        or 'publish' === get_post_status( $post_id )
        )
    {
        wp_redirect( get_permalink( $post_id ) );
        exit;
    }

    $query = array (
        'suppress_filters' => TRUE,
        'p'                => $post_id,
        'post_type'        => 'any'
    );

    query_posts( $query );

    add_action( 'wp_head', 'wp_no_robots' );
}

$this->meta est un autre modèle (classe T5_Post_Meta ) pour la méta-valeur post qui contrôle si un aperçu est autorisé. Le contrôle est défini dans la zone Publier ( action post_submitbox_misc_actions ), rendue par une autre vue qui obtient la même méta classe.

Ainsi,T5_Post_Metasaitoùetquandstockerlaméta-valeur,lesvuesenfontquelquechose.
Enoutre, connectez-vous à transition_post_status pour supprimer le champ Méta de la publication lorsque celle-ci est publiée. Nous ne voulons pas gaspiller des ressources, non?

Ceci est juste un aperçu. Il y a beaucoup de détails à couvrir… J'ai écrit un petit plugin qui montre comment implémenter ceci: Aperçu public T5 .

    
réponse donnée fuxia 03.10.2013 - 19:05
5

J'ai résolu ce problème d'une manière qui me semblait plus simple que la réponse de @ toscho ci-dessus.

Mon cas d'utilisation est que j'utilise la même base de données pour un site intermédiaire intranet interne et un site destiné au public. Le workflow consiste en ce que les auteurs écrivent des brouillons et les partagent avec d'autres utilisateurs qui les consultent sur le site intranet, avant de publier. En particulier, je ne voulais pas obliger les relecteurs à se connecter pour voir les brouillons. Je ne dépend donc que de la constante ENV_PRODUCTION définie dans le fichier wp-config en fonction du nom d’hôte dans $_SERVER['SERVER_NAME'] . C’est ce que font les vérifications pour ENV_PRODUCTION ici; court-circuiter tous ces filtres si le site de production est en cours de visualisation.

C’est un peu étrange, car vous devez vous connecter après que WP_Query ait supprimé toutes les publications du tableau $ wp_query- > posts, mais cela me semble stable et sécurisé.

/*
 * On staging site home and archives, drafts should be visible.
 */
function show_drafts_in_staging_archives( $query ) {
    if ( ENV_PRODUCTION )
        return;

    if ( is_admin() || is_feed() )
        return;

    $query->set( 'post_status', array( 'publish', 'draft' ) );
}

add_action( 'pre_get_posts', 'show_drafts_in_staging_archives' );


/*
 * Make drafts visible on staging site single views.
 *
 * (Because on single views, WP_Query goes through logic to make sure the 
 * current user can edit the post before displaying a draft.)
 */
function show_single_drafts_on_staging( $posts, $wp_query ) {
    if ( ENV_PRODUCTION )
        return $posts;

    //making sure the post is a preview to avoid showing published private posts
    if ( ! is_preview() )        
        return $posts;

    if ( count( $posts ) )
        return $posts;

    if ( !empty( $wp_query->query['p'] ) ) {
        return array ( get_post( $wp_query->query['p'] ) );
    }
}

add_filter( 'the_posts', 'show_single_drafts_on_staging', 10, 2 );

Les filtres comportent deux parties distinctes.

  • Un filtre sur le crochet "pre_get_posts" définit le post_status par défaut sur "publier, brouillon" sur le site intermédiaire. Cela renverra les brouillons dans les listes d'archives.
  • Un filtre distinct est nécessaire pour les vues uniques, car la classe WP_Query contient une logique assez désagréable pour supprimer les brouillons des résultats de la requête, à moins que l'utilisateur en cours ne puisse les modifier. J'ai contourné ce problème en filtrant "the_posts" et en ajoutant le message que je voulais directement dans les résultats.
réponse donnée goldenapples 10.10.2014 - 22:38
0

Je pense que vous recherchez le plug-in "User Role Editor" disponible sur le site Web de WordPress.org. Au fait, pourquoi voulez-vous donner accès à vos brouillons à tout le monde? Personnellement, je ne peux pas penser à un cas où cela serait nécessaire.

    
réponse donnée Georgi Demirev 19.07.2013 - 03:27
0

Vous pouvez simplement changer la visibilité de la page / du message en "Privé" qui n'est visible que pour les éditeurs et les administrateurs et non pour les visiteurs publics, les moteurs de recherche, les flux rss, etc.

    
réponse donnée NickJAB 03.09.2013 - 00:09
0

Je pense que le commentaire de G.M. est le meilleur ici. Je suppose que vous essayez de faire ce qui suit:

  1. Écrire un message
  2. Enregistrer en tant que brouillon
  3. Autoriser un utilisateur externe (non connecté) à afficher le brouillon pour approbation
  4. publier

Est-ce correct?

Malheureusement, je ne vois pas de moyen simple de faire cela. Vous pouvez le poster en tant que message privé, afin qu’ils aient besoin de saisir un mot de passe pour le consulter, mais vous devez être connecté pour cela. Vous pouvez également le protéger par un mot de passe, mais il apparaîtra toujours dans votre flux et la liste des publications récentes, etc. Ne pourriez-vous pas créer un compte d'utilisateur invité et leur donner le nom d'utilisateur / mot de passe lorsque vous leur donnez l'URL?

Lisez ici pour plus d'informations: enlace

Il existe également un plug-in qui pourrait répondre à vos besoins: enlace . J'ai jeté un coup d'œil au code et il semble que le développeur modifie la valeur renvoyée par get_post_status afin que vous puissiez jouer avec cela:

enlace

HTH

    
réponse donnée TomC 24.09.2013 - 08:01
0

Si vous ne vous souciez pas de savoir si le message est "publié" ou pas, voulez-le simplement qu'il soit accessible à quiconque à l'URL régulièrement publiée et qu'il n'apparaît pas sur la page principale / résultats de la recherche / flux rss, etc., ce plugin a fonctionné WP 4.6.1 et vous permet d’ajuster précisément l’affichage d’un message:

enlace

    
réponse donnée Sarah Northway 29.10.2016 - 01:36

Lire d'autres questions sur les étiquettes