Вопрос или проблема
Я не хочу использовать страницу категории как обычно (список постов). Я хотел бы добавить больше контента: текст, изображения, колонки. Какое лучшее решение?
- Может быть, перенаправить со страницы категории на страницу?
- Или получить контент страницы и показать его на странице категории?
Спасибо.
Как сказано в одном из комментариев, это действительно просто. В своей папке темы вы можете создать файл с названием category.php. Поставив его на место, вы сможете модифицировать его сколько угодно, не прибегая к таким сложностям, как перенаправление. Если вы хотите нацелиться на конкретную категорию, предположим, музыку, то файл будет называться category-music.php.
Стоит также отметить, что если вы используете тему, которую не разрабатывали, создайте дочернюю тему и поместите этот файл в этот каталог вместо этого. Никогда не следует изменять файлы существующей темы, включая создание новых файлов, потому что при обновлении темы все ваши изменения будут утеряны.
Редактировать: Черт возьми, я снова написал огромную статью, не проверив, когда был задан вопрос. Так как это было 8 лет назад, я уверен, что это вряд ли поможет тому, кто задал вопрос изначально. Однако я всё же размещу ответ для тех, кто может оказаться здесь с таким же вопросом.
Хорошо, это вопрос, который клиенты задают довольно часто, и он может быть решен разными способами. Тот, который мне нравится использовать, это способ “привязать пользовательский тип записи к категории”. (Вы также можете использовать страницы для этого, но это может стать несколько запутанным).
Шаг 1: Зарегистрировать пользовательский тип записи, возможно, “category-content”.
// Зарегистрировать пользовательский тип записи
function register_category_content_post_type() {
$labels = array(
'name' => _x( 'Категории Контента', 'Post Type General Name', 'text_domain' ),
'singular_name' => _x( 'Категория Контента', 'Post Type Singular Name', 'text_domain' ),
'menu_name' => __( 'Категория Контента', 'text_domain' ),
'name_admin_bar' => __( 'Категория Контента', 'text_domain' ),
'archives' => __( 'Архивы Категории Контента', 'text_domain' ),
'attributes' => __( 'Атрибуты Категории Контента', 'text_domain' ),
'parent_item_colon' => __( 'Родительская Категория Контента:', 'text_domain' ),
'all_items' => __( 'Все Категории Контента', 'text_domain' ),
'add_new_item' => __( 'Добавить Категорию Контента', 'text_domain' ),
'add_new' => __( 'Добавить Новую', 'text_domain' ),
'new_item' => __( 'Новая Категория Контента', 'text_domain' ),
'edit_item' => __( 'Редактировать Категорию Контента', 'text_domain' ),
'update_item' => __( 'Обновить Категорию Контента', 'text_domain' ),
'view_item' => __( 'Просмотр Категории Контента', 'text_domain' ),
'view_items' => __( 'Просмотр Категорий Контента', 'text_domain' ),
'search_items' => __( 'Поиск Категории Контента', 'text_domain' ),
'not_found' => __( 'Не найдено', 'text_domain' ),
'not_found_in_trash' => __( 'Не найдено в Корзине', 'text_domain' ),
'featured_image' => __( 'Избранное Изображение', 'text_domain' ),
'set_featured_image' => __( 'Установить Избранное Изображение', 'text_domain' ),
'remove_featured_image' => __( 'Удалить Избранное Изображение', 'text_domain' ),
'use_featured_image' => __( 'Использовать как Избранное Изображение', 'text_domain' ),
'insert_into_item' => __( 'Вставить в Категорию Контента', 'text_domain' ),
'uploaded_to_this_item' => __( 'Загружено в эту Категорию Контента', 'text_domain' ),
'items_list' => __( 'Список Категорий Контента', 'text_domain' ),
'items_list_navigation' => __( 'Навигация по списку Категорий Контента', 'text_domain' ),
'filter_items_list' => __( 'Фильтр списка Категорий Контента', 'text_domain' ),
);
$args = array(
'label' => __( 'Категория Контента', 'text_domain' ),
'description' => __( 'Содержание для Категорий', 'text_domain' ),
'labels' => $labels,
'supports' => array( 'title', 'editor', 'revisions' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => 'edit.php',
'menu_position' => 5,
'show_in_admin_bar' => false,
'show_in_nav_menus' => false,
'can_export' => true,
'has_archive' => false,
'exclude_from_search' => true,
'publicly_queryable' => false,
'rewrite' => false,
'capability_type' => 'page',
'show_in_rest' => true,
);
register_post_type( 'category_content', $args );
}
add_action( 'init', 'register_category_content_post_type', 0 );
Пользовательский тип записи зарегистрирован как недоступный для просмотра на фронтенде и исключен из поиска. Это сделано для того, чтобы записи не могли быть просмотрены “отдельно”. Также CPT будет помещен в подменю “Записи” на бэкенде.
Шаг 2: Зарегистрировать метабокс на экране редактирования категории, чтобы прикрепить пост “category content” к категории. Это можно сделать легче всего с помощью плагина, такого как cmb2, но в целях “решить это без плагинов” мы все равно сделаем это вручную.
function wpse_168452_add_category_fields() {
$category_content_posts = get_posts(
array(
'post_type' => 'category_content',
'posts_per_page' => -1,
'orderby' => 'post_title',
'order' => 'ASC'
)
);
if( $category_content_posts ){
?>
<label for="content_post_for_this_category">Показать содержимое этого поста на странице категории</label>
<select name="content_post_for_this_category" id="content_post_for_this_category">
<option value="">Пожалуйста, выберите пост для контента</option>
<?php
foreach( $category_content_posts as $category_content_post ){
?>
<option value="<?php echo $category_content_post->ID; ?>">
<?php echo apply_filters( 'the_title', $category_content_post->post_title ); ?>
</option>
<?php
}
?>
</select>
<?php
}
}
add_action( 'category_add_form_fields', 'wpse_168452_add_category_fields' );
add_action( 'category_edit_form', 'wpse_168452_add_category_fields' );
function wpse_168452_save_category_content_fields( $term_id ) {
if( ! isset( $_POST['content_post_for_this_category'] ) )
return;
if( empty( $_POST['content_post_for_this_category'] ) ){
delete_term_meta( $term_id, '_category_content_id' );
return;
}
$content_post_id = absint( $_POST['content_post_for_this_category'] );
if( $content_post_id ){
update_term_meta( $term_id, '_category_content_id', $content_post_id );
}
}
add_action( 'created_category', 'wpse_168452_save_category_content_fields' );
add_action( 'edited_category', 'wpse_168452_save_category_content_fields' );
Теперь у нас есть пользовательский тип записи, который может содержать собственный контент, и мы можем “подключить” категорию к посту. Теперь давайте соберем все это вместе!
Создайте файл “category.php” в папке вашей темы. В файле скопируйте нормальный “цикл”, который вы создали, например, из index.php. Я скопировал самый простейший, который смог найти: index.php из underscores:
<?php
/**
* Основной шаблонный файл
*
* Это самый общий шаблонный файл в теме WordPress
* и один из двух обязательных файлов для темы (другим является style.css).
* Он используется для отображения страницы, когда ничего более специфичного не соответствует запросу.
* Например, он собирает домашнюю страницу, когда файла home.php не существует.
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
*
*/
get_header();
?>
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
if ( have_posts() ) {
/* Начать цикл */
while ( have_posts() ) {
the_post();
/*
* Включите шаблон, специфичный для типа поста.
* Если вы хотите переопределить это в дочерней теме, включите файл
* с именем content-___.php (где ___ — это имя типа поста), и он будет использоваться вместо этого.
*/
get_template_part( 'template-parts/content', get_post_type() );
}
} else {
get_template_part( 'template-parts/content', 'none' );
}
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_footer();
Теперь отредактируем верхнюю часть, чтобы получить наш подключенный пост и вывести его:
<?php
$category_id = get_queried_object_id();
$connected_post_id = get_term_meta( $category_id, '_category_content_id', true );
if( $connected_post_id ){
$connected_post = get_post( $connected_post_id );
if( $connected_post && ( get_post_status( $connected_post_id ) == 'publish' ) ){
?>
<article id="post-<?php echo $connected_post_id; ?>">
<div class="entry-content">
<?php echo apply_filters( 'the_content', $connected_post->post_content ); ?>
</div>
</article>
<?php
}
}
?>
Также, для улучшения возможностей стилизации, мы обернем основной цикл в div. Полный category.php теперь должен выглядеть так:
<?php
/**
* Основной шаблонный файл
*
* Это самый общий шаблонный файл в теме WordPress
* и один из двух обязательных файлов для темы (другим является style.css).
* Он используется для отображения страницы, когда ничего более специфичного не соответствует запросу.
* Например, он собирает домашнюю страницу, когда файла home.php не существует.
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
*
*/
get_header();
?>
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
$category_id = get_queried_object_id();
$connected_post_id = get_term_meta( $category_id, '_category_content_id', true );
if( $connected_post_id ){
$connected_post = get_post( $connected_post_id );
if( $connected_post ){
?>
<article id="post-<?php echo $connected_post_id; ?>">
<div class="entry-content">
<?php echo apply_filters( 'the_content', $connected_post->post_content ); ?>
</div>
</article>
<?php
}
}
?>
<div class="loop-wrapper">
<?php
if ( have_posts() ) {
/* Начать цикл */
while ( have_posts() ) {
the_post();
/*
* Включите шаблон, специфичный для типа поста.
* Если вы хотите переопределить это в дочерней теме, включите файл
* с именем content-___.php (где ___ — это имя типа поста), и он будет использоваться вместо этого.
*/
get_template_part( 'template-parts/content', get_post_type() );
}
} else {
get_template_part( 'template-parts/content', 'none' );
}
?>
</div>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_footer();
И, вуаля… вы закончили. Создайте Пост “Категории Контента”, прикрепите его к категории, выбрав его на экране редактирования категории, и готово.
Я не тестировал этот конкретный код в этой конфигурации, но он должен работать довольно хорошо.
Счастливого кодирования!
.
Ответ или решение
Чтобы сделать архив категорий более схожим с обычной страницей и добавить текст, изображения, столбцы и другие элементы контента, есть несколько подходов. Самым простым и гибким способом будет изменение файлов шаблона темы, чтобы добавить функцию отображения пользовательского контента. Мы можем рассмотреть несколько различных подходов, которые будут зависеть от ваших потребностей и уровня комфорта при работе с кодом WordPress.
Теория
Основная идея заключается в создании настраиваемого вида для страницы архива категорий, который позволяет добавлять уникальный контент, что отличает её от стандартного списка сообщений. Стандартный архив категорий в WordPress ограничивается отображением списка сообщений, относящихся к конкретной категории. Это может не всегда соответствовать вашим требованиям, особенно если вы хотите добавить больше креативного контента.
Существует несколько методов достижения этой цели:
- Использование шаблонов категории (
category.php
). - Регистрация пользовательского типа записи с дополнительным контентом для категории.
- Редирект с категории на страницу с необходимым контентом.
Пример
-
Шаблоны категории: Оптимальный и часто используемый способ — создать кастомизированный файл
category.php
в вашей теме или дочерней теме. Если у вас несколько категорий, можно создать отдельные шаблоны для каждой, используя имя категории в названии файла (например,category-music.php
для категории ‘music’). -
Регистрация пользовательского типа записи: Это позволяет создать специальный тип записи, который будет содержать контент для каждой категории, и связать его с категорией. Этот подход инкапсулирует дополнительный контент в структурированном формате, который легко редактируется и отображается.
-
Редирект на страницу: Это простейший подход в плане кода, но менее гибкий в плане управления контентом и SEO. Вы можете просто настроить редирект на отдельную страницу WordPress с помощью хука
template_redirect
, но это может не всегда быть оптимальным решением.
Применение
Создание шаблона category.php
Очевидное преимущество такого подхода заключается в том, что вы можете полностью контролировать, как будет выглядеть ваша страница архива. Для этого вам нужно:
- Создать файл
category.php
в папке вашей темы (или дочерней темы). - Вставить код, который будет выводить не только список постов, но и ваш пользовательский контент.
Пример кода:
<?php
get_header();
?>
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
// Вывод контента, специфичного для категории
$category_id = get_queried_object_id();
$connected_post_id = get_term_meta($category_id, '_category_content_id', true);
if ($connected_post_id) {
$connected_post = get_post($connected_post_id);
if ($connected_post) {
?>
<article id="post-<?php echo $connected_post_id; ?>">
<div class="entry-content">
<?php echo apply_filters('the_content', $connected_post->post_content); ?>
</div>
</article>
<?php
}
}
// Основной цикл для отображения сообщений
if (have_posts()) {
echo '<div class="posts-list">';
while (have_posts()) {
the_post();
get_template_part('template-parts/content', get_post_type());
}
echo '</div>';
} else {
get_template_part('template-parts/content', 'none');
}
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_footer();
Регистрация пользовательского типа записи
Сначала регистрируем новый тип записи:
// Регистрация нового типа записи
function register_category_content_post_type() {
$labels = array(
'name' => _x('Categories Content', 'Post Type General Name', 'text_domain'),
'singular_name' => _x('Category Content', 'Post Type Singular Name', 'text_domain'),
'menu_name' => __('Category Content', 'text_domain')
);
$args = array(
'label' => __('Category Content', 'text_domain'),
'public' => true,
'supports' => array('title', 'editor', 'revisions')
);
register_post_type('category_content', $args);
}
add_action('init', 'register_category_content_post_type', 0);
После этого, создаем метабокс для привязки пользовательского контента к категорию:
function wpse_168452_add_category_fields() {
$category_content_posts = get_posts(array(
'post_type' => 'category_content',
'posts_per_page' => -1,
'orderby' => 'post_title',
'order' => 'ASC'
));
if ($category_content_posts) {
?>
<label for="content_post_for_this_category">Select a post for category page content:</label>
<select name="content_post_for_this_category" id="content_post_for_this_category">
<option value="">Choose a post for content</option>
<?php
foreach ($category_content_posts as $post) {
echo '<option value="' . $post->ID . '">' . apply_filters('the_title', $post->post_title) . '</option>';
}
?>
</select>
<?php
}
}
add_action('category_add_form_fields', 'wpse_168452_add_category_fields');
add_action('category_edit_form', 'wpse_168452_add_category_fields');
Преимущества использования
- Большая гибкость: Возможность добавлять различный контент, включая текст, изображения и сетки, для различного визуального представления категории.
- SEO улучшение: Вы можете оптимизировать контент каждой категории, чтобы улучшить её индексируемость и привлекательность.
Помните, что для достижения наибольшего эффекта обновление шаблонов и добавление пользовательского контента должно сопровождаться тщательной проверкой (включая все возможные сценарии использования), чтобы избежать ошибок в отображении или функциональности.