web-dev-qa-db-fra.com

Ajout automatisé d'un tag à tous les articles d'une catégorie

Je suis en train de refondre un site qui compte plus de 700 publications, réparties dans environ 150 catégories différentes. Certaines catégories ont 2 postes, d’autres 70.

Maintenant, pour chaque catégorie, je veux ajouter un tag à tous les articles de cette catégorie.

Est-ce que quelqu'un sait s'il existe un moyen d'ajouter automatiquement une étiquette spécifique à tous les articles d'une catégorie?

Ou est-ce le seul moyen de parcourir tous les messages individuellement et d’ajouter un tag à chacun d’eux?

Toute aide très appréciée!

3
Squrler

Un bon point de départ est (comme toujours) la référence de la fonction Codex.

Il existe une petite fonction intéressante qui peut être utilisée pour ajouter des balises ou des catégories (ou une taxonomie intégrée ou personnalisée) à un message: wp_set_object_terms(); . Peut-être que wp_set_post_terms(); est plus facile à utiliser. De plus amples explications peuvent être trouvées quand vous suivez le lien.

Il y a plusieurs façons de le faire: Ajouter en masse avec récupérer toutes les publications (par exemple d'une catégorie) avec get_posts(); (ou d'autres requêtes), puis parcourir en boucle tous les objets de publication donnés et ajouter les balises nécessaires. Vous pouvez également essayer d’ajouter des options d’édition en bloc à votre interface d’administrateur, mais dans votre cas, j’aimerais utiliser la méthode la plus simple et écrire une petite fonction agréable qui ajoute vos balises à une catégorie et une autre pour vérifier si elle a été ajoutée. Ensuite, passez à la catégorie suivante. Écrire une fonction personnalisée qui capture toutes les balises ajoutées (true/false) et la vérification ultérieure ne serait pas très utile. Plonger dans une belle table à l'arrêt ne ferait pas de mal:

function wpse31531_add_tags()
{
    global $_dump_tag_check;

    // the following array can contain any taxonomy. But you have to name it inside wp_set_post_terms. If you need to add tags, use 'post_tag' as 3rd argument.
    $tags = array( 'YOUR TAG NAME A HERE', 'YOUR TAG NAME B HERE' );

    $args = array( 'post_type' => 'post', 'numberposts' => -1, 'post_status' => published );
    $posts = get_posts( $args );
    foreach ( $posts as $post )
    {
        $check = wp_set_post_terms( intval( $post->ID ), $tags, 'post_tag', true ); // set last value to false if you want to replace existing tags.
        $_dump_tag_check[ $post->ID ]['tags'] = $check ? explode( ", ", $tags ) : 'failed';
    }
}
add_action( 'init', 'wpse31531_add_tags' );


function wpse31531_dump_tag_check()
{
    echo '<table><thead><tr><th>Post ID</th><th>Tags</th></tr></thead><tbody>';
    foreach ( $GLOBALS['_dump_tag_check'] as $ID => $check )
        echo "<tr><td>{$ID}</td><td>{$check['tags']}</td></tr>";
    echo '</tbody></table>';
}
add_action( 'wpse31531_dump_tag_check', 'shutdown' );

Lorsque vous lisez des pages de codex liées, vous verrez que le code ci-dessus ne fonctionnera pas immédiatement et ressemblera davantage à un guide approximatif. Il serait très apprécié que vous puissiez modifier ma réponse avec votre code de travail pour les lecteurs ultérieurs. Merci.

2
kaiser