我正在处理WordPress Custom Post Types
和Custom Taxonomies
。
我已经读过很多类似的问题,但不幸的是,到目前为止,我还没有找到确切的案例。
我的目标是:
档案:
siteurl / rewrite / parent-term-slug / => archive
siteurl / rewrite / parent-term-slug / child-term-slug => archive
帖子:
siteurl / rewrite / parent-term-slug / post-name-slug => post
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => post
要达到上述效果,我有:
function register_my_cpt() {
...
$my_cpt_arguments = array(
...
'hierarchical' => true,
'has_archive' => true,
'rewrite' => array('slug' => $rewrite . '/%term_slugs%', 'hierarchical' => true),
);
register_post_type($my_cpt, $my_cpt_arguments);
}
add_action('init', 'register_my_cpt');
那我有:
function manage_post_links($post_link, $post_object){
if(is_object($post_object) && $post_object->post_type === $my_cpt){
$get_object_terms = wp_get_object_terms($post_object->ID, $my_tax);
$object_terms_slug = array();
foreach($get_object_terms as $get_object_term) {
$object_terms_slug[] = $get_object_term->slug;
}
$object_terms = implode('/',$object_terms_slug);
if($object_terms){
return str_replace('%term_slugs%' , $object_terms , $post_link);
}
}
return $post_link;
}
add_filter('post_type_link', 'manage_post_links', 1, 2);
然后我又有了
function register_my_taxonomy() {
...
$my_tax_arguments = array(
...
'hierarchical' => true,
'has_archive' => true,
'rewrite' => array('slug' => $rewrite, 'hierarchical' => true),
);
register_taxonomy($my_tax, $my_tax_arguments);
}
add_action('init', 'register_my_taxonomy');
请注意,$rewrite
在custom taxonomy
和custom post type
中具有相同的值
我当前的结果是:
档案:
siteurl / rewrite / parent-term-slug / => it works
siteurl / rewrite / parent-term-slug / child-term-slug => it works
帖子:
siteurl / rewrite / parent-term-slug / post-name-slug => it DOES NOT work
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => it DOES NOT work
我想问题是,通过这种结构,即使调用了单个帖子,我仍在推动WordPress查找存档。也许我应该通过检查存档是否存在来过滤请求,如果不存在,则应该强制查找帖子内容。
我说得对吗?
编辑
在许多其他类似问题中都发现了这种解决方案,它使我意识到也许我应该研究重写规则。
function manage_rewrite_rules($rules) {
$newRules = array();
$newRules[$rewrite.'/(.+)/(.+)/(.+)/?$'] = 'index.php?'.$my_cpt.'=$matches[3]';
$newRules[$rewrite.'/(.+)/(.+)/?$'] = 'index.php?'.$my_tax.'=$matches[2]';
return array_merge($newRules, $rules);
}
add_filter('rewrite_rules_array', 'manage_rewrite_rules');
这组规则(如果我没记错的话)告诉WordPress在URL为时显示帖子内容
siteurl / rewrite / one / two / three /
并在URL为
时显示档案内容siteurl / rewrite / one / two /
问题是我既有存档,又有URL之类的帖子
siteurl / rewrite / one / two /
所以,现在我的情况是:
档案:
siteurl / rewrite / parent-term-slug / => it works
siteurl / rewrite / parent-term-slug / child-term-slug => it works
帖子:
siteurl / rewrite / parent-term-slug / post-name-slug => it DOES NOT work
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => it works
只要这使我更接近结果,我怀疑这是一条死路。