WordPress – Rendre automatiquement privé un post appartenant à une catégorie précise

Cet article a 333 jours. Il commence à dater, lisez-le donc en gardant son âge en tête ! Merci

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 :

  1. Vérifier si on publie un CTP « meeting » et si celui-ci n’est pas déjà privé,
  2. Récupérer la catégorie du post,
  3. Vérifier si le post appartient à une des catégories « privées »,
  4. Créer un tableau des informations à mettre à jour,
  5. 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');

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 !

12 commentaires et un trackback sur “WordPress – Rendre automatiquement privé un post appartenant à une catégorie précise”

  1. 25 juin 2012

    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

  2. Geoffrey dit :
    26 juin 2012

    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.

  3. 26 juin 2012

    Ok super, je garde sous le neurone et je RT ça de suite ;)

  4. Geoffrey dit :
    26 juin 2012

    Merci pour le RT Julio ! :)

  5. GeekPress dit :
    28 juin 2012

    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 :

    add_filter('wp_insert_post_data', 'juiz_auto_cat_to_private');
    function juiz_auto_cat_to_private( $data ) {
     	 // on récupère la catégorie du post
         $categories = get_the_category( $_POST['ID'] );
         // on liste les catégories "privées" (3 et 6 étant les identifiants)
         $auto_private_cat = array(3, 16);
         // si la catégories sélectionnées est "privée"
         if( in_array( $categories[0]->cat_ID, $auto_private_cat ) ) {
            // On met à jour le statut
            $data['post_status'] = 'private';
         }
      return $data;
    }
  6. 28 juin 2012

    $_POST['post_ID'] plutôt non ?

  7. Geoffrey dit :
    29 juin 2012

    @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 !

  8. 29 juin 2012

    C’est traitre, en BDD c’est bien « ID » mais dans les formulaire c’est « post_ID » !
    Bien vu Jo pour cette opti ! #smafaute

  9. GeekPress dit :
    29 juin 2012

    Sûr pour post_ID ? J’avais testé avec ID et ça avait l’air de fonctionner.

  10. Geoffrey dit :
    29 juin 2012

    @GeekPress : je viens de checker c’est sûr que post_ID fonctionne, mais je n’ai pas testé avec ID à la place.

  11. Cristophe dit :
    3 juillet 2012

    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:-)

  12. Geoffrey dit :
    3 juillet 2012

    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 ;)

Laisser un commentaire

Certains codes HTML ne sont pas échappés automatiquement. Pour afficher du code dans votre commentaire, merci d'échapper vos chevrons en utilisant "&lt;" et "&gt;" en lieu et place de "<"" et ">".

Il est difficile de proposer un support pour tous les articles de ce blog. En ne fournissant pas un moyen de consulter votre code bogué, vous vous assurez de ne pas avoir de réponse adaptée.

Les sites qui en parlent

 
Le studio web