Исключить несколько пользовательских терминов таксономии из поиска WordPress

Я исключаю из результатов поиска WordPress любые сообщения или пользовательские сообщения с пользовательскими таксономиями, настроенными на конкретные условия. Я хочу иметь возможность добавлять больше таксономий и терминов просто (как в массиве), не дублируя функцию, и гарантируя, что я делаю это эффективно.

Кто-нибудь может предложить более чистую функцию, которая приспосабливает это?

/* Exclude from WordPress Search using custom taxonomy */
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}

// Exclude Terms by ID from Search and Archive Listings
if ( is_search() || is_tax( 'marque' ) ) {
$tax_query = array([
'taxonomy' => 'site_search',
'field' => 'term_id',
'terms' => [ exclude_page ],
'operator' => 'NOT IN',
]);

$query->set( 'tax_query', $tax_query );
}
}, 11, 1 );


/* Exclude from WordPress Search using custom taxonomy */
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}

// Exclude Terms by ID from Search and Archive Listings
if ( is_search() || is_tax( 'marque' ) ) {
$tax_query = array([
'taxonomy' => 'job_status',
'field' => 'term_id',
'terms' => [ closed ],
'operator' => 'NOT IN',
]);

$query->set( 'tax_query', $tax_query );
}
}, 11, 1 );

3

Решение

Сначала вы можете попытаться определить все ваши данные в массиве как пары таксономий / терминов. (Я встроил массив во внешнюю функцию, но его можно добавить непосредственно в подключенную функцию). Таким образом, вы можете легко добавлять или удалять данные.

Затем мы используем цикл foreach для чтения и установки данных в налоговом запросе. Так что ваш код будет выглядеть примерно так:

// HERE set in the array your taxonomies / terms pairs
function get_custom_search_data(){
return [
'site_search' => [ 'exclude_page' ],
'job_status'  => [ 'closed' ],
];
}

/* Exclude from WordPress Search using custom taxonomy */
add_action( 'pre_get_posts', 'multiple_taxonomy_search', 33, 1 );
function multiple_taxonomy_search( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}

// Exclude Terms by ID from Search and Archive Listings
if ( is_search() || is_tax( 'marque' ) ) {
// Set the "relation" argument if the array has more than 1 custom taxonomy
if( sizeof( get_custom_search_data() ) > 1 ){
$tax_query['relation'] = 'AND'; // or 'OR'
}

// Loop through taxonomies / terms pairs and add the data in the tax query
foreach( get_custom_search_data() as $taxonomy => $terms ){
$tax_query[] = [
'taxonomy' => $taxonomy,
'field' => 'slug', // <== Terms slug seems to be used
'terms' => $terms,
'operator' => 'NOT IN',
];
}

// Set the defined tax query
$query->set( 'tax_query', $tax_query );
}
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Не проверено, это должно работать.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]