Пользовательский цикл с использованием шорткода в пользовательском шаблоне страницы

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

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

function archive_sc( $atts ) {

    // Атрибуты
    extract( shortcode_atts(
        array(
            'cat' => '',
            'number' => 10,
        ), $atts )
    );

        $args = array( 
            'post_type' => 'smr-product',
            'smr-product-category' => $cat, // 'taxonomy' => 'term',
            'posts_per_page' => $number,
        );
            // Запрос
            $the_query = null;
            $the_query = new WP_Query( $args );

            // Цикл
            if ( $the_query->have_posts() ) {
                while ( $the_query->have_posts() ) {
                    smr_product_the_frontend_item();
                }
            } else {
                // записи не найдены
            }
            /* Восстановить оригинальные данные поста */
            wp_reset_postdata();
}
add_shortcode( 'pcats', 'archive_sc' );

А вот код в пользовательском шаблоне страницы:

<?php
/*
Template Name: Product Archive
*/

get_header();
?>
    <section id="content" class="review-container">
    <?php while ( have_posts() ) : the_post(); ?>
        <div id="list-items-review">
            <?php the_content(); ?>
        </div>
    <?php endwhile; ?>  
    </section>

<?php get_footer(); ?>

Функция smr_product_the_frontend_item() просто отвечает за HTML каждого продукта.

Тем не менее, она возвращает бесконечное количество записей (хотя в блоге всего около 20 продуктов) из ниоткуда. Что я делаю не так?

Проблема, кажется, в Цикле. Внутри цикла вы не увеличиваете $the_query. Вы можете изменить код цикла следующим образом:

// Цикл
if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();  // Добавьте эту строку, чтобы исправить проблему
        smr_product_the_frontend_item();
    }
} else {
    // записи не найдены
}

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

Функция шорткода

function archive_sc( $atts ) {
    // Атрибуты
    $atts = shortcode_atts(
        array(
            'cat' => '',
            'number' => 10,
        ),
        $atts
    );

    $args = array( 
        'post_type' => 'smr-product',
        'smr-product-category' => $atts['cat'], // 'taxonomy' => 'term',
        'posts_per_page' => $atts['number'],
    );

    // Запрос
    $the_query = new WP_Query( $args );

    // Цикл
    ob_start();
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            smr_product_the_frontend_item();
        }
    } else {
        // записи не найдены
    }
    wp_reset_postdata();

    return ob_get_clean();
}
add_shortcode( 'pcats', 'archive_sc' );

Шаблон страницы

<?php
/*
Template Name: Product Archive
*/

get_header();
?>
    <section id="content" class="review-container">
    <?php while ( have_posts() ) : the_post(); ?>
        <div id="list-items-review">
            <?php echo do_shortcode(get_the_content()); ?>
        </div>
    <?php endwhile; ?>  
    </section>

<?php get_footer(); ?>

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

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

Анализ текущего кода

Вы определяете шорткод archive_sc, который принимает атрибуты, такие как категория и число записей. Здесь вы используете WP_Query для выборки пользовательских записей типа smr-product. Однако в исходном коде не производится вызов функции the_post(), что приводит к бесконечному циклу, так как не обновляются указатели на записи.

Исправление цикла

Чтобы исправить это, необходимо внести изменения в блок, где происходит обход записей. В коде шорткода следует добавить вызов метода $the_query->the_post() в цикле, чтобы правильно обрабатывать каждую запись:

function archive_sc( $atts ) {
    // Атрибуты
    $atts = shortcode_atts(
        array(
            'cat' => '',
            'number' => 10,
        ),
        $atts
    );

    $args = array( 
        'post_type' => 'smr-product',
        'taxonomy' => 'smr-product-category',
        'term' => $atts['cat'], 
        'posts_per_page' => $atts['number'],
    );

    // Запрос
    $the_query = new WP_Query( $args );

    // Цикл
    ob_start();
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post(); // Меняем указатель на текущую запись
            smr_product_the_frontend_item();
        }
    } else {
        echo 'Записи не найдены'; // Выполняем вывод в случае отсутствия записей
    }
    wp_reset_postdata();

    return ob_get_clean(); // Возвращаем вывод из буфера
}
add_shortcode( 'pcats', 'archive_sc' );

Внедрение шорткода в пользовательский шаблон страницы

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

Вот как это можно сделать:

<?php
/*
Template Name: Product Archive
*/
get_header();
?>
<section id="content" class="review-container">
    <?php while ( have_posts() ) : the_post(); ?>
        <div id="list-items-review">
            <?php echo do_shortcode(get_the_content()); // Добавляем обработку шорткодов ?>
        </div>
    <?php endwhile; ?>
</section>
<?php get_footer(); ?>

Оптимизация и тестирование

После всех внесенных изменений убедитесь, что ваши пользовательские записи являются действительными и что у них установлены соответствующие таксономии. Не забудьте провести тестирование, чтобы убедиться, что все работает корректно.

Заключение

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

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

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