web-dev-qa-db-fra.com

Exclure la catégorie par slug pour chaque boucle

J'essaie d'exclure certaines catégories d'une boucle for.

<?php $categories = get_categories(array('exclude' => 'apps, windows')); ?>

<?php foreach ($categories as $category) : ?>
    // the_loop
<?php endforeach; ?>

Même si aucune erreur n'est générée, cela ne fonctionne pas: toutes les catégories sont utilisées dans la boucle. Comment puis-je exclure certaines catégories par slug?

Je travaille avec plusieurs sites qui ont des identifiants de chat différents mais la même slug. Je dois donc filtrer par slug plutôt que par identifiant de chat.


Pour les futurs lecteurs: Pieter Goosen a répondu à cette question et une autre en une réponse fusionnée ici .

2
Bram Vanroy

Comme je l'ai déjà dit, directement du codex

exclure

(chaîne) Exclut une ou plusieurs catégories de la liste générée par wp_list_categories. Ce paramètre prend une liste de catégories séparées par des virgules, par identifiant unique, par ordre croissant.

Comme vous l'avez dit, vous devez utiliser la catégorie slug. Pour rendre cela possible et dynamique, je pense que le mieux sera d’écrire votre propre fonction d’emballage pour y parvenir. Nous allons utiliser get_terms() (utilisé par get_categories() en interne) pour obtenir nos catégories et get_term_by() pour obtenir l'ID de catégorie afin que nous puissions le transmettre à get_terms()

Voici la fonction, je l’ai bien commentée pour une meilleure compréhension (requiert PHP 5.4+)

function exclude_term_by( $taxonomy = 'category', $args = [], $exclude = [] )
{
    /*
     * If there are no term slugs to exclude or if $exclude is not a valid array, return get_terms
     */
    if ( empty( $exclude ) || !is_array( $exclude ) )
        return get_terms( $taxonomy, $args );

    /*
     * If we reach this point, then we have terms to exclude by slug
     * Simply continue the process. 
     */ 
    foreach ( $exclude as $value ) {

            /*
             * Use get_term_by to get the term ID and add ID's to an array
             */
            $term_objects = get_term_by( 'slug', $value, $taxonomy );
            $term_ids[] = (int) $term_objects->term_id;

    }

    /*
     * Set up the exclude parameter with an array of ids from $term_ids
     */
    $excluded_ids = [
        'exclude' => $term_ids
    ];

    /*
     * Merge the user passed arguments $args with the excluded terms $excluded_ids
     * If any value is passed to $args['exclude'], it will be ignored
     */
    $merged_arguments = array_merge( $args, $excluded_ids );

    /*
     * Lets pass everything to get_terms
     */
    $terms = get_terms( $taxonomy, $merged_arguments ); 

    /*
     * Return the results from get_terms
     */
    return $terms;
}

Avant de commencer, voici quelques notes.

  • Le premier paramètre, $taxonomy, est la taxonomie particulière à transmettre à get_terms() dans la fonction. La valeur par défaut est category.

  • Le deuxième paramètre, $args, prend les mêmes paramètres que get_terms(). Juste une remarque, si le troisième paramètre est défini, la valeur par défaut du paramètre exclude est ignorée si quelque chose lui est passé. Cette valeur sera remplacée par tout ce qui est passé à $exclude. Si rien n'est passé à ce paramètre et que rien n'est passé à $exclude, vous devez passer un tableau vide en tant que valeur.

  • Le troisième paramètre, $excludes, prend un tableau de slugs à exclure. Si la valeur n'est pas un tableau valide, get_terms() sera renvoyé sans exclure les termes nécessaires. Veillez donc à transmettre un tableau de slugs.

  • Traitez la sortie de la fonction comme vous le feriez avec get_terms(). N'oubliez pas que vous devez également vérifier les valeurs vides et les objets WP_Error avant d'utiliser la valeur de la fonction

  • Modifier et abuser du code comme bon vous semble

Maintenant, pour l'utilisation dans vos fichiers de modèle. Notez le tableau vide passé au paramètre $args si quelque chose est passé au paramètre $exclude

$terms = exclude_term_by( 'category', [], ['term-slug-one', 'term-slug-two'] );
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
    ?><pre><?php var_dump($terms); ?></pre><?php
}   

Pour toute information supplémentaire sur l'utilisation, voir get_terms().

2
Pieter Goosen

Il y a une petite erreur sur votre première ligne de code. Vous devez séparer chaque catégorie avec des guillemets dans le tableau. Donc, la première ligne devrait être:

<?php $categories = get_categories(array('exclude' => 'apps', 'windows')); ?>
0
impsart