Intereting Posts
Где находятся файлы, управляющие панелью управления с несколькими пользователями? запрашивать только возвратные сообщения с уже установленным настраиваемым полем Как запустить сайт WordPress через несколько ccTLD? Повернуть изображения в заголовке на основе даты Как отключить автоматическое встраивание строки в нужную вам? Организация папки плагинов в wordpress Удалите ссылку «Изменить ссылку» рядом с надписью «Опубликовать незамедлительно» при добавлении нового сообщения Удалить архив авторов тот же wordpress, 2 домена Создание различных размерных изображений при загрузке файла изображения с пользовательской страницы плагина Возможно смещение петли в WordPress? как я могу изменить цвет шрифта для Shortcode Пользовательский тип сообщения Постоянная ссылка пуста Получить post_content с тегами <p>? Многоязычная замена меню (Qtranslate-X)

Иерархические таксономии в permalink вызывают 404 для субтерминального архива

У меня есть настраиваемый тип сообщений с иерархическими таксономиями. Структура permalink выглядит следующим образом:

www.mysite.com/post_type/taxonomy_term -> works (tax archive page) www.mysite.com/post_type/taxonomy_term/post_name -> works (post page) www.mysite.com/post_type/taxonomy_term/taxonomy_sub_term -> 404 error (sub tax archive page) www.mysite.com/post_type/taxonomy_term/taxonomy_sub_term/post_name -> works (post page) 

Пользовательская функция типа сообщения с важными настройками (вывод из интерфейса CPT):

 $args = array( "has_archive" => true, "hierarchical" => false, "rewrite" => array( "slug" => "diensten", "with_front" => false ), "taxonomies" => array( "dienst_categorie" ), ); register_post_type( "diensten", $args ); 

Функция таксономии с важными настройками (выход из интерфейса CPT):

 $args = array( "hierarchical" => true, "rewrite" => array( 'slug' => 'diensten', 'with_front' => false, 'hierarchical' => true, ), ); register_taxonomy( "dienst_categorie", array( "diensten" ), $args ); 

С некоторым пользовательским кодом на основе этого веб-сайта я пришел к следующему коду:

 function resources_cpt_generating_rule( $wp_rewrite ) { $rules = array(); $post_type_diensten = 'diensten'; $terms_diensten = get_terms( array( 'taxonomy' => 'dienst_categorie', 'hide_empty' => false, ) ); foreach ( $terms_diensten as $term ) { if ( $term->parent > 0 ) { $pterm = get_term( $term->parent, 'dienst_categorie' ); // The line below doesn't work as expected. $rules[ 'diensten/' . $pterm->slug . '/' . $term->slug . '/?$' ] = 'index.php?taxonomy=dienst_categorie&term=' . $term->slug; $rules[ 'diensten/' . $pterm->slug . '/' . $term->slug . '/([^(/)]*)$' ] = 'index.php?post_type=' . $$post_type_diensten . '&' . $post_type_diensten . '=$matches[1]&name=$matches[1]'; } else { $rules[ 'diensten/' . $term->slug . '/([^/]*)$' ] = 'index.php?post_type=' . $post_type_diensten . '&' . $post_type_diensten . '=$matches[1]&name=$matches[1]'; } // This line works, but is not dynamic. $rules[ 'diensten/zonwering/zonweringreparaties/?$' ] = 'index.php?taxonomy=dienst_categorie&term=zonweringreparaties'; } } add_filter( 'generate_rewrite_rules', 'resources_cpt_generating_rule' ); function change_link( $permalink, $post ) { if ( 'diensten' === $post->post_type ) { $resource_terms = get_the_terms( $post, 'dienst_categorie' ); if ( ! empty( $resource_terms ) ) { foreach ( $resource_terms as $term ) { if ( 'featured' === $term->slug ) { continue; } if ( $term->parent > 0 ) { $pterm = get_term( $term->parent ); $permalink = get_home_url() . '/diensten/' . $pterm->slug . '/' . $term->slug . '/' . $post->post_name; } else { $permalink = get_home_url() . '/diensten/' . $term->slug . '/' . $post->post_name; } break; } } return $permalink; } } add_filter( 'post_type_link', 'change_link', 10, 2 ); , function resources_cpt_generating_rule( $wp_rewrite ) { $rules = array(); $post_type_diensten = 'diensten'; $terms_diensten = get_terms( array( 'taxonomy' => 'dienst_categorie', 'hide_empty' => false, ) ); foreach ( $terms_diensten as $term ) { if ( $term->parent > 0 ) { $pterm = get_term( $term->parent, 'dienst_categorie' ); // The line below doesn't work as expected. $rules[ 'diensten/' . $pterm->slug . '/' . $term->slug . '/?$' ] = 'index.php?taxonomy=dienst_categorie&term=' . $term->slug; $rules[ 'diensten/' . $pterm->slug . '/' . $term->slug . '/([^(/)]*)$' ] = 'index.php?post_type=' . $$post_type_diensten . '&' . $post_type_diensten . '=$matches[1]&name=$matches[1]'; } else { $rules[ 'diensten/' . $term->slug . '/([^/]*)$' ] = 'index.php?post_type=' . $post_type_diensten . '&' . $post_type_diensten . '=$matches[1]&name=$matches[1]'; } // This line works, but is not dynamic. $rules[ 'diensten/zonwering/zonweringreparaties/?$' ] = 'index.php?taxonomy=dienst_categorie&term=zonweringreparaties'; } } add_filter( 'generate_rewrite_rules', 'resources_cpt_generating_rule' ); function change_link( $permalink, $post ) { if ( 'diensten' === $post->post_type ) { $resource_terms = get_the_terms( $post, 'dienst_categorie' ); if ( ! empty( $resource_terms ) ) { foreach ( $resource_terms as $term ) { if ( 'featured' === $term->slug ) { continue; } if ( $term->parent > 0 ) { $pterm = get_term( $term->parent ); $permalink = get_home_url() . '/diensten/' . $pterm->slug . '/' . $term->slug . '/' . $post->post_name; } else { $permalink = get_home_url() . '/diensten/' . $term->slug . '/' . $post->post_name; } break; } } return $permalink; } } add_filter( 'post_type_link', 'change_link', 10, 2 ); 

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

Мой вопрос: каково правильное правило перезаписи, чтобы иметь доступ к странице архива подзаголовка на основе иерархии URL-термина / подтерминала?

Solutions Collecting From Web of "Иерархические таксономии в permalink вызывают 404 для субтерминального архива"