Désolé pour le titre à rallonge, je n’ai pas trouvé plus court. J’ai eu besoin pour un client de rendre privé un post lorsqu’il était publié dans certaines catégories. L’idée initiale étant de lui simplifier la tâche et d’éviter les erreurs de publication.
Le hook
WordPress prévoit un hook qui permet d’intervenir au moment où un post est publié : publish_post
.
Les paramètres de ce hook permettent d’obtenir des informations sur le post publié.
Il est possible d’utiliser ces informations pour effectuer une mise à jour du status du post en fonction de conditions précises.
La fonction
Imaginez le scénario suivant :
L’utilisateur doit voir son Custom Post Type « meeting » placé automatiquement en privé lorsqu’il coche la catégorie « direction » (identifiant 3) ou la catégorie « membres » (identifiant 16). (je vous laisse imaginer le contexte, c’est juste pour illustrer)
Ce qu’il faut que l’on fasse :
- Vérifier si on publie un CPT « meeting » et si celui-ci n’est pas déjà privé,
- Récupérer la catégorie du post,
- Vérifier si le post appartient à une des catégories « privées »,
- Créer un tableau des informations à mettre à jour,
- Mettre le post à jour
Ce qui nous donne un code plutôt court :
if ( !function_exists('juiz_auto_cat_to_private') ) {
function juiz_auto_cat_to_private($data) {
// si notre post est de type "meeting"
if ( $data['post_type'] == "meeting" ) {
// on récupère la catégorie du post
$categories = get_the_category( $_POST['post_ID'] );
// on liste les catégories "privées" (3 et 6 étant les identifiants)
$auto_private_cat = array(3, 16);
// si la catégorie sélectionnée est "privée"
if( in_array( $categories[0]->cat_ID, $auto_private_cat ) ) {
// on met à jour le statut
$data['post_status'] = 'private';
}
}
// on retourne les données pour finir l'enregistrement
return $data;
}
add_filter('wp_insert_post_data','juiz_auto_cat_to_private');
Ce code est à placer dans le fichier functions.php
de votre thème, ou dans un fichier de plugin si vous savez comment procéder 😉
Merci à Jonathan de GeekPress pour ses conseils d’optimisation 😉
Mise à jour : Seconde optimisation du code grâce à GeekPress et l’œil de Lynx de BoiteÀWeb
Merci !
Hello sympa l’astuce. Que se passe t’il pour un article déjà publié sans ces catégories privées puis mis à jour ensuite ? À bientôt
Hello Julio,
Navré pour le délai de réponse.
Un article présent dans une catégorie « classique », déjà publié, puis qui passerait dans une catégorie privée au moment d’une mise à jour serait automatiquement mis en privé.
Le script fonctionne bien pour cela 🙂
Merci.
Ok super, je garde sous le neurone et je RT ça de suite 😉
Merci pour le RT Julio ! 🙂
Bonne astuce 🙂
J’ai trouvé plus optimisé. En fait tu fais une autre requête SQL après que l’on est sauvegardé l’article.
En fait, il faut intercepter la catégorie juste avant l’insertion en BDD avec le hook wp_insert_post_data
Voici le code correspondant :
$_POST['post_ID']
plutôt non ?@GeekPress : oui voilà c’est exactement ce que je cherchais la dernière fois ! Merci 🙂
@Julio : je confirme, après testouillage de la chose c’est bien
'post_ID'
Merci les gars !
C’est traitre, en BDD c’est bien « ID » mais dans les formulaire c’est « post_ID » !
Bien vu Jo pour cette opti ! #smafaute
Sûr pour post_ID ? J’avais testé avec ID et ça avait l’air de fonctionner.
@GeekPress : je viens de checker c’est sûr que post_ID fonctionne, mais je n’ai pas testé avec ID à la place.
Bonjour,
Plutôt que de gérer les identifiants des catégories privées en dur dans le code, n’y aurait-il pas moyen d’avoir quelque part dans la base l’information « catégorie privée » ? Avec bien sûr une interface sympathique pour gérer ça. Oui je sais je suis exigeant. d:-)
Hello,
Si bien sûr que c’est possible, mais ça demande la création d’une page de gestion dans l’espace d’administration avec un enregistrement en options des catégories rendues privées.
Ce n’est pas vraiment l’objectif de cet astuce, mais c’est possible sans trop de difficulté lorsqu’on connait le système.
Je verrais pour créer un petit plugin si le temps me le permet 😉