Исключите конкретный слиток в разделе "условия получения"
У меня есть пользовательская таксономия "роль" для моего пользовательского типа сообщений "Люди".
При перечислении ролей есть ли способ исключить роли на основе 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']
, но я не знаю, где подогнать эту строку, если вообще где-нибудь.
Любая помощь - это ценю!
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;?>
В 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 );