web-dev-qa-db-fra.com

Exclure un slug spécifique dans 'get_terms'

J'ai une taxonomie personnalisée "rôle" pour mon type de message personnalisé "Personnes".

Lors de la liste des rôles, existe-t-il un moyen d'exclure des rôles basés sur slug et non sur ID via la fonction get_terms?

Je pose la question parce que je gère un site multisite et que quelques sites Web ont les mêmes identifiants que ceux que je souhaite exclure.

En ce moment j'ai:

<?php
$roles = get_terms(
    'role', array(
    'orderby'       => 'ID',
    'order'         => 'ASC',
    'hide_empty'    => true,
    'exclude'       => array('58', '63', '833'),
    ));
$count_roles = count($roles);
if ( $count_roles > 0 ) : ?>
     //do stuff
<?php endif;?>

Les slugs que je voudrais exclure sont les suivants: 'slug' => ['graduate', 'job-market-candidate', 'graduate-student','research'], mais je ne sais pas où adapter cette ligne, si nulle part.

Toute aide est appréciée!

3
timmyg

La fonction get_terms() ( see docs ) accepte les mêmes arguments que WP_Term_Query ( see docs )
Vous devez d'abord obtenir ces identifiants de termes, puis les transmettre à l'argument exclude:

// default to not exclude terms
$ids_to_exclude = array();
$get_terms_to_exclude =  get_terms(
    array(
        'fields'  => 'ids',
        'slug'    => array( 
            'graduate', 
            'job-market-candidate', 
            'graduate-student',
            'research' ),
        'taxonomy' => 'role',
    )
);
if( !is_wp_error( $get_terms_to_exclude ) && count($get_terms_to_exclude) > 0){
    $ids_to_exclude = $get_terms_to_exclude; 
}
$roles = get_terms(
    array(
        'orderby'    => 'ID',
        'order'      => 'ASC',
        'hide_empty' => true,
        'exclude'    => $ids_to_exclude,
        'taxonomy'   => 'role',
    )
);

$count_roles = count($roles);

if ( $count_roles > 0 ) : ?>
     //do stuff
<?php endif;?>
4
Pabamato

Il n'y a pas d'option à exclure par slug dans get_terms(). Vous devrez obtenir les identifiants des termes de votre choix en fonction de leur slug, then / exclure ces identifiants, comme dans la réponse de Pabamato.

Mais vous obtiendrez probablement de meilleures performances que de les ignorer en sortie, plutôt que de ralentir la requête avec la variable exclude ou de créer des requêtes supplémentaires.

$count_roles = count( $roles );

if ( $count_roles > 0 ) :
    $exclude = ['graduate', 'job-market-candidate', 'graduate-student','research'];

    foreach ( $roles as $role ) {
        if ( ! in_array( $role->slug, $exclude ) ) {
            continue;
        }

        // Do stuff.
    }
endif;

Ou vous pouvez supprimer les termes pertinents du jeu de résultats après les avoir récupérés en utilisant array_filter() , puis procédez normalement.

$exclude = ['graduate', 'job-market-candidate', 'graduate-student','research'];

$roles = get_terms( array(
    'taxonomy'   => 'role',
    'orderby'    => 'ID',
    'order'      => 'ASC',
    'hide_empty' => true,
) );

$roles = array_filter( $roles, function( $role ) {
    return in_array( $role->slug, $exclude ) ? false : true;
} );

$count_roles = count( $roles );
2
Jacob Peattie