Как полностью отключить архив таксономии на интерфейсе?
Я зарегистрировал три пользовательские таксономии. Все три из этих пользовательских таксономий прикреплены к моему пользовательскому типу записи.
Существует только одна таксономия из трех зарегистрированных, и я бы хотел, чтобы она никогда не была доступна на веб-сайте.
Какое лучшее решение для этого?
Я играл с указанием различных аргументов при регистрации таксономии, но, похоже, ничего не работает.
$args['show_in_nav_menus'] = false;
$args['query_var'] = false;
$args['public'] = false;
Должен ли я просто подключитесь к template_redirect
и выполните проверку is_tax()
? Если я хочу отключить таксономию, просто перенаправьте ее в архив пользовательских типов записей?
4 answers
Ответ S_ha_dum не сработал для меня, но это сработало:
/**
* Completely disable term archives for this taxonomy.
* @param string $taxonomy WordPress taxnomy name
*/
function kill_taxonomy_archive($taxonomy){
add_action('pre_get_posts', function($qry) {
if (is_admin()) return;
if (is_tax($taxonomy)){
$qry->set_404();
}
}
);
}
Таксономия WordPress предоставляет гибкие возможности для настройки ее свойств при регистрации. Чтобы отключить архивы таксономии WordPress, установите "общедоступный" как "ложный", как показано в приведенном ниже примере кода. Это приведет к удалению ссылки действия "Просмотр" с экрана таксономии, а также перенаправит пользователя на домашнюю страницу веб-сайта при попытке получить доступ к URL-адресу таксономии вручную.
Пример
// Register Custom Taxonomy
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Taxonomies', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Taxonomy', 'Taxonomy Singular Name', 'text_domain' ),
'menu_name' => __( 'Taxonomy', 'text_domain' ),
'all_items' => __( 'All Items', 'text_domain' ),
'parent_item' => __( 'Parent Item', 'text_domain' ),
'parent_item_colon' => __( 'Parent Item:', 'text_domain' ),
'new_item_name' => __( 'New Item Name', 'text_domain' ),
'add_new_item' => __( 'Add New Item', 'text_domain' ),
'edit_item' => __( 'Edit Item', 'text_domain' ),
'update_item' => __( 'Update Item', 'text_domain' ),
'view_item' => __( 'View Item', 'text_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
'add_or_remove_items' => __( 'Add or remove items', 'text_domain' ),
'choose_from_most_used' => __( 'Choose from the most used', 'text_domain' ),
'popular_items' => __( 'Popular Items', 'text_domain' ),
'search_items' => __( 'Search Items', 'text_domain' ),
'not_found' => __( 'Not Found', 'text_domain' ),
'no_terms' => __( 'No items', 'text_domain' ),
'items_list' => __( 'Items list', 'text_domain' ),
'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => false, // Set it to false, which will remove View link from backend and redirect user to homepage on clicking taxonomy link.
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
);
Я не уверен, почему @chris-herbert написал это так, как он это сделал, но если вы добавите это в свой файл функций, это заставит любую навигацию по этому архиву перейти на вашу страницу 404.
add_action('pre_get_posts', 'kill_taxonomy_archive');
function kill_taxonomy_archive($qry) {
if (is_admin()) return;
if (is_tax('tax-slug')){
$qry->set_404();
}
}
Чтобы гарантировать, что ваша таксономия никогда не запрашивается на интерфейсе, вы можете удалить ее из всех интерфейсных запросов.
add_action(
'pre_get_posts',
function($qry) {
if (is_admin()) return;
$kill = 'genre'; // kill this taxonomy
$tax_query = $qry->get('tax_query');
if (empty($tax_query)) return;
$relation = false;
if (isset($tax_query['relation'])) {
$relation = $tax_query['relation'];
unset($tax_query['relation']);
}
foreach ($tax_query as $k => &$tax) {
if (isset($tax['taxonomy']) && 'genre' === $tax['taxonomy']) {
unset($tax_query[$k]);
}
}
if (1 < count($tax_query)) {
$tax_query['relation'] = $relation;
}
$qry->set('tax_query',$tax_query);
}
);
Использование замыкания должно затруднить удаление обратного вызова.
Вы также можете реализовать перенаправление, как вы предполагали, но это не помешает вторичным запросам в шаблонах страниц или виджетах извлекать таксономию или может вызвать проблемы, если вы попытаетесь перенаправить в конце загрузки страницы.