Пользовательский тип записи single-{custom}.php не работает

22 апр. 2013 г., 22:30:41
Просмотры: 61.6K
Голосов: 23

Я создал пользовательский тип записи с машинным именем 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

0
Все ответы на вопрос 4
3
75

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

22 апр. 2013 г. 23:53:29
Комментарии

вау! работает как часы, потратил 1 час :(

Mohammed Sufian Mohammed Sufian
22 сент. 2016 г. 13:05:16

тоже потратил час, спасибо!

Ted Whitehead Ted Whitehead
8 апр. 2020 г. 18:38:21

ага, час потрачен. Ну что ж. Переходим к следующему.

bwoogie bwoogie
28 апр. 2020 г. 20:33:59
6

Измените код

С :

 'has_archive'         => true,

На :

 'has_archive'         => false,

Затем перейдите на страницу постоянных ссылок, измените на стандартные и вернитесь к вашим "человекопонятным постоянным ссылкам"

%postname%/

Теперь должно работать.

Причина, по которой переход на страницу single-{custom_post_type}.php не происходит, заключается в has_archive. Когда has_archive установлен в true, система будет искать archive-{custom_post_type}.php вместо одиночной страницы.

Надеюсь, это сработало.

23 апр. 2013 г. 16:06:31
Комментарии

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

Chip Bennett Chip Bennett
23 апр. 2013 г. 16:07:56

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

Wesley Cheung Wesley Cheung
23 апр. 2013 г. 16:12:11

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

Chip Bennett Chip Bennett
23 апр. 2013 г. 16:18:05

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

Jules Jules
18 янв. 2018 г. 16:07:42

Работает отлично. Спасибо, чувак!

user1202416 user1202416
30 авг. 2019 г. 23:18:35

@Jules - Возможно, не должен, но ОПРЕДЕЛЁННО влияет.

dgo dgo
29 июн. 2022 г. 00:43:34
Показать остальные 1 комментариев
0

Я скопировал ваш код, сбросил правила перезаписи через админку, и теперь Тема использует правильные шаблоны при посещении записи медиа.

Вам нужно сбросить правила перезаписи один раз, используя хук 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/

Примечание: также обратите внимание, что рекомендуемое место для размещения пользовательских типов записей — это плагин, а не тема.

23 апр. 2013 г. 17:58:53
0

Также хорошей практикой является использование 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();
}
22 авг. 2017 г. 14:36:27