J'ai plusieurs messages non publiés sur mon site Wordpress et j'essaie de le rendre accessible aux utilisateurs normaux (qui ne sont pas connectés) en utilisant les slugs de publication normaux ( site.com/post-here
). Je comprends que ce n'est peut-être pas la meilleure pratique, mais pour mon objectif particulier, cela doit être fait.
J'ai essayé d'ajouter l'extrait de code suivant dans mon functions.php
fichier:
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 également essayé le init
crochet au lieu de after_setup_theme
. Pas de chance.
D'après ce que je comprends, les modifications apportées aux rôles sont enregistrées dans la base de données et 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, une page 404 s'affiche au lieu d'afficher le contenu du message. J'ai également essayé de charger l'URL de prévisualisation ( site.com/?p=212&preview=true
) mais cela n'a pas fonctionné non plus.
Ce sont mes suppositions:
- l'utilisateur normal n'a pas assez
caps
pour lire le brouillon. - tester et afficher les brouillons de messages sur le front-end n'est possible pour aucun utilisateur (y compris les administrateurs).
Quels changements dois-je apporter pour accomplir ce que j'essaie de faire? Si ce n'est pas possible, quelles solutions alternatives proposez-vous?
Remarque: je ne recherche pas de solutions basées sur des plugins.
la source
Réponses:
Vous ne pouvez pas attribuer de capacités à des utilisateurs inconnus. Si vous souhaitez rendre une publication visible pour tout le monde, créez une URL distincte pour ces publications et ajoutez un élément de contrôle à l'éditeur de publication pour activer l'aperçu uniquement sur les publications sélectionnées.
Lorsqu'une telle URL est appelée, vérifiez si un aperçu est autorisé pour la publication et si la publication n'a pas déjà été publiée. Assurez-vous également que les moteurs de recherche ignorent cette URL.
Pour l'URL, j'utiliserais un point de terminaison :
Vous pouvez maintenant créer des URL comme…
… Où
123
est l'identifiant du message.Utilisez ensuite un gestionnaire de rappel pour inspecter l'ID de publication, vérifiez s'il est valide et remplacez la requête principale. C'est probablement le seul cas d'utilisation acceptable pour
query_posts()
. :)Disons que le point de terminaison est une classe
T5_Endpoint
(un modèle) et que le gestionnaire de sortie est une classeT5_Render_Endpoint
(une vue) qui obtient le modèle passé plus tôt. Ensuite, il existe probablement une méthoderender()
appeléetemplate_redirect
:$this->meta
est un autre modèle (classeT5_Post_Meta
) pour la valeur méta post qui contrôle si un aperçu est autorisé. Le contrôle est défini dans la zone Publier ( actionpost_submitbox_misc_actions
), rendu par une autre vue qui obtient la même méta-classe.Alors
T5_Post_Meta
sait où et quand stocker la méta-valeur, les vues en font quelque chose.En outre, connectez-vous
transition_post_status
pour supprimer le champ méta de publication lorsque la publication est publiée. Nous ne voulons pas gaspiller des ressources, non?Ce n'est qu'un aperçu. Il y a beaucoup de détails à couvrir… J'ai écrit un petit plugin qui montre comment l'implémenter: T5 Public Preview .
la source
J'ai résolu ce problème de ce que je pensais être une manière 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 de transfert intranet interne et un site accessible au public, et le flux de travail est que les auteurs rédigent des brouillons et les partagent avec d'autres utilisateurs qui consultent ces brouillons sur le site intranet, avant de les publier. Je ne voulais pas spécifiquement que les réviseurs se connectent pour voir les brouillons, donc je ne fais que dépendre d'une constante,
ENV_PRODUCTION
qui est 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érificationsENV_PRODUCTION
ici; il suffit de court-circuiter tous ces filtres si le site de production est affiché.C'est un peu bizarre, car vous devez vous connecter après que WP_Query a supprimé tous les messages du tableau $ wp_query-> posts, mais cela me semble stable et sécurisé.
Les filtres comportent deux parties distinctes.
la source
ENV_PRODUCTION
constante si vous êtes en production. J'utilisais domain.com pour la production et staging.domain.com pour la mise en scène, donc ma ligne étaitdefine( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
Est-ce que cela aide?Je pense que le plugin "User Role Editor" disponible sur le site Web de WordPress.org pourrait être ce que vous recherchez. 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.
la source
Vous pouvez simplement changer la visibilité sur la page / publication en "Privé", qui n'est visible que par les éditeurs et les administrateurs et non par les visiteurs publics, les moteurs de recherche, les flux rss, etc.
la source
Je pense que le commentaire de GM est le meilleur ici. Je suppose que vous essayez de faire ce qui suit:
Est-ce exact?
Malheureusement, je ne vois pas de moyen simple de le faire. Vous pouvez le publier en tant que publication privée afin qu'ils aient besoin d'entrer un mot de passe pour le voir, mais vous devez être connecté pour cela. Vous pouvez également le protéger par mot de passe, mais il apparaîtra toujours dans votre flux et votre liste de messages récents, 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: http://codex.wordpress.org/Content_Visibility
Alternativement, il existe un plugin qui pourrait répondre à vos besoins: http://wordpress.org/extend/plugins/shareadraft/ J'ai jeté un rapide coup d'œil au code et il semble que le développeur modifie la valeur retournée par get_post_status afin que vous soyez capable de jouer avec ça:
http://codex.wordpress.org/Function_Reference/get_post_status
HTH
la source
Si vous ne vous souciez pas si la publication est "publiée" ou non, vous voulez juste qu'elle soit accessible par n'importe qui à l'URL régulière publiée et n'apparaissant pas sur la page principale / les résultats de recherche / les flux rss, etc., ce plugin fonctionnait avec WP 4.6. 1 et vous permet d'affiner où apparaît un message:
https://wordpress.org/plugins/wp-hide-post/
la source