Вопрос или проблема
Я использую кастомизированную версию темы _s, где у меня есть кастомный тип записи продуктов (CPT).
В следующих файлах мне нужно использовать бесконечную прокрутку (предоставленную Jetpack) –
archive-products.php
taxonomy-[tax-name].php
home.php
archive.php
Теперь проблема в том, что большинство из этих шаблонов используют пользовательский цикл (с использованием WP_Query, который заканчивается пагинацией после while()).
Я использовал следующий код в functions.php после активации Jetpack и модуля Photon –
function vg_infinite_scroll_init() {
add_theme_support( 'infinite-scroll', array(
'container' => 'page-content',
'footer' => 'page',
'type' => 'click',
'render' => false,
) );
}
add_action( 'after_setup_theme', 'vg_infinite_scroll_init' );
Кроме того, я обернул все записи под #page-content
в archive-products.php
. Но бесконечная прокрутка не работает ни в режиме прокрутки, ни в режиме клика. Есть идеи?
Мне также сказали, что я должен использовать аргумент render
бесконечного цикла для описания моего пользовательского цикла, но я не уверен, как это сделать, так как это будет различаться в каждом шаблоне.
Например: Следующий код я использую в archive-products.php
–
<div class="row">
<?php
$prod_arch_args = array(
'post_type' => 'products',
'posts_per_page' => '12',
'paged' => get_query_var( 'paged' ),
);
$prod_arch_query = new WP_Query( $prod_arch_args );
if( $prod_arch_query->have_posts() ) {
while( $prod_arch_query->have_posts() ) {
$prod_arch_query->the_post();
$prod_images = get_post_meta( $post->ID, 'cmb2_prod_images', true );
$prod_price = get_post_meta( $post->ID, 'cmb2_prod_price', true );
?>
<div class="col-xs-12 col-sm-6 col-md-4 product-main wow fadeInUp">
<figure itemscope itemtype="http://schema.org/Product" class="product-item relative">
<div class="product-display">
<div class="list-pic">
<a href="https://wordpress.stackexchange.com/questions/196360/<?php the_permalink(); ?>">
<?php
foreach ($prod_images as $key => $value) {
?>
<?php echo wp_get_attachment_image( $key, 'prod-list', 'itemprop = image' ); ?>
<?php
continue;
}
?>
</a>
</div>
<div class="view-detail"><a href="https://wordpress.stackexchange.com/questions/196360/<?php the_permalink(); ?>">Посмотреть детали</a></div>
</div>
<figcaption class="relative">
<div class="pro-list-title">
<h3 itemprop="name">
<a href="#"><?php the_title(); ?></a>
</h3>
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="pro-list-rates">
<div class="pro-list-rates-new">
<span itemprop="priceCurrency">
<i class="fa fa-inr"></i>
</span>
<span itemprop="price"><?php echo $prod_price; ?></span>
</div>
</div>
<div class="add-container">
<!-- <a class="btn btn-1 btn-1a">
<i class="fa fa-cart-plus"></i> Добавить в контейнер</a> -->
<?php vg_after_entry(); ?>
</div>
</figcaption>
</figure>
</div>
<?php
}
the_posts_navigation();
wp_reset_postdata();
}
?>
</div>
Я использовал ‘init’ в add_action в своей реализации бесконечной прокрутки, попробуйте это.
add_action( 'init', 'vg_infinite_scroll_init' );
Что касается вашего вопроса о рендеринге пользовательского запроса, вы можете сделать следующее.
– Установить рендер на имя вашей функции
'render' => 'your_render_function',
– Добавить вашу функцию, чтобы вызвать указанный шаблон цикла
function your_render_function(){
get_template_part( 'custom-loop-content' )
}
Создайте файл под названием custom-loop-content.php и добавьте свой пользовательский запрос туда. Имейте в виду, что ваш запрос будет сбрасываться каждый раз. Я не смог придумать способ обойти это.
Ответ или решение
Конечно! Постараемся решить ваши проблемы с реализацией бесконечной прокрутки (infinite scroll) для вашего пользовательского типа записи (CPT) "продукты".
1. Инициализация Бесконечной Прокрутки
Вы уже правильно добавили поддержку бесконечной прокрутки в файл functions.php
. Однако, вместо использования хуков after_setup_theme
или init
, мы можем попробовать использовать хук wp_enqueue_scripts
, чтобы убедиться, что все скрипты загружены правильно:
function vg_infinite_scroll_init() {
add_theme_support( 'infinite-scroll', array(
'container' => 'page-content',
'footer' => 'page',
'type' => 'click', // Или 'scroll', в зависимости от ваших потребностей
'render' => 'vg_render_products',
) );
}
add_action( 'wp_enqueue_scripts', 'vg_infinite_scroll_init' );
2. Создание функции Render
Ваш следующий шаг – создать функцию, которая будет использоваться для повторного рендеринга пользовательского цикла. Например, создайте функцию vg_render_products
в файле functions.php
:
function vg_render_products() {
// Задайте аргументы для WP_Query
$prod_arch_args = array(
'post_type' => 'products',
'posts_per_page' => 12,
'paged' => get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1,
);
$prod_arch_query = new WP_Query( $prod_arch_args );
if ( $prod_arch_query->have_posts() ) {
while ( $prod_arch_query->have_posts() ) {
$prod_arch_query->the_post();
$prod_images = get_post_meta( get_the_ID(), 'cmb2_prod_images', true );
$prod_price = get_post_meta( get_the_ID(), 'cmb2_prod_price', true );
// Здесь ваш HTML-код для вывода продукта
?>
<div class="col-xs-12 col-sm-6 col-md-4 product-main wow fadeInUp">
<figure itemscope itemtype="http://schema.org/Product" class="product-item relative">
<div class="product-display">
<div class="list-pic">
<a href="<?php the_permalink(); ?>">
<?php foreach ($prod_images as $key => $value) {
echo wp_get_attachment_image($key, 'prod-list', 'itemprop=image');
} ?>
</a>
</div>
<div class="view-detail">
<a href="<?php the_permalink(); ?>">View Detail</a>
</div>
</div>
<figcaption class="relative">
<div class="pro-list-title">
<h3 itemprop="name">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h3>
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="pro-list-rates">
<div class="pro-list-rates-new">
<span itemprop="priceCurrency"><i class="fa fa-inr"></i></span>
<span itemprop="price"><?php echo esc_html($prod_price); ?></span>
</div>
</div>
</figcaption>
</figure>
</div>
<?php
}
wp_reset_postdata();
}
}
// Не забудьте обновить ваши ссылки в HTML, поскольку они должны ссылаться на корректные адреса.
3. Обертывание Контента
Убедитесь, что ваш HTML-код для обертывания продуктов находится в контейнере с ID page-content
, чтобы JQuery Jetpack мог корректно находить его для бесконечной прокрутки:
<div id="page-content" class="row">
<?php vg_render_products(); // Здесь вы можете вызывать вашу функцию рендера напрямую при первой загрузке ?>
</div>
4. Подключение JavaScript
Убедитесь, что вы подключили необходимые JavaScript файлы, которые требуются для Jetpack. Иногда может быть полезно вручную проверить настройки Jetpack в процессе разработки.
5. Проверка на Конфликты
Если после всех правок бесконечная прокрутка всё ещё не работает, возможно, существуют конфликты с другими плагинами или скриптами. Отключите все плагины, кроме Jetpack, и проверьте работу дверного механизма. Если всё работает, снова активируйте плагины по одному, пока не найдете проблемный.
Заключение
Следуя вышеизложенным шагам, вы сможете настроить бесконечную прокрутку для вашего пользовательского типа записи в WordPress. Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь обращаться за помощью!