有没有办法在 Wordpress 上创建重复的子类别 slug?
Is there a way to create duplicated subcategory slugs on Wordpress?
我疯狂地用谷歌搜索了这个问题,但似乎找不到这个问题的不太过时的答案或实际有效的答案。
我的问题就像这个人在这个论坛 post 上描述的问题(来自 4,神圣 四 年前!):
https://wordpress.org/support/topic/duplicate-subcategory-slug-problem
我目前使用的是最新版本 Wordpress 4.1,我想要实现的目标是:
假设我的网站上有 2 个类别,分别称为 Boots 和 Shoes。
在它们里面,我想创建一个名为 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/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
会将其识别为 key/value 对作为查询变量 ($wp_query -> get( 'red' );
returns hiking
) 中的 red => hiking
(?red=hiking
作为原始查询字符串)。这可能是好事也可能是坏事,具体取决于您如何实现逻辑。
添加永久链接端点后,您需要使用功能 flush_rewrite_rules()
或转到管理面板永久链接管理部分并按一次更新来刷新安装的重写规则。
注意:您不能为终结点使用动态名称。您需要为每个变体(红色、蓝色等)定义一个静态端点。
我的分类法也遇到了同样的问题,我刚刚解决了它,希望它能有所帮助。
首先,您有父类分类法,当您创建子类时,您必须确保将父 slug 添加到子类别 slug。在您的示例中,它看起来像:
- 靴子-红色
- 靴子-蓝色
- 鞋子-红色
- 鞋子-蓝色
这是为了让每个子类别都有一个独特的 slug。
现在是重要的事情,重写规则和分类 links:
当你定义分类时,你应该这样做:
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%'
)
));
此外,您必须修改 permalinks 以使其具有您需要的结构,如果它是自定义分类法(如我的情况),您可以使用 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 );
此函数会将子类别 link 转换为: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');
在我的例子中,我的帖子/分类法关系要复杂得多,但我认为这个解决方案会对你有所帮助。
希望这对您有所帮助,因为我在尝试找到该问题的解决方案时遇到了非常糟糕的时间。
每个问题都有解决它的正确方法,任何其他间接方法...
我花了两天时间才以正确的方式解决这个问题,所以我会在这里添加它以供将来可能需要它的任何人使用。
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' &&
使其适用于任何其他 post 类型以上。
我疯狂地用谷歌搜索了这个问题,但似乎找不到这个问题的不太过时的答案或实际有效的答案。
我的问题就像这个人在这个论坛 post 上描述的问题(来自 4,神圣 四 年前!): https://wordpress.org/support/topic/duplicate-subcategory-slug-problem
我目前使用的是最新版本 Wordpress 4.1,我想要实现的目标是:
假设我的网站上有 2 个类别,分别称为 Boots 和 Shoes。 在它们里面,我想创建一个名为 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/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
会将其识别为 key/value 对作为查询变量 ($wp_query -> get( 'red' );
returns hiking
) 中的 red => hiking
(?red=hiking
作为原始查询字符串)。这可能是好事也可能是坏事,具体取决于您如何实现逻辑。
添加永久链接端点后,您需要使用功能 flush_rewrite_rules()
或转到管理面板永久链接管理部分并按一次更新来刷新安装的重写规则。
注意:您不能为终结点使用动态名称。您需要为每个变体(红色、蓝色等)定义一个静态端点。
我的分类法也遇到了同样的问题,我刚刚解决了它,希望它能有所帮助。
首先,您有父类分类法,当您创建子类时,您必须确保将父 slug 添加到子类别 slug。在您的示例中,它看起来像:
- 靴子-红色
- 靴子-蓝色
- 鞋子-红色
- 鞋子-蓝色
这是为了让每个子类别都有一个独特的 slug。
现在是重要的事情,重写规则和分类 links:
当你定义分类时,你应该这样做:
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%'
)
));
此外,您必须修改 permalinks 以使其具有您需要的结构,如果它是自定义分类法(如我的情况),您可以使用 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 );
此函数会将子类别 link 转换为: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');
在我的例子中,我的帖子/分类法关系要复杂得多,但我认为这个解决方案会对你有所帮助。
希望这对您有所帮助,因为我在尝试找到该问题的解决方案时遇到了非常糟糕的时间。
每个问题都有解决它的正确方法,任何其他间接方法...
我花了两天时间才以正确的方式解决这个问题,所以我会在这里添加它以供将来可能需要它的任何人使用。
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' &&
使其适用于任何其他 post 类型以上。