Вопрос или проблема
Я пытаюсь вывести пользовательский цикл, созданный с помощью шорткода в пользовательском шаблоне страницы. Вот код, который я использую для генерации шорткода:
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()
для захвата выходных данных, чтобы они могли быть выведены правильно. Следуя этим принципам, вы сможете создавать более эффективные и оптимизированные шаблоны страниц.