在wordpress中,每个帖子类型的slug(帖子名称)是唯一的。
因此,url如下/company-1/items/item-type-1/product-1
还有一个/company-2/items/item-type-1/product-1
哪里product-1
是两种不同产品的帖子名称,不能指定其地址。
如果您创建了两个标题相同的产品,Wordpress在保存时将设置unique 鼻涕虫
文章也是如此。
因此,在url中,例如:
http://example.com/company-1/items/item-type-1/product-1
可以简单地在中重写
http://example.com/index.php?post_type=products&name=product-1
和url,如:
http://example.com/company-1/articles/article-1-1
可以简单地在中重写
http://example.com/index.php?post_type=articles&name=article-1-1
所以,正如你所看到的,无论是类别。
您只需要2条重写规则:
add_action(\'init\',\'my_rewrite_rules\');
function my_rewrite_rules() {
add_rewrite_rule( \'[^/]+/items/[^/]+/(.+)/?$\' , \'index.php?post_type=products&name=$matches[1]\' , \'top\' );
add_rewrite_rule( \'[^/]+/articles/(.+)/?$\' , \'index.php?post_type=articles&name=$matches[1]\' , \'top\' );
}
之后,您必须刷新后端中的重写规则,并保存更改。
现在,如果您在浏览器上手动编写url,url的工作方式与您预期的一样,但问题是使用the_permalink
作用您必须使用“post\\u link”过滤器并生成正确的url:
add_filter(\'post_link\', \'my_custom_permalink\', 99, 3);
function my_custom_permalink($permalink, $post, $leavename) {
if ( $post->post_type == \'products\' )
return products_permalink($permalink, $post, $leavename);
if ( $post->post_type == \'articles\' )
return articles_permalink($permalink, $post, $leavename);
return $permalink;
}
function products_permalink($permalink, $post, $leavename) {
if ( $post->post_type != \'products\' ) return $permalink;
$cats = get_the_category( $post->ID );
$companies = get_term_by(\'slug\', \'companies\', \'category\');
$items= get_term_by(\'slug\', \'items\', \'category\');
if ( empty($cats) || empty($companies) || empty($items) ) return $permalink;
$item = \'\';
$company = \'\';
while ( ! empty($cats) ) {
if ( $item && $company )
return home_url() . \'/\' . $company . \'/items/\' . $item . \'/\' . $post->name;
$cat = array_pop($cats);
if ( $cat->parent == $companies->term_id ) $company = $cat->slug;
if ( $cat->parent == $items->term_id ) $item = $cat->slug;
}
return $permalink;
}
function articles_permalink($permalink, $post, $leavename) {
if ( $post->post_type != \'articles\' ) return $permalink;
$cats = get_the_category( $post->ID );
$companies = get_term_by(\'slug\', \'companies\', \'category\');
if ( empty($cats) || empty($companies) ) return $permalink;
$company = \'\';
while ( ! empty($cats) ) {
if ( $company )
return home_url() . \'/\' . $company . \'/articles/\' . $post->name;
$cat = array_pop($cats);
if ( $cat->parent == $companies->term_id ) $company = $cat->slug;
}
return $permalink;
}
这里我假设您只使用标准类别,其中类别“公司”是公司的父类别,“项目”是项目的父类别。
还假设cpt命名为“产品”和“物品”(注意复数)。
A如果您的配置不同,请调整功能。