Пользовательский цикл и бесконечная прокрутка

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

Я использую кастомизированную версию темы _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. Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь обращаться за помощью!

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

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