Пользовательский шаблон не будет загружаться для пользовательского типа публикации (используются пользовательские постоянные ссылки)


Я создал пользовательскую таксономию для своих пользовательских типов записей.

function create_states_hierarchical_taxonomy() {
  $labels = array(
    'name' => _x( 'States', 'taxonomy general name' ),
    'singular_name' => _x( 'State', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search States' ),
    'all_items' => __( 'All States' ),
    'parent_item' => __( 'Parent State' ),
    'parent_item_colon' => __( 'Parent State:' ),
    'edit_item' => __( 'Edit State' ), 
    'update_item' => __( 'Update State' ),
    'add_new_item' => __( 'Add New State' ),
    'new_item_name' => __( 'New State Name' ),
    'menu_name' => __( 'States' ),
  );    

// Now register the taxonomy

  register_taxonomy('states',array('post'), array(
    'hierarchical' => true,
    'labels' => $labels,
    'show_ui' => true,
    'show_admin_column' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'states' ),
  ));

}

У меня есть 3 пользовательских типа сообщений. Они все похожи. Это один из них.

// Speech Language Pathologists custom post
function create_pathologists() {
    $labels = array (
        'name' => 'Pathologists',
        'singular_name' => 'Pathologist',
        'add_new' => 'Add SLP',
        'all_items' => 'All SLPs',
        'add_new_item' => 'Add SLP',
        'edit_item' => 'Edit SLP',
        'new_item' => 'New SLP',
        'view_item' => 'View SLP',
        'search_item' => 'Search SLPs',
        'not_found' => 'No SLPs found',
        'not_found_in_trash' => 'No SLPs found in trash',
        'parent_item_colon' => 'Parent Item'
    );
    $args = array (
        'labels' => $labels,
        'public' => true,
        'show_in_menu' => true,
        'has_archive' => true,
        'publicly_queryable' => true,
        'query_var' => true,
        'rewrite' => array(
            'slug' => 'pathologists/%states%',
            'with_front' => false,
        ),
        'capability_type' => 'post',
        'hierarchical' => false,
        'supports' => array (
            'title',
            'editor',
            'excerpt',
            'thumbnail',
            'revisions',
        ),
        'taxonomies' => array ('states', 'post_tag'),
        'exclude_from_search' => false
    );
    register_taxonomy_for_object_type( 'states', 'create_schools' );
    register_taxonomy_for_object_type( 'post_tag', 'create_schools' );
    register_post_type('pathologists', $args);  
}
add_action( 'init', 'create_pathologists' );

Я фильтрую свою постоянную ссылку, чтобы она отображала имя таксономии после имени пользовательского типа записи и перед именем записи.

add_filter('post_type_link', 'pathologists_permalink_structure', 10, 4);
function pathologists_permalink_structure($post_link, $post, $leavename, $sample)
{
        $post = get_post($id);  
    if ( false !== strpos( $post_link, '%states%' ) ) {
        $state_term = get_the_terms( $post->ID, 'states' );
        $post_link = str_replace( '%states%', array_pop( $state_term )->slug, $post_link );
    }
    return $post_link;
}
flush_rewrite_rules();

Так, например, у меня есть пост под названием "тест" в разделе "патологоанатомы" и категория "алабама". Постоянная ссылка будет выглядеть так это:

Http://sitename/pathologists/alabama/test/

Таким образом, я могу получить доступ к любой странице без каких-либо проблем, но когда дело доходит до отображения всех сообщений определенного пользовательского типа по состоянию, WP использует значение по умолчанию archive.php и отображает все записи определенного состояния из всех пользовательских типов записей.

use of default archive.php

Я изучил решение , представленное Питером Гусеном, но все, что я пытаюсь, не даст мне правильного результата.

Все возможные файлы, которые я пытался использовать:

  • archive-pathologists.php
  • states.php
  • alabama.php
  • states-alabama.php
  • taxonomy-states.php

Taxonomy-states.php это самое близкое, что я мог сделать до сих пор. По крайней мере, он использует правильный шаблон. Но вместо того, чтобы показывать мне все сообщения о состоянии из одного пользовательского типа сообщения, он показывает мне 3 имени специалистов, которых я поместил в поле пользовательского сообщения для пользовательского плагина пользовательского интерфейса типа сообщения, который я пытался используется в первую очередь. Плагин удаляется со всеми сообщениями и типами.

use of custom template taxonomy-states.php

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

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

Author: Simon Nazarenko, 2019-07-18

1 answers

Проблема в вашем коде заключается в отсутствии надлежащих правил.

Вы добавляете 'rewrite' => 'CPT/%states%' в register_post_type() аргументы. Это приводит к тому, что правила, созданные для типа записи pathologists, начинаются с pathologists/%states%/ и адрес pathologists/alabama/ (pathologists/{term}/) не будут сопоставлены. Что еще более важно, все записи из пользовательской категории отображаются независимо от типа, потому что правила не устанавливают тип записи.

Здесь вы найдете аналогичный вопрос, единственное отличие заключается в порядке элементов, у вас есть {cpt}/{term}, в вопросе заключается {term}/{ctp}.

Приведенный ниже код добавит необходимые вам правила перезаписи. При добавлении или удалении термина таксономии states правила должны быть восстановлены заново (используйте фильтры created_term, delete_{$taxonomy}).

add_action('init', 'se343186_rewrite_rules__states', 15);

function se343186_rewrite_rules__states()
{
    $cpts = ['pathologists', 'other_cpt'];
    $tax_slug = 'states';
    foreach ($cpts as $cpt)
    {
        add_rewrite_rule( '^'. $cpt. '/([^/]+)(?:/(.+?))?/page/?([0-9]{1,})/?$',
            'index.php?taxonomy='.$tax_slug.'&'.$tax_slug.'=$matches[1]&'.$cpt.'=$matches[2]&paged=$matches[3]&post_type='.$cpt,
            'top'
        );
        add_rewrite_rule( '^'. $cpt. '/([^/]+)/(.+?)(?:/([0-9]+))?/?$',
            'index.php?taxonomy='.$tax_slug.'&'.$tax_slug.'=$matches[1]&'.$cpt.'=$matches[2]&page=$matches[3]&post_type='.$cpt,
            'top'
        );
        add_rewrite_rule( '^'. $cpt. '/([^/]+)(?:/([0-9]+))?/?$',
            'index.php?taxonomy='.$tax_slug.'&'.$tax_slug.'=$matches[1]&paged=$matches[2]&post_type='.$cpt,
            'top'
        );
    }
}
 1
Author: nmr, 2019-08-03 07:49:28