有没有办法在Wordpress上创建重复的子类别slug?

时间:2015-01-27 11:56:13

标签: php wordpress categories slug

我为此疯狂搜索,但似乎无法找到这个问题的过时答案或实际有用的东西。

我的问题就像这个人在这个论坛帖子中描述的那个(从4岁开始,神圣 FOUR 年前!): https://wordpress.org/support/topic/duplicate-subcategory-slug-problem

我目前正在使用最新版本的Wordpress 4.1,而我正在努力实现的目标是:

假设我的网站上有2个类别,分别称为 Boots Shoes 。 在他们两个内部,我想创建一个名为红色的类别。这就是我的类别结构的样子:

 - Boots // -> URL: http://example.com/boots
 | ----- Red // -> URL: http://example.com/boots/red (GREAT!)

 - Shoes // -> URL: http://example.com/shoes
 | ----- Red // -> URL: http://example.com/shoes/red-shoes (cmon, wp, nooo !)

当我想要实现的目标时,是:

 - Boots // -> URL: http://example.com/boots
 | ----- Red // -> URL: http://example.com/boots/red

 - Shoes // -> URL: http://example.com/shoes
 | ----- Red // -> URL: http://example.com/shoes/red

这种方式会很完美!

如果你想知道,是的,我知道这只是wordpress的一部分而且他们不希望改变它,我理解为什么和所有那些爵士乐,是的。 但对于这个特殊的项目,我真的需要这个。

我想我可能不得不改变核心,如果我这样做就无法更新Wordpress,我知道,但如果我需要,我没有问题。

但是,如果有另一种方法来构成这个不涉及类别的层次结构并且不会破坏我的URI,我也可以尝试。任何帮助或提示都非常感谢,非常感谢!

2 个答案:

答案 0 :(得分:1)

如果您的子类别结构不比shoes/red更深(例如,不是shoes/red/hiking),则可以使用permalink endpoints来模拟类别。永久链接端点将从domain.com/request/url/?endpoint重写。

将每种颜色或类似颜色设置为EP_CATEGORY的端点后,类别网址可以加上/red/blue等后缀。将端点应用于EP_ALL_ARCHIVES也允许端点在CPT和日期存档上。

然后在过滤器或操作(例如template_include)中,您可以使用全局$wp_query对象读取附加的端点,并相应地过滤类别项。

如果用户为网址输入了另一个后缀(例如/red/hiking),$wp_query会将其识别为red => hiking的关键/值对({ {1}}作为查询变量中的原始查询字符串)(?red=hiking返回$wp_query -> get( 'red' );)。根据您实现逻辑的方式,这可能是好事也可能是坏事。

添加永久链接端点后,您需要使用函数hiking或转到管理面板永久链接管理部分并按一次更新来刷新安装的重写规则。

注意:您不能为端点使用动态名称。您需要为每个变体(红色,蓝色等)定义静态端点。

答案 1 :(得分:1)

我的分类法遇到了同样的问题,而且我已修复它,希望它有所帮助。

首先,您拥有父母分类法,当您创建子项时,您必须确保将子段添加到子类别子块中。在您的示例中,它看起来像:

  • boots-red
  • 靴蓝色
  • 鞋红色
  • 鞋蓝色

这是为每个子类别设置一个独特的slug。

现在重要的是,重写规则和分类链接:

定义分类时,应该这样做:

register_taxonomy('mytaxonomy',array('mycustompost'), array(
    'hierarchical'      => true,
    'sort'              => true,
    'labels'            => $labels,
    'show_ui'           => true,
    'show_admin_column' => true,
    'query_var'         => true,
    'rewrite'     => array(
      'slug'        => '/%parent%'
    )
  ));

此外,您必须修改永久链接,以便它具有您需要的结构,如果它是自定义分类(我的情况下),您使用term_link过滤器。我的功能如下:

function mytaxonomy_link( $permalink, $term, $taxonomy )
{
  if ( $taxonomy !== 'mytaxonomy'  && false === strpos( $permalink, '%parent%' ) )
      return $permalink;

  $temp_padre = $term->parent;
  $padre = get_term_by('id', $temp_padre, 'mytaxonomy');



  $cat_name = 'general';
  if(isset($padre) && !empty($padre))
  {
    $cat_name  = $padre->slug; 
    $termslug  = $term->slug;
    $new_slug  = str_replace( $cat_name , '' , $termslug);
    $new_slug  = ltrim($new_slug, '-');

    $permalink  = str_replace( '%parent%' , $cat_name , $permalink );
    $permalink  = str_replace( $termslug , $new_slug , $permalink );

  }

  return $permalink;    
}

add_filter( 'term_link', 'mytaxonomy_link', 10, 3 );

此函数会将子类别链接转换为:http://example.com/boots/red

重写规则,使所有的魔力:

  add_rewrite_rule('([^/]+)/([^/]+)/?$', 'index.php?mytaxonomy=$matches[1]-$matches[2]','top');
  add_rewrite_rule('([^/]+)/([^/]+)', 'index.php?mytaxonomy=$matches[1]-$matches[2]','top');

就我而言,我的帖子/分类法关系要复杂得多,但我认为这个解决方案会对你有帮助。

希望这有帮助,因为我在尝试找到解决此问题的方法时非常糟糕。