如何在前端完全禁用分类档案?

时间:2014-04-05 作者:Michael Ecklund

我已经注册了三个自定义分类法。所有这三种自定义分类都附加到我的自定义帖子类型。

在三个注册的分类法中,只有一个分类法,我不想在网站的前端访问这样的分类法。

这方面的最佳解决方案是什么?

在注册分类法时,我一直在尝试指定不同的参数,但似乎什么都不起作用。

$args[\'show_in_nav_menus\'] = false;
$args[\'query_var\'] = false;
$args[\'public\'] = false;
我是不是应该template_redirect 然后做一个is_tax() 检查如果我想禁用分类法,只需重定向到自定义post类型存档?

4 个回复
最合适的回答,由SO网友:Chris Herbert 整理而成

s\\u ha\\u 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();
            }

        }

    );

}

SO网友:Purvik Dhorajiya

WordPress分类法提供了在注册时设置其属性的灵活性。要禁用WordPress分类法归档,请设置"public""false" 如下面的示例代码所示。这将删除"View" 尝试手动访问分类法的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, 
);  

SO网友:Eric K

我不知道为什么@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();
    }
}

SO网友:s_ha_dum

为了保证您的分类永远不会在前端查询,您可以从所有前端查询中删除它。

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

  }
);
使用闭包会使回调难以删除。

您可能还希望按照自己的推测实现重定向,但这样做不会阻止页面模板或小部件中的二次查询检索分类法,或者如果您在页面加载的后期尝试重定向,可能会造成麻烦。

结束