Solution
在Jan Fabry的这些帖子的帮助下,我找到了答案->
https://wordpress.stackexchange.com/a/5478/10350 https://wordpress.stackexchange.com/a/22490/10350
我已经设置了如下自定义帖子类型->
自定义帖子类型(register\\u post\\u type)->"product"分类法(register\\u Taxonomy)->"product-type"
Back-end function
我重写了保存在后端的permalink结构,以便保存permalink以包括自定义分类类型-“product type”
add_filter(\'post_type_link\', \'product_type_permalink\', 10, 4);
function product_type_permalink($post_link, $post, $leavename, $sample) {
//If is custom post type "product"
if ($post->post_type == \'product\') {
// Get current post object
global $post;
// Get current value from custom taxonomy "product-type"
$terms = get_the_terms($post->id, \'product-type\');
// Define category from "slug" of taxonomy object
$term = $terms[0]->slug;
// Re-structure permalink with string replace to include taxonomy value and post name
$permalink = str_replace(\'product/\', \'product/\' . $term . \'/\', $post_link);
}
return $permalink;
}
设置
permalink setting “发布名称”并保存。如果将产品添加到类别并保存,则应重新写入永久链接以包含自定义分类定义,在本例中为“产品类型”。因此,如果将“红色椅子”添加到“椅子”类别中,URL的格式如下->
http://website.com/product/chairs/red-chair/
但是,如果您尝试转到此页面,将出现404错误。这是因为wordpress还不知道如何使用此URL查询数据库,所以您必须编写它。
Front-end function
我们需要添加重写规则,以便wordpress可以获取我们的url并查询数据库。我们使用wordpress函数
add_rewrite_rule
将给定的永久链接转换为查询字符串。
add_rewrite_rule(
// The regex to match the incoming URL
\'product/([^/]+)/([^/]+)/?\',
// The resulting internal URL: `index.php` because we still use WordPress
// `pagename` because we use this WordPress page
// `designer_slug` because we assign the first captured regex part to this variable
\'index.php?product-type=$matches[1]&product=$matches[2]\',
// This is a rather specific URL, so we add it to the top of the list
// Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
\'top\'
);
在这个函数中,匹配数组是通过Wordpress在每个斜杠处分解给定字符串来定义的。在这个例子中,正则表达式
([^/]+)
用于匹配每个斜杠之间的任何内容。在本例中,有两个级别,因此它匹配产品类型,然后匹配产品,并将它们添加到matches数组中,其中product type=$matches
1, and product=$匹配项
2.
此重写规则转换为->
product/chairs/red-chair/
进入此->
index.php?product-type=chair&product=red-chair
我们的数据库可以使用它来查询数据库并返回正确的产品页面和格式化的永久链接。
这会丢弃产品类型页面,因为url中只有一个级别,即产品类型。这意味着重写规则当前将始终尝试标识查询字符串中定义的产品名称。为此,我们还编写了一个单级重写规则:
add_rewrite_rule(\'^product/([^/]*)?$\',\'index.php?product-type=$matches[1]\',\'top\');
现在,这还将查询产品类型页面,这样,如果我们想显示各种产品类型,就可以像平常一样循环分类法,而不会在尝试链接到它们时抛出404个错误。
Downside
目前,这将只采用单一级别的分类法,因此自定义分类法结构不能是分层的。如果指定多个分类法,它将使用第一个ID最多的分类法来定义永久链接。一种潜在的解决方法是隐藏出现在自定义帖子类型侧栏中的自定义分类菜单,并为分类添加一个只能使用选择框的元框。我使用
Meta Box plugin 为了这个。(注意,这个插件没有任何管理菜单,它允许您通过创建数组在functions.php中为自定义帖子类型编写元框-强烈建议!)