Как использовать записи в качестве вкладок на пользовательской странице?

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

Всем привет. Я новичок в программировании/WordPress и мне нужна помощь с пользовательской страницей, которую я разрабатываю прямо сейчас. Идея проста:

  • Список элементов слева
  • Изображение с описанием снизу справа

Каждый элемент в списке, при нажатии, будет изменять изображение и описание, отображаемые справа, примерно как работают вкладки. Должна быть возможность удалять и добавлять элементы из панели управления, поэтому я подумал о создании пользовательского типа записи. Каждая новая запись будет добавляться в список, и ее содержимое будет доступно, когда пользователь нажимает на нее.

Проблема в том, что у меня нет представления о том, как это реализовать с помощью WordPress. Я знаю, как работают вкладки, но испытываю трудности с тем, как получить всю информацию о записях, как отобразить нужную, когда нажата заголовок, как сделать так, чтобы “вкладки” работали при добавлении или удалении новых записей и т.д. Есть ли советы о том, как мне подойти к этому?

Для меня я предлагаю вам решение, состоящее из трех частей:

1 – Создайте пользовательский тип записи (CTP).

2 – Создайте необходимые скрипты JavaScript и CSS.

3 – Создайте специализированный шаблон в корне вашей темы archive-$posttype.php, в нашем примере это будет archive-product.php

Я создал репозиторий на Git, откуда вы можете скачать плагин, вот ссылка: Custom CPT

Исходный код для страницы archive-product.php здесь: archive-product

Так что вы можете скачать их напрямую для тестирования и адаптации под ваши нужды.
Я использовал тему twentynineteen, вам нужно создать физическую страницу с именем: archive-product.php, и ее код указан выше в gist.
Код JS и CSS довольно простой, поэтому улучшите его под свои нужды.

Основной файл:

/**
* Название плагина:     Dro Cpt
* URI плагина:      ЗДЕСЬ УКАЖИТЕ САЙТ ПЛАГИНА
* Описание:     ЗДЕСЬ УКАЖИТЕ ОПИСАНИЕ ПЛАГИНА
* Автор:          ЗДЕСЬ УКАЖИТЕ СВОЁ ИМЯ
* URI автора:      ЗДЕСЬ УКАЖИТЕ СВОЙ САЙТ
* Текстовый домен:     dro-cpt
* Путь к домену:     /languages
* Версия:         0.1.0
*
* @package         Dro_Cpt
*/ 
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}
// Подключаем наш плагин 
  add_action( 'plugins_loaded', 'dro_cpt' );

  function dro_cpt() {

/**
 * Создаем наш CTP
*/
   add_action( 'init', function() {
    $labels = array(
        'name' => _x('Продукты', 'общее название типа записи'),
        'singular_name' => _x('Продукт', 'единичное название типа записи'),
        'add_new' => _x('Добавить новый', 'книга'),
        'add_new_item' => __('Добавить новый продукт'),
        'edit_item' => __('Редактировать продукт'),
        'new_item' => __('Новый продукт'),
        'all_items' => __('Все продукты'),
        'view_item' => __('Просмотреть продукт'),
        'search_items' => __('Искать продукты'),
        'not_found' => __('Продукты не найдены'),
        'not_found_in_trash' => __('Продукты не найдены в корзине'),
        'parent_item_colon' => '',
        'menu_name' => 'Продукты'
    );
    $args = array(
        'labels' => $labels,
        'description' => 'Содержит наши продукты и специфические для продукта данные',
        'public' => true,
        'menu_position' => 5,
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
        'has_archive' => true, // Включение архива типа записи по адресу http://yoursite.com/product
    );
    register_post_type( 'product', $args ); // спасибо Даниэлю Патаки
} );
}

/**
* Подключение js и css только для нашего CTP.
*/
add_action( 'template_redirect', function() {
global $wp_query;
// Загружаем активы только для нашей страниц архива CTP.
if ( $wp_query->is_post_type_archive('product') ) {

    add_action( 'wp_enqueue_scripts', 'dro_cpt_scripts' );

    function dro_cpt_scripts() {
        wp_enqueue_script( 'dro-cpt-js', plugin_dir_url(__FILE__) . 'assets/js/dro-cpt.js', array('jquery'), '1.0.0', TRUE );
        wp_enqueue_style( 'dro-cpt-css', plugin_dir_url(__FILE__) . 'assets/css/dro-cpt.css' );
    }

}
});

Шаблон archive-product.php (twentynineteen/archive-product.php) :

<?php
/**
 * Шаблон для отображения архивных страниц
 *
 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/
 *
 * @package WordPress
 * @subpackage Twenty_Nineteen
 * @since 1.0.0
 */

get_header();
?>

    <section id="primary" class="content-area">
        <main id="main" class="site-main">
                    <div class="dro-cpt">
        <?php if ( have_posts() ) : ?>

            <header class="page-header">
                <?php
                    the_archive_title( '<h1 class="page-title">', '</h1>' );
                ?>
            </header><!-- .page-header -->

            <?php
            // Запускаем цикл.
            while ( have_posts() ) :
                the_post();

                                the_title('<a class="dro-cpt-tab" href="#" data-id="'.get_the_ID().'">','</a>',TRUE);
                                echo '<div class="dro-cpt-description" id= "description-'.get_the_ID().'">';
                                the_post_thumbnail( 'thumbnail' );
                                echo '<div class=" single-description " >'.the_content().'</div>';
                                echo "</div>";
                // Конец цикла.
            endwhile;

            // Навигация по предыдущим/следующим страницам.
            twentynineteen_the_posts_navigation();

            // Если нет контента, подключаем шаблон "Нет записей".
        else :
            get_template_part( 'template-parts/content/content', 'none' );

        endif;
        ?>
                        <div class="dro-cpt-display"></div>
                    </div><!-- .dro-cpt -->
        </main><!-- #main -->
    </section><!-- #primary -->

