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

Posted

技术标签:

【中文标题】有没有办法在 Wordpress 上创建重复的子类别 slug?【英文标题】:Is there a way to create duplicated subcategory slugs on Wordpress? 【发布时间】:2015-03-26 00:50:56 【问题描述】:

我已经疯狂地用谷歌搜索这个问题,但似乎找不到这个问题的不太过时的答案或真正有效的答案。

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

我目前正在使用最新版本的 Wordpress 4.1,我想要实现的是:

假设我的网站上有 2 个类别,分别称为 BootsShoes。 在它们中,我想创建一个名为 Red 的类别。这就是我的类别结构的样子:

 - 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,我也可以尝试。感谢任何帮助或提示,非常感谢!

【问题讨论】:

类别嵌套会比shoes/red 更深吗(例如shoes/red/running)?如果没有,您可以尝试将颜色实现为EP_CATEGORIESEP_ALL_ARCHIVES 的重写端点。 codex.wordpress.org/Rewrite_API/add_rewrite_endpoint 它可能会更深入,是的。但是,假设它没有。如果我使用这种方法,我将不得不添加这样的一行,对每种颜色使用 add_rewrite_endpoint ,对吗?感谢您的快速评论,顺便说一句:) 是的,每一种颜色。将颜色选择范围缩小到最少也可以让您和网站用户更轻松。 ;) 请记住,您需要使用template_includetemplate_redirectpre_get_posts 或类似的钩子来读取端点并相应地过滤您的帖子。 @ojrask 您能否稍后将其发布为答案?我现在正在做其他事情,但我稍后会尝试一下。如果它按预期工作,我会将您的回答视为已接受。非常感谢:) 【参考方案1】:

在每个问题中都有解决它的正确方法,以及任何其他间接方法......

我花了两天时间才以正确的方式解决这个问题,所以我会在这里添加它以供将来可能需要它的任何人使用。

add_filter('wp_unique_term_slug', 'prevent_cat_suffix', 10, 3);
function prevent_cat_suffix($slug, $term, $original_slug)

    if ($term->post_type == 'product' && $term->parent !== 0) 
        return $original_slug;
    

    return $slug;

正如您在代码中看到的,我已将其范围缩小到产品,但您也可以通过删除上面代码中的 $term->post_type == 'product' && 使其适用于任何其他帖子类型。

【讨论】:

【参考方案2】:

我的分类法也遇到了同样的问题,我刚刚修复了它,希望对您有所帮助。

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

靴子-红色 蓝色靴子 鞋子-红色 鞋-蓝色

这是为每个子类别设置一个唯一的 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');

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

希望这会有所帮助,因为我在试图找到解决这个问题的方法时真的很糟糕。

【讨论】:

这可以应用于博客的默认类别吗?因此,没有自定义帖子类型,而是普通的博客帖子,其类别如 /boots/red 和 /shoes/red 在默认分类中是“boots”和“shoes”类别。你觉得有可能吗? 你只需要第一个重写规则。这 /?部分是否与斜线相同。那是什么?确实,它使它成为可选的。【参考方案3】:

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

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

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

如果用户在 URL 中输入另一个后缀(例如 /red/hiking),$wp_query 会将它们识别为键/值对,如 red => hiking?red=hiking 作为原始查询字符串)在查询变量中($wp_query -> get( 'red' ); 返回hiking)。这可能是好事也可能是坏事,具体取决于您实现逻辑的方式。

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

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

【讨论】:

我不会把它作为答案,因为它不是我问题的最终解决方案,实际上仍然有它......但非常感谢你抽出时间,@ojrask,非常感谢了解有关端点的更多信息,将来可能不得不使用它们。所以,+1 :) 不用担心。回来发布答案,以防万一你发现了什么! :)

以上是关于有没有办法在 Wordpress 上创建重复的子类别 slug?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 有没有办法将创建的子类导入 xcdatamodel 文件

“子类”核心数据模型

有没有办法修改子类,以便所有超类继承更改?

有没有办法在 Python 中调用子类定义的方法?

如何在github上创建新的repo?[重复]

有没有办法通过谷歌脚本在wordpress中添加帖子?