Исключите конкретный слиток в разделе "условия получения"


У меня есть пользовательская таксономия "роль" для моего пользовательского типа сообщений "Люди".

При перечислении ролей есть ли способ исключить роли на основе slug, а не идентификатора с помощью функции get_terms?

Я спрашиваю, потому что я запускаю мультисайт, и несколько веб-сайтов имеют те же идентификаторы, что и те, которые я хотел бы исключить.

Прямо сейчас у меня есть:

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

Пули, которые я хотел бы исключить, это: 'slug' => ['graduate', 'job-market-candidate', 'graduate-student','research'], но я не знаю, где подогнать эту строку, если вообще где-нибудь.

Любая помощь - это ценю!

Author: timmyg, 2018-05-24

2 answers

В get_terms() ( см. Документы) функция принимает те же аргументы, что и WP_Term_Query( см. документы)
Вы должны сначала получить идентификаторы этих терминов, а затем передать их в exclude arg:

// 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;?>
 7
Author: Pabamato, 2018-06-01 17:45:26

В get_terms() нет возможности исключить с помощью slug. Вам нужно будет получить идентификаторы нужных терминов на основе их слага, затем исключить эти идентификаторы, как в ответе Пабамато.

Но у вас, вероятно, будет лучшая производительность, просто пропуская их при выводе, а не замедляя запрос с помощью exclude или выполняя дополнительные запросы.

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

Или вы можете удалить соответствующие термины из результирующего набора после их извлечения с помощью array_filter(), затем продолжайте как обычно.

$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
Author: Jacob Peattie, 2018-05-24 16:18:50