Как создать структуру permalink с пользовательскими таксономиями и настраиваемыми типами сообщений, такими как base-name / parent-tax / child-tax / custom-post-type-name

Я расчесывал этот сайт и Google для ответа, и я пришел полностью пустым. В основном я хочу сделать именно то, что задает этот пост , но мне нужна иерархическая таксономия. Ответ, приведенный в этом сообщении, отлично работает, но только с таксономией одного уровня. Можно ли делать то, что я хочу? Я пробовал миллион вещей, но никто не работает, в лучшем случае я могу получить правильные постоянные ссылки, но они появляются на 404.

Чтобы визуально проиллюстрировать то, что я хочу:

/basename/ - ideally a page, but I think this will cause a permalink collision /basename/top-cat/ - top parent custom taxonomy archive /basename/top-cat/child-cat/ - child cat custom taxonomy archive /basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive /basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post 

Вы можете сделать это хорошо со встроенными сообщениями и категориями, как вы это делаете с пользовательскими таксономиями и настраиваемыми типами сообщений? Я знаю, что вам нужно использовать 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), чтобы получить иерархические пули, которые отлично работают на архивные страницы, но пользовательские сообщения типа post приходят вверх 404. Если я удалю 'hierarchical' => true часть, то сообщения работают, но я теряю иерархические URL-адреса (только / basename / grandchild-cat / post-name / works) ,

Итак, любые решения? Большое вам спасибо, это заставило меня сходить с ума около 3 недель.

Объединив кучу других ответов, я начал работать! Итак, вот решение для тех из вас, кто борется с этим:

Этот пост и этот помогли мне, поэтому благодаря этим парням.

Обратите внимание, что весь этот код, плюс ваш начальный пользовательский тип сообщения и код регистрации таксономии, входят в ваш файл functions.php .

Сначала получите свои пули правильно при определении ваших пользовательских типов сообщений и таксономии: для настраиваемого типа сообщения он должен быть basename/%taxonomy_name% а slug для вашей таксономии должен быть просто basename . Не забудьте также добавить 'hierarchical' => true в массив перезаписи таксономии, чтобы получить вложенные термины в вашем URL-адресе. Также убедитесь, что query_var установлен в true в обоих случаях.

Вам нужно добавить новое правило перезаписи, чтобы WordPress знал, как интерпретировать вашу структуру URL. В моем случае часть пользовательского сообщения типа uri всегда будет пятым сегментом uri, поэтому я правильно определил свое правило соответствия. Обратите внимание, что вам может потребоваться изменить это, если вы используете более или менее сегменты uri. Если у вас будет разный уровень вложенных терминов, вам нужно будет написать функцию, чтобы проверить, является ли последний сегмент uri настраиваемым типом сообщения или термином таксономии, чтобы узнать, какое правило добавить (спросите меня, нужна ли вам помощь по что).

 add_filter('rewrite_rules_array', 'mmp_rewrite_rules'); function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment $newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]'; return array_merge($newRules, $rules); } 

Затем вам нужно добавить этот код, чтобы заставить workpress обрабатывать %taxonomy_name% в вашей структуре перезаписываемого типа записи:

 function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2); 

Я создал пользовательскую функцию на основе собственных get_category_parents WordPress:

 // my own function to do what get_category_parents does for other taxonomies function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) { $chain = ''; $parent = &get_term($id, $taxonomy); if (is_wp_error($parent)) { return $parent; } if ($nicename) $name = $parent -> slug; else $name = $parent -> name; if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) { $visited[] = $parent -> parent; $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); } if ($link) { // nothing, can't get this working :( } else $chain .= $name . $separator; return $chain; } 

Затем вам нужно сбросить свои постоянные ссылки (просто загрузите страницу настроек постоянных ссылок).

Теперь все «должно» работать надежно! Пойдите, сделайте кучу таксономических терминов и правильно вложите их в них, затем создайте персонализированные сообщения типа сообщения и правильно классифицируйте их. Вы также можете создать страницу с базовым basename slug, и все должно работать так, как я указал в моем вопросе. Возможно, вам захочется создать некоторые пользовательские страницы архива таксономии, чтобы контролировать, как они выглядят, и добавить плагин для виджетов таксономии, чтобы показать свои вложенные категории на боковой панели.

Надеюсь, что это поможет!

Взгляните на этот плагин . Он предоставляет иерархические URL-адреса для категорий, но вы можете легко адаптироваться к любой таксономии.

Создание правила следует за рекурсивной функцией .