Вопрос или проблема
Хорошо,
Куда направлен пользовательский тип записи? Это single.php или page.php? У меня есть page.php с частью шаблона, которая отображает каждый из моих пользовательских типов, но когда я нажимаю на элемент, я просто получаю 404.
Это моя регистрация пользовательского типа записи
$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' ),
);
$args = array(
'label' => __( 'Подиум', 'text_domain' ),
'description' => __( 'Фотографии подиумов, сделанные на го-картах Ноттингема', 'text_domain' ),
'labels' => $labels,
'supports' => array( 'title', 'thumbnail', 'custom-fields', ),
'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' => false,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'capability_type' => 'page',
);
register_post_type( 'group', $args );
мой page.php
<?php get_header(); ?>
<main class="container">
<div class="row">
<section id="post-<?php the_ID(); ?>" <?php post_class('podium col-md-12'); ?>>
<?php query_posts( 'post_type=group&posts_per_page=5'); ?>
<?php
// Начало цикла.
while ( have_posts() ) : the_post();
get_template_part( 'content', 'podium' );
// Конец цикла.
endwhile;
?>
</section><!-- Конец статьи -->
</div><!-- Конец строки -->
</main><!-- Конец секции -->
а это мой content-podium.php
<h1><?php the_title(); ?></h1>
<p>
Просмотреть все прошлые группы, которые посетили го-карты Ноттингема
</p>
<ul>
<li class="col-xs-6 col-sm-6 col-md-4 col-lg-3">
<a href="https://wordpress.stackexchange.com/questions/174733/<?php the_permalink() ?>">
<?php $url = wp_get_attachment_url( get_post_thumbnail_id($post->ID, 'post-thumbnail') ); ?>
<img src="<?php echo $url ?>" />
</a>
</li>
</ul>
Должен ли мой page.php на самом деле отображать сами элементы, а content-podium фактически отображать их по одному?
Я много искал в Google и только запутался, и ничего не работает. Чтобы увидеть это в действии, можно посетить http://thomasrenshaw.com/gallery/.
После регистрации пользовательского типа записи необходимо сбросить правила переписывания, чтобы WordPress знал, каким должно быть URL/slug.
Ответ или решение
Когда вы сталкиваетесь с проблемой отображения пользовательского типа записи (Custom Post Type, CPT) в WordPress, и получаете ошибку 404 при попытке открыть его, это может быть результатом нескольких факторов. Давайте разберемся с вашей ситуацией более подробно.
1. Проверьте регистрацию пользовательского типа записи
Ваш код для регистрации кастомного типа записи выглядит корректно, но я заметил, что вы используете label
в массиве $args
. Однако, вы зарегистрировали тип записи как 'group'
, а в метках вы используете 'Podium'
. Убедитесь, что это соответствует вашим ожиданиям. Также проверьте, что правильно указали has_archive
.
2. Флешить правила перезаписи
Как упоминалось в вашем описании, после регистрации пользовательского типа записи необходимо сбросить правила перезаписи. Это делается с помощью функции flush_rewrite_rules()
. Обычно это необходимо делать только один раз, после того как вы добавляете или изменяете пользовательские типы записей. Чтобы выполнить это действие, вы можете добавить следующее в ваш файл functions.php
и затем удалить:
add_action('init', 'my_rewrite_flush');
function my_rewrite_flush() {
flush_rewrite_rules();
}
Затем просто обновите страницу вашего сайта. После этого удалите этот код, чтобы избежать постоянного сброса правил при каждом загрузке страницы.
3. Проверьте страницы шаблона
Ваш файл page.php
по умолчанию не будет обрабатывать внутренние ссылки для пользовательских типов записей. Вам необходимо убедиться, что шаблон для отображения единичных записей (single) для вашего кастомного типа определен.
Создайте файл single-group.php
в вашей теме. Это файл, который будет отвечать за отображение отдельного элемента вашего кастомного типа записи. В этом файле вы можете указать, как именно должны отображаться подробности записи:
<?php get_header(); ?>
<main class="container">
<div class="row">
<article id="post-<?php the_ID(); ?>" <?php post_class('podium col-md-12'); ?>>
<h1><?php the_title(); ?></h1>
<p>Здесь будет контент вашего кастомного типа записи.</p>
<?php if ( has_post_thumbnail() ) {
the_post_thumbnail();
} ?>
<div>
<?php the_content(); ?>
</div>
</article>
</div>
</main>
<?php get_footer(); ?>
4. Корректное использование the_permalink()
В вашем шаблоне content-podium.php
используйте the_permalink()
для получения правильного URL записи:
<a href="<?php the_permalink(); ?>">
Не забудьте удалить статическую ссылку, которую вы использовали ранее, чтобы она указывала на ваше собственное пользовательское содержимое.
5. Убедитесь, что ссылки работают
Убедитесь, что постоянные ссылки настроены правильно в настройках WordPress (Настройки -> Постоянные ссылки). Попробуйте изменить их и сохранить, даже если вы не вносили никаких изменений. Это может помочь обновить правила URL вашего сайта.
Заключение
Не дайте недоразумениям привести вас к потерям времени. Правильная регистрация, сброс правил перезаписи и обработка шаблонов — это ключевые моменты для успешной работы пользовательских типов записей в WordPress. Если после всех этих шагов проблема не исчезает, не стесняйтесь обратиться за помощью к сообществу WordPress или к опытным разработчикам.
Если вам нужна дополнительная помощь или у вас возникли еще вопросы, пожалуйста, дайте знать!