<?php
get_footer();

JS ( plugins/dro-cpt/assets/dro-cpt.js) :

(function($){

    // отображаем первый элемент
    var firstDescr =  $('div.dro-cpt-description').first().html();
    $('div.dro-cpt-display').html(firstDescr);

    $('a.dro-cpt-tab').on('click',function(e){
        e.preventDefault();
        var id = $(this).data('id');
        var desc = $('#description-'+id).html();
        console.log(desc);
        $('div.dro-cpt-display').html(desc);
    });
})(jQuery);

CSS (plugins/dro-cpt/assets/dro-cpt.css):

div.dro-cpt{

    max-width: 800px;
    margin: 0 auto;
    border: 1px solid #ccc;
}
div.dro-cpt a{
    text-decoration: none;
    color: #000;
    font-size: 1rem;
    border: 1px solid #ccc;
    padding: 5px 10px;
    border-radius: 5px;
    margin-right: 5px;
}
div.dro-cpt a:hover{
    background-color: #f5f5f5;
}
.dro-cpt-description{
    display: none;
}
div.dro-cpt-display{
    margin-top: 10px;
}

.

Ответ или решение

Как использовать записи в качестве вкладок на пользовательской странице в WordPress

Введение

Вам нужно создать пользовательскую страницу WordPress, где список элементов будет находиться слева, а справа будет отображаться изображение с описанием, меняющееся по клику на элемент из списка. Для этого мы будем использовать пользовательский тип записи (Custom Post Type, CTP).

Шаг 1: Создание пользовательского типа записи (CPT)

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

add_action( 'init', function() {
    $labels = array(
        'name'               => _x('Продукты', 'первичное название'),
        'singular_name'      => _x('Продукт', 'единичное название'),
        'add_new'            => _x('Добавить новый', 'книга'),
        'add_new_item'       => __('Добавить новый продукт'),
        'edit_item'          => __('Редактировать продукт'),
        'new_item'           => __('Новый продукт'),
        'all_items'          => __('Все продукты'),
        'view_item'          => __('Просмотреть продукт'),
        'search_items'       => __('Поиск продуктов'),
        'not_found'          => __('Продукты не найдены'),
        'not_found_in_trash' => __('Продукты не найдены в корзине'),
        'menu_name'          => 'Продукты'
    );
    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt'),
        'has_archive'        => true,
    );
    register_post_type( 'product', $args );
});

Этот код создаст новый тип записи с названием «Продукты», в который можно будет добавлять расширенные данные, такие как изображения и описания.

Шаг 2: Создание пользовательского шаблона

Следующим этапом будет создание шаблона для вывода всех продуктов и их функциональности вкладок. Создайте файл archive-product.php в вашей теме, и используйте следующий код:

get_header(); ?>

<section id="primary" class="content-area">
    <main id="main" class="site-main">
        <div class="dro-cpt">
            <?php if ( have_posts() ) : ?>
                <header class="page-header">
                    <?php the_archive_title( '<h1 class="page-title">', '</h1>' ); ?>
                </header>

                <?php while ( have_posts() ) : the_post(); ?>
                    <a class="dro-cpt-tab" href="#" data-id="<?php echo get_the_ID(); ?>">
                        <?php the_title(); ?>
                    </a>
                    <div class="dro-cpt-description" id="description-<?php echo get_the_ID(); ?>">
                        <?php the_post_thumbnail('thumbnail'); ?>
                        <div class="single-description"><?php the_content(); ?></div>
                    </div>
                <?php endwhile; ?>

            <?php else : ?>
                <?php get_template_part( 'template-parts/content/content', 'none' ); ?>
            <?php endif; ?>
            <div class="dro-cpt-display"></div>
        </div>
    </main>
</section>

<?php get_footer(); ?>

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

Шаг 3: Добавление JavaScript для функциональности вкладок

Теперь вам нужно будет добавить немного JavaScript для обработки кликов по вкладкам и обновления контента. Создайте файл dro-cpt.js в папке вашего плагина и добавьте следующий код:

(function($){
    var firstDescr = $('div.dro-cpt-description').first().html();
    $('div.dro-cpt-display').html(firstDescr);

    $('a.dro-cpt-tab').on('click', function(e){
        e.preventDefault();
        var id = $(this).data('id');
        var desc = $('#description-'+id).html();
        $('div.dro-cpt-display').html(desc);
    });
})(jQuery);

Этот JavaScript код позволяет отображать соответствующее описание при клике на вкладку.

Шаг 4: Добавление стилей

Наконец, добавьте несколько CSS-стилей, чтобы улучшить внешний вид:

.dro-cpt {
    max-width: 800px;
    margin: 0 auto;
    border: 1px solid #ccc;
}
.dro-cpt a {
    text-decoration: none;
    color: #000;
    font-size: 1rem;
    border: 1px solid #ccc;
    padding: 5px 10px;
    border-radius: 5px;
    margin-right: 5px;
}
.dro-cpt a:hover {
    background-color: #f5f5f5;
}
.dro-cpt-description {
    display: none;
}
.dro-cpt-display {
    margin-top: 10px;
}

Заключение

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

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

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