如何修改自定义帖子类型和分类或术语中的URL结构

时间:2012-10-09 作者:Michael Ecklund

我很清楚,有几个帖子涉及定制permalink URL structure 属于custom post types, custom taxonomies, 和taxonomy terms. 然而,它们都不是真正清楚的,不能正常工作,或者在其他地方引起问题。

这里有几个链接,已经“有点”覆盖了URL rewriting.

  1. How to create a permalink structure with custom taxonomies and custom post types like base-name/parent-tax/child-tax/custom-post-type-name
  2. Custom post types, taxonomies, and permalinks
  3. Mixing custom post type and taxonomy rewrite structures?

    1. 我希望创建一个永久链接URL结构,大致如下:

      帖子类型名称:汽车分类名称:经销商术语名称:本田帖子标题:123 Hot Rod Lane理想permalink URL结构的示例设置:

      Generic permalink structure:

      domain.com/post-type-name/taxonomy-name/term-name/post-title/

      More specific permalink structure:

      domain.com/cars/dealers/honda/123-hot-rod-lane/

      • /cars/ 需要作为post类型中每个postmade的存档列表进行访问
      • /cars/dealers/ 需要作为分类法中每个帖子的归档列表进行访问
      • /cars/dealers/honda/ 需要作为该分类术语中的每篇文章的存档列表进行访问
      • /cars/dealers/honda/123-hot-rod-lane/ 需要可以访问汽车定制立柱类型中立柱的矩形视图

      我只是想说清楚,所以在回答这个问题时,没有人做任何不必要的工作。除了为我的帖子类型、分类法和术语添加正确的重写规则之外,我不需要其他任何东西。这个问题直接涉及permalink URL rewriting, 与职位或档案清单无关。我只需要确保WordPress正确识别它们,同时使用条件调用,如is_post_type_archive()is_tax()is_singular(), 等

      我已经尝试过无数次,从这个网站上的无数问题/答案中。似乎什么都没用。

      这是我注册的自定义帖子类型和注册的自定义分类:

          public function register_custom_data(){
              /* Register a post type for Cars. */
              $labels = array(
                  \'name\' => _x(\'Cars\', \'post type general name\'),
                  \'singular_name\' => _x(\'Car\', \'post type singular name\'),
                  \'add_new\' => _x(\'Add New Car\', \'Car\'),
                  \'add_new_item\' => __(\'Add New Car\'),
                  \'edit_item\' => __(\'Edit Car\'),
                  \'new_item\' => __(\'New Car\'),
                  \'all_items\' => __(\'All Cars\'),
                  \'view_item\' => __(\'View Car\'),
                  \'search_items\' => __(\'Search Cars\'),
                  \'not_found\' =>  __(\'No Cars found\'),
                  \'not_found_in_trash\' => __(\'No Cars found in Trash\'), 
                  \'parent_item_colon\' => \'\',
                  \'menu_name\' => __(\'Cars\')
              );
              $args = array(
                  \'labels\' => $labels,
                  \'public\' => true,
                  \'publicly_queryable\' => true,
                  \'show_ui\' => true, 
                  \'show_in_menu\' => false, 
                  \'show_in_nav_menus\' => false,
                  \'can_export\' => true,
                  \'query_var\' => true,
                  \'rewrite\' => true,
                  \'menu_icon\' => NULL,
                  \'capability_type\' => \'post\',
                  \'has_archive\' => true, 
                  \'hierarchical\' => false,
                  \'menu_position\' => NULL,
                  \'supports\' => array(
                      \'title\', 
                      \'editor\', 
                      \'thumbnail\' 
                  ),
                  \'rewrite\' => array(
                      \'slug\' => \'cars\', 
                      \'with_front\' => true
                  )
              ); 
              register_post_type(\'mbe_cars\', $args);
      
              /* Car Dealers */
              $labels = array(
                  \'name\' => _x(\'Dealers\', \'taxonomy general name\'),
                  \'singular_name\' => _x(\'Dealer\', \'taxonomy singular name\'),
                  \'search_items\' =>  __(\'Search Dealers\'),
                  \'all_items\' => __(\'All Dealers\'),
                  \'parent_item\' => __(\'Parent Dealer\'),
                  \'parent_item_colon\' => __(\'Parent Dealer:\'),
                  \'edit_item\' => __(\'Edit Dealer\'), 
                  \'update_item\' => __(\'Update Dealer\'),
                  \'add_new_item\' => __(\'Add New Dealer\'),
                  \'new_item_name\' => __(\'New Dealer Name\'),
                  \'menu_name\' => __(\'Dealers\')
              ); 
      
              $args = array(
                  \'hierarchical\' => true,
                  \'labels\' => $labels,
                  \'show_ui\' => true,
                  \'query_var\' => true,
                  \'rewrite\' => array(
                      \'slug\' => \'dealers\',
                      \'hierarchical\' => true
                  )
              );
      
              register_taxonomy(\'mbe_car_dealers\', \'mbe_cars\', $args);
      
              /* Update urls. */
              flush_rewrite_rules();
          }
      

2 个回复
SO网友:Eric Holmes

我不确定这是否可能,或者这可能不是最好的方法。我的理由如下:

domain.com/post-type-name/taxonomy-name/term-name/post-title/

帖子可以附加到多个术语,因此本质上可以有多个指向同一帖子的链接:

domain.com/post-type-name/taxonomy-name/term-name/post-title/
domain.com/post-type-name/taxonomy-name/term2-name/post-title/
domain.com/post-type-name/taxonomy2-name/term3-name/post-title/
domain.com/post-type-name/post-title/
取决于你是如何到达那里的。

你一定可以domain.com/post-type-name/taxonomy-name/term-name/, 但我认为,在WordPress中拥有如此长的URI可能没有完全意义。

我认为这有两个原因:

多个分类术语(更不用说附加到自定义帖子类型或任何帖子上的多个分类)的可能性会创建大量重叠链接,以及更多破坏书签的可能性,比如我的书签/cars/dealers/honda/123-hot-rod, 但后来你意识到,这实际上不是本田,而是丰田——你改变了与这篇文章相关的税收术语,就会打破这种联系。不太可能发生,但这是可能的。

坦率地说,它对用户不太友好。并不是说普通用户关注他们所在的web路径,而是更容易记住domain.com/cars/93-saturn-ion 比记忆(或理解)更重要domain.com/cars/dealers/wonderland-auto/93-saturn-ion.

当你在那篇文章的页面上时,大多数主题中的默认“over\\u nav”包括分类术语以及页面标题下方的日期,因此信息仍然以更清晰和可用的方式存在。

示例:

123 Hot Rod

2012年11月2日发布于Wonderland Used Cars

SO网友:David

我不想将此作为答案提交,但是,这是一个连接分类法和术语的令人惊讶的小片段。

add_filter(\'request\', \'add_tags_and_categories\');  
  function add_tags_and_categories($q) {
    if (isset($q[\'your_term_or_tax\']) || isset($q[\'category_name\'])) {
    $q[\'post_type\'] = \'your_custom_post\';   
      return $q;
  }  
return $q;
}
我希望这能帮助你找到答案。我通常使用它将我的自定义帖子类型链接到/标签/&/类别/内置,如:

add_filter(\'request\', \'add_tags_and_categories\');  
 function add_tags_and_categories($q) {
   if (isset($q[\'tag\']) || isset($q[\'category_name\'])) {
     $q[\'post_type\'] = get_post_types();

            return $q;
   }

 return $q;
}
干杯!

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?