Как полностью отключить архив таксономии на интерфейсе?


Я зарегистрировал три пользовательские таксономии. Все три из этих пользовательских таксономий прикреплены к моему пользовательскому типу записи.

Существует только одна таксономия из трех зарегистрированных, и я бы хотел, чтобы она никогда не была доступна на веб-сайте.

Какое лучшее решение для этого?

Я играл с указанием различных аргументов при регистрации таксономии, но, похоже, ничего не работает.

$args['show_in_nav_menus'] = false;
$args['query_var'] = false;
$args['public'] = false;

Должен ли я просто подключитесь к template_redirect и выполните проверку is_tax()? Если я хочу отключить таксономию, просто перенаправьте ее в архив пользовательских типов записей?

Author: Michael Ecklund, 2014-04-05

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();
            }

        }

    );

}
 13
Author: Chris Herbert, 2015-11-29 22:36:39

Таксономия WordPress предоставляет гибкие возможности для настройки ее свойств при регистрации. Чтобы отключить архивы таксономии WordPress, установите "общедоступный" как "ложный", как показано в приведенном ниже примере кода. Это приведет к удалению ссылки действия "Просмотр" с экрана таксономии, а также перенаправит пользователя на домашнюю страницу веб-сайта при попытке получить доступ к URL-адресу таксономии вручную.

enter image description here

Пример

// 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, 
);  
 2
Author: Purvik Dhorajiya, 2020-09-01 11:37:39

Я не уверен, почему @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();
    }
}
 1
Author: Eric K, 2020-06-02 22:28:46

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

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

  }
);

Использование замыкания должно затруднить удаление обратного вызова.

Вы также можете реализовать перенаправление, как вы предполагали, но это не помешает вторичным запросам в шаблонах страниц или виджетах извлекать таксономию или может вызвать проблемы, если вы попытаетесь перенаправить в конце загрузки страницы.

 -2
Author: s_ha_dum, 2014-04-05 14:20:05