Как сделать, чтобы мой архив категории вел себя как страница?

Вопрос или проблема

Я не хочу использовать страницу категории как обычно (список постов). Я хотел бы добавить больше контента: текст, изображения, колонки. Какое лучшее решение?

  • Может быть, перенаправить со страницы категории на страницу?
  • Или получить контент страницы и показать его на странице категории?

Спасибо.

Как сказано в одном из комментариев, это действительно просто. В своей папке темы вы можете создать файл с названием 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 ограничивается отображением списка сообщений, относящихся к конкретной категории. Это может не всегда соответствовать вашим требованиям, особенно если вы хотите добавить больше креативного контента.

Существует несколько методов достижения этой цели:

  1. Использование шаблонов категории (category.php).
  2. Регистрация пользовательского типа записи с дополнительным контентом для категории.
  3. Редирект с категории на страницу с необходимым контентом.

Пример

  1. Шаблоны категории: Оптимальный и часто используемый способ — создать кастомизированный файл category.php в вашей теме или дочерней теме. Если у вас несколько категорий, можно создать отдельные шаблоны для каждой, используя имя категории в названии файла (например, category-music.php для категории ‘music’).

  2. Регистрация пользовательского типа записи: Это позволяет создать специальный тип записи, который будет содержать контент для каждой категории, и связать его с категорией. Этот подход инкапсулирует дополнительный контент в структурированном формате, который легко редактируется и отображается.

  3. Редирект на страницу: Это простейший подход в плане кода, но менее гибкий в плане управления контентом и 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 улучшение: Вы можете оптимизировать контент каждой категории, чтобы улучшить её индексируемость и привлекательность.

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

Оцените материал
Добавить комментарий

Капча загружается...