Пользовательский тип записи single-{custom}.php не работает
Я создал пользовательский тип записи с машинным именем special_media_post, но WordPress просто не видит файл single-special_media_post.php. Я в полном недоумении. Он продолжает использовать index.php по умолчанию.
Вот мой код для пользовательского типа записи и его таксономий:
//Настройки записей и таксономий
//Регистрация пользовательского типа записи
function special_media_post() {
$labels = array(
'name' => _x( 'Медиа записи', 'Общее название типа записи', 'text_domain' ),
'singular_name' => _x( 'Медиа запись', 'Единственное название типа записи', 'text_domain' ),
'menu_name' => __( 'Медиа запись', 'text_domain' ),
'parent_item_colon' => __( 'Медиа запись:', 'text_domain' ),
'all_items' => __( 'Все медиа записи', 'text_domain' ),
'view_item' => __( 'Просмотр медиа записи', 'text_domain' ),
'add_new_item' => __( 'Добавить новую медиа запись', 'text_domain' ),
'add_new' => __( 'Новая медиа запись', 'text_domain' ),
'edit_item' => __( 'Редактировать медиа запись', 'text_domain' ),
'update_item' => __( 'Обновить медиа запись', 'text_domain' ),
'search_items' => __( 'Поиск медиа записей', 'text_domain' ),
'not_found' => __( 'Медиа записи не найдены', 'text_domain' ),
'not_found_in_trash' => __( 'В корзине медиа записей не найдено', 'text_domain' ),
);
$rewrite = array(
'slug' => 'mediapost',
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'label' => __( 'mediapost', 'text_domain' ),
'description' => __( 'Тип записи для медиа', 'text_domain' ),
'labels' => $labels,
'supports' => array( 'title', 'editor', 'custom-fields', ),
'taxonomies' => array( 'year', 'type' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_position' => 5,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'query_var' => 'mediapost',
'rewrite' => $rewrite,
'capability_type' => 'page',
);
register_post_type( 'special_media_post', $args );
}
// Регистрация пользовательской таксономии
function media_year() {
$labels = array(
'name' => _x( 'Годы', 'Общее название таксономии', 'text_domain' ),
'singular_name' => _x( 'Год', 'Единственное название таксономии', 'text_domain' ),
'menu_name' => __( 'Год', 'text_domain' ),
'all_items' => __( 'Все годы', 'text_domain' ),
'parent_item' => __( 'Родительский год', 'text_domain' ),
'parent_item_colon' => __( 'Родительский год:', 'text_domain' ),
'new_item_name' => __( 'Название нового года', 'text_domain' ),
'add_new_item' => __( 'Добавить новый год', 'text_domain' ),
'edit_item' => __( 'Редактировать год', 'text_domain' ),
'update_item' => __( 'Обновить год', 'text_domain' ),
'separate_items_with_commas' => __( 'Разделяйте годы запятыми', 'text_domain' ),
'search_items' => __( 'Поиск годов', 'text_domain' ),
'add_or_remove_items' => __( 'Добавить или удалить годы', 'text_domain' ),
'choose_from_most_used' => __( 'Выберите из наиболее используемых годов', 'text_domain' ),
);
$rewrite = array(
'slug' => 'year',
'with_front' => true,
'hierarchical' => true,
);
$capabilities = array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'edit_posts',
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'query_var' => 'year',
'rewrite' => $rewrite,
'capabilities' => $capabilities,
);
register_taxonomy( 'year', 'special_media_post', $args );
}
// Регистрация пользовательской таксономии
function media_type() {
$labels = array(
'name' => _x( 'Типы', 'Общее название таксономии', 'text_domain' ),
'singular_name' => _x( 'Тип', 'Единственное название таксономии', 'text_domain' ),
'menu_name' => __( 'Тип', 'text_domain' ),
'all_items' => __( 'Все типы', 'text_domain' ),
'parent_item' => __( 'Родительский тип', 'text_domain' ),
'parent_item_colon' => __( 'Родительский тип:', 'text_domain' ),
'new_item_name' => __( 'Название нового типа', 'text_domain' ),
'add_new_item' => __( 'Добавить новый тип', 'text_domain' ),
'edit_item' => __( 'Редактировать тип', 'text_domain' ),
'update_item' => __( 'Обновить тип', 'text_domain' ),
'separate_items_with_commas' => __( 'Разделяйте типы запятыми', 'text_domain' ),
'search_items' => __( 'Поиск типов', 'text_domain' ),
'add_or_remove_items' => __( 'Добавить или удалить типы', 'text_domain' ),
'choose_from_most_used' => __( 'Выберите из наиболее используемых типов', 'text_domain' ),
);
$rewrite = array(
'slug' => 'type',
'with_front' => true,
'hierarchical' => true,
);
$capabilities = array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'edit_posts',
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'query_var' => 'media_type',
'rewrite' => $rewrite,
'capabilities' => $capabilities,
);
register_taxonomy( 'type', 'special_media_post', $args );
}
// Подключение к действию 'init'
add_action( 'init', 'special_media_post', 0 );
// Подключение к действию 'init'
add_action( 'init', 'media_year', 0 );
// Подключение к действию 'init'
add_action( 'init', 'media_type', 0 );
Если нужно что-то еще показать, я могу добавить, но он даже не видит файл, если я добавляю echo 'Hello World'. Таким образом, он просто не видит ни single-special_media_post.php, ни archive-special_media_post.php
Измените код
С :
'has_archive' => true,
На :
'has_archive' => false,
Затем перейдите на страницу постоянных ссылок, измените на стандартные и вернитесь к вашим "человекопонятным постоянным ссылкам"
%postname%/
Теперь должно работать.
Причина, по которой переход на страницу single-{custom_post_type}.php не происходит, заключается в has_archive. Когда has_archive установлен в true, система будет искать archive-{custom_post_type}.php вместо одиночной страницы.
Надеюсь, это сработало.

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

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

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

параметр 'has_archive' не влияет на то, будет ли использоваться шаблон single-{post_type}.php для одиночного запроса.

Я скопировал ваш код, сбросил правила перезаписи через админку, и теперь Тема использует правильные шаблоны при посещении записи медиа.
Вам нужно сбросить правила перезаписи один раз, используя хук after_switch_theme. Это гарантирует, что правила перезаписи будут сброшены автоматически после активации темы пользователем.
Вы можете использовать этот код (прямо из Codex):
add_action( 'init', 'theme_prefix_cpt_init' );
function theme_prefix_cpt_init() {
register_post_type( ... );
}
function theme_prefix_rewrite_flush() {
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'theme_prefix_rewrite_flush' );
Пожалуйста, обратитесь к WordPress Codex для получения дополнительной информации: http://codex.wordpress.org/Function_Reference/register_post_type
РЕДАКТИРОВАНИЕ: В таком случае очень полезным будет плагин Inspect Rewrite Rules, так как он позволяет увидеть правила, связанные с вашим пользовательским типом записи: http://wordpress.org/extend/plugins/rewrite-rules-inspector/
Примечание: также обратите внимание, что рекомендуемое место для размещения пользовательских типов записей — это плагин, а не тема.

Также хорошей практикой является использование register_activation_hook()
и register_deactivation_hook()
при создании новых типов контента.
Кажется, что новые типы контента всегда будут иметь проблемы с перезаписью. Чтобы избежать этого, поместите в колбэк register_activation_hook() функцию flush_rewrite_rules()
и вашу функцию регистрации нового типа контента. Я не знаю почему, но это помогает избежать данной проблемы. Посмотрите:
register_activation_hook( __FILE__, 'your_active_hook' );
function your_active_hook() {
special_media_post();
flush_rewrite_rules();
}
