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 CPT « 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');

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 !