Я имею дело с 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
Насколько это Подводя меня ближе к результату, я подозреваю, что это тупиковый путь.