WP Rewrite Rules – Пользовательский тип сообщения и таксономия

Я несколько дней бил головой о стену, пытаясь понять это. У меня есть настраиваемый тип сообщений и пользовательская таксономия, и я пытаюсь заставить мой URL работать.

Вот структура URL, для которой я собираюсь: http://url.dev/custom-post-type/taxonomy/post-name/

Первые две части работают. Я могу перейти только к custom-post-type и он использует файл archive-custom-post-type.php . Я также могу перейти в /custom-post-type/taxonomy и он использует мою таксономию name.php .

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

введите описание изображения здесь

введите описание изображения здесь

Это выглядит правильно, вот что должно произойти. Но я получаю ошибку 404, когда пытаюсь перейти на одну из страниц одного продукта.

Вот мое фактическое правило перезаписи в моих functions.php

 function taxonomy_slug_rewrite($wp_rewrite) { $rules = array(); // get all custom taxonomies $taxonomies = get_taxonomies(array('_builtin' => false), 'objects'); // get all custom post types $post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects'); foreach ($post_types as $post_type) { foreach ($taxonomies as $taxonomy) { // go through all post types which this taxonomy is assigned to foreach ($taxonomy->object_type as $object_type) { // check if taxonomy is registered for this custom type if ($object_type == $post_type->rewrite['slug']) { // get category objects $terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0)); // make rules foreach ($terms as $term) { $rules[$object_type . '/' . $term->slug . '/([^/]*)/?'] = 'index.php?pagename=$matches[1]&' . $term->taxonomy . '=' . $term->slug; } } } } } // merge with global rules $wp_rewrite->rules = $rules + $wp_rewrite->rules; } add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite'); , function taxonomy_slug_rewrite($wp_rewrite) { $rules = array(); // get all custom taxonomies $taxonomies = get_taxonomies(array('_builtin' => false), 'objects'); // get all custom post types $post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects'); foreach ($post_types as $post_type) { foreach ($taxonomies as $taxonomy) { // go through all post types which this taxonomy is assigned to foreach ($taxonomy->object_type as $object_type) { // check if taxonomy is registered for this custom type if ($object_type == $post_type->rewrite['slug']) { // get category objects $terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0)); // make rules foreach ($terms as $term) { $rules[$object_type . '/' . $term->slug . '/([^/]*)/?'] = 'index.php?pagename=$matches[1]&' . $term->taxonomy . '=' . $term->slug; } } } } } // merge with global rules $wp_rewrite->rules = $rules + $wp_rewrite->rules; } add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite'); 

Есть ли что-то, что я делаю неправильно?

Если я верну свои постоянные ссылки по умолчанию, я могу перейти к: http: //uss.local/? Ultrasound-equipment = sequoia-512 & equipment-manufacturer = acuson, и все работает отлично. Но когда я переключаюсь на «Post Name», он не работает.

Solutions Collecting From Web of "WP Rewrite Rules – Пользовательский тип сообщения и таксономия"

Вы можете достичь этого, не добавляя правила для каждого термина с помощью аргумента rewrite когда вы регистрируете свой тип сообщения и таксономию. Единственное дополнительное правило, которое вам нужно, это обработать разбивку на страницы для таксономии.

Сначала зарегистрируйте тип сообщения. Важное значение имеет порядок, в котором вы регистрируете тип сообщения и таксономию! Я упустил большинство аргументов, чтобы сосредоточиться на важных битах:

 $args = array( 'has_archive' => 'custom-type', 'rewrite' => array( 'slug' => 'custom-type/%custom-tax%', 'with_front' => false ) ); register_post_type( 'custom-type', $args ); 

Затем зарегистрируйте таксономию:

 $args = array( 'rewrite' => array( 'slug' => 'custom-type', 'with_front' => false ) ); register_taxonomy( 'custom-tax', array( 'custom-type' ), $args ); 

Затем добавьте правило перезаписи для обработки таксономии:

 function wpd_taxonomy_pagination_rewrites(){ add_rewrite_rule( 'custom-type/([^/]+)/page/([0-9]+)/?$', 'index.php?custom-tax=$matches[1]&paged=$matches[2]', 'top' ); } add_action( 'init', 'wpd_taxonomy_pagination_rewrites' ); , function wpd_taxonomy_pagination_rewrites(){ add_rewrite_rule( 'custom-type/([^/]+)/page/([0-9]+)/?$', 'index.php?custom-tax=$matches[1]&paged=$matches[2]', 'top' ); } add_action( 'init', 'wpd_taxonomy_pagination_rewrites' ); которого function wpd_taxonomy_pagination_rewrites(){ add_rewrite_rule( 'custom-type/([^/]+)/page/([0-9]+)/?$', 'index.php?custom-tax=$matches[1]&paged=$matches[2]', 'top' ); } add_action( 'init', 'wpd_taxonomy_pagination_rewrites' ); 

И чтобы получить выбранный термин в постоянной post_type_link , filter post_type_link :

 function wpd_post_link( $post_link, $id = 0 ){ $post = get_post($id); if ( is_object( $post ) && $post->post_type == 'custom-type' ){ $terms = wp_get_object_terms( $post->ID, 'custom-tax' ); if( $terms ){ foreach( $terms as $term ){ if( 0 == $term->parent ){ return str_replace( '%custom-tax%' , $term->slug , $post_link ); } } } else { return str_replace( '%custom-tax%' , 'uncategorized', $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'wpd_post_link', 1, 3 );