Пагинация ссылок в шорткоде WP Query

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

Я искал ответ на этот вопрос, но безуспешно. У меня есть WP-запрос, заключенный в шорткод. Я настроил функцию пагинации, которая выводит ссылки на странице. Однако URL страницы не изменяется при нажатии (href правильный — /page/2). Я понимаю, что проблема в основном запросе, когда он выполняется в шорткоде. Любая помощь будет очень appreciated.

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

$args = array(
    'post_type' => $type,
    'posts_per_page' => -1,
    'orderby' => 'rand',
    'paged' => $paged

);

    $the_query = new WP_Query($args); 

// Помещаем объект по умолчанию в временную переменную
$tmp_query = $wp_query;
// Теперь полностью очищаем его
$wp_query = null;
// Снова заполняем глобальную переменную нашим пользовательским запросом
$wp_query = $the_query;

?>

    <div class="row">
<?php  if ( $the_query->have_posts() ) :  $i=0; ?>

    <!-- цикл -->
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); 
        $sphere = get_post_meta(get_the_id(),'testimonial_profession', true);
        if ($i == 2) {
        $i = 0;
        ?>
        </div>
        <div class="row">
        <?php
    }

    ?>
        <div class="col-md-6 col-sm-12 col-xs-12">
                        <div class="testimonial_inner_wrapper">
                                <?php if(!has_post_thumbnail()): ?>
                                <h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
                                <?php if(!empty($sphere)): ?>
                                    <div class="testimonial_sphere"><?php echo($sphere); ?></div>
                                <?php endif; ?>
                                <div class="short_separator"></div>
                            <?php else: ?>
                                <div class="media">
                                    <div class="media-left media-top">
                                        <div class="testimonial-media-unit">
                                            <?php the_post_thumbnail('img-69-69', array('class'=>'testimonial-media-unit-rounded')); ?>
                                        </div>
                                    </div>
                                    <div class="media-body">
                                        <h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
                                        <?php if(!empty($sphere)): ?>
                                            <div class="testimonial_sphere"><?php echo($sphere); ?></div>
                                        <?php endif; ?>
                                        <div class="short_separator"></div>
                                    </div>  
                                </div>
                            <?php endif; ?>
                                                        <div class="testimonial_inner_content" style="color:#aaaaaa"><p><?php the_excerpt(); ?></p>
</div>
                        </div> <!-- внутренний обертка -->
                    </div>

    <?php $i++; endwhile; ?>
    <!-- конец цикла -->
</div><div class="poNav">
     <?php

$big = 999999999; // нужно маловероятное целое число

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $the_query->max_num_pages
) );

    $wp_query = NULL;
$wp_query = $temp_query;
?></div>

    <?php wp_reset_postdata(); ?>
    <?php
    $myvariable = ob_get_clean();
    return $myvariable; ?>

<?php else : ?>
    <p><?php _e( 'Извините, ни один пост не соответствует вашим критериям.' ); ?></p>
<?php endif; 
}

Ваша переменная $args будет полезна.

Как я вижу, вы создаете пользовательский WP_QUERY, поэтому get_query_var('paged') не имеет отношения к вашему $the_query = new WP_QUERY, а к global $wp_query.

Возможное решение:
объявите global $paged и добавьте его в $args = array( /* ваши параметры здесь*/, 'paged' => $paged );, также измените get_query_var('paged') на $paged.

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

Конечно! Давайте рассмотрим вашу проблему с пагинацией в шорткоде WP_Query и предоставим решение.

Ваша проблема связана с тем, что вы создаёте собственный запрос с помощью WP_Query, и, соответственно, get_query_var('paged') не будет работать так, как вы ожидаете, поскольку он привязан к основному запросу. Для правильной работы пагинации внутри шорткода необходимо использовать собственную переменную $paged и убедиться, что эта переменная корректно обрабатывается.

Вот шаги для исправления:

  1. Измените способ получения текущей страницы, используя переменную $paged, а не get_query_var('paged').
  2. Объявите глобальную переменную $paged, чтобы WP_Query мог корректно отслеживать номера страниц.
  3. Обновите ваш массив аргументов $args, чтобы он использовал переменную $paged.

Вот пример исправленного кода:

function your_shortcode_function($atts) {
    ob_start();

    // Декларация глобальной переменной
    global $paged;
    $paged = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1;

    $args = array(
        'post_type' => 'your_post_type', // укажите ваш тип поста
        'posts_per_page' => 10, // измените на нужное число постов на странице
        'orderby' => 'rand',
        'paged' => $paged
    );

    $the_query = new WP_Query($args);

    if ($the_query->have_posts()) : ?>
        <div class="row">
            <?php 
            $i = 0; 
            while ($the_query->have_posts()) : $the_query->the_post(); 
                // Ваша логика отображения постов
                ?>
                <div class="col-md-6 col-sm-12 col-xs-12">
                    <div class="testimonial_inner_wrapper">
                        <h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
                        <div class="short_separator"></div>
                        <div class="testimonial_inner_content" style="color:#aaaaaa">
                            <p><?php the_excerpt(); ?></p>
                        </div>
                    </div>
                </div>
                <?php 
                $i++; 
            endwhile; ?>
        </div>

        <div class="poNav">
            <?php
            $big = 999999999; // Необходимое маловероятное число
            echo paginate_links(array(
                'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
                'format' => '?paged=%#%',
                'current' => max(1, $paged),
                'total' => $the_query->max_num_pages,
            ));
            ?>
        </div>

    <?php 
    else : 
        echo '<p>' . __('Извините, никаких записей не найдено.') . '</p>';
    endif;

    wp_reset_postdata(); // Сбрасываем данные постов
    return ob_get_clean(); // Возвращаем весь вывод шорткода
}

Примечания:

  1. Имейте в виду, что значение posts_per_page в $args следует установить, чтобы обеспечить количество постов на странице, а не -1, которое показывает все записи сразу.
  2. Убедитесь, что используется правильное имя для вашего типа поста в post_type.
  3. Проверьте, чтобы ваше правило перезаписи URL было настроено правильно, чтобы поддерживать пагинацию.

С помощью этих изменений, ваша пагинация должна работать корректно, и URL страницы будет изменяться при клике на номера страниц.

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

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