Два запроса на одной странице с пагинацией.

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

Я пытаюсь разместить два запроса на одной странице с пагинацией. Но пагинация одного мешает другому. Как я могу сделать это с двумя независимыми пагинациями?

<div class="row list-group">
    <?php 

        function  query_group_by_filter($groupby){
            global $wpdb;

            return $wpdb->postmeta . '.meta_value ';
        }
        global $paged, $wp_query, $wp;

        $args = wp_parse_args($wp->matched_query);
        if ( !empty ( $args['paged'] ) && 0 == $paged ) {
            $wp_query->set('paged', $args['paged']);
            $paged = $args['paged'];
        }                               
        $temp = $wp_query;
        $wp_query= null;
        add_filter('posts_groupby', 'query_group_by_filter');
        $args = array(
        'post_type' => 'a-casa',
        'posts_per_page' => 1,
        'paged' => $paged,
        'meta_key'      => 'semana',
        'post_status' => 'publish',
        'order' => 'ASC',
        );
        $wp_query = new WP_Query($args);                                    
        //$wp_query->query('post_type=post&posts_per_page=".$betubeVideoCount."&paged='.$paged);
        $current = -1;
        $current2 = 0;
        $post_id = $post->ID;
        remove_filter('posts_groupby', 'query_group_by_filter');
    ?>
    <?php while ($wp_query->have_posts()) : $wp_query->the_post(); $current++; $current2++; ?>
    <div class="large-12 columns">
        <div style="text-align: center;"> 
            <h3>Videos da Semana: <?php $atrizweek = get_field('semana'); echo $atrizweek; ?></h3>

            <h4><?php 
                $atriz_id = get_field('atrizes');

                $atriz = get_post( $atriz_id[0]);

            echo "<a style="text-align: center;" href="#">{$atriz->post_title}</a>"; ?></h4>                    
        </div>
    </div>

    <div class="large-12 columns"><div class="pagination-semana">

        <div class="nav-previous alignleft"><?php next_posts_link( 'Semana Anterior' ); ?></div>
        <div class="nav-next alignright"><?php previous_posts_link( 'Próxima Semana' ); ?></div>

    </div></div>
    <div class="item large-4 medium-6 columns end <?php echo $myClass; ?>">

    </div><!--item large-4-->

    <?php endwhile; ?>


    <?php wp_reset_query(); ?>
</div><!--new-all-->

<!-- NEW MY CUSTOM-->
<div class="tabs-content" data-tabs-content="newVideos">
    <div class="tabs-panel is-active" id="new-all">
        <div class="row list-group">
            <?php 
                global $paged, $wp_query, $wp;
                $args = wp_parse_args($wp->matched_query);

                if ( !empty ( $args['paged'] ) && 0 == $paged ) {
                    $wp_query->set('paged', $args['paged']);
                    $paged = $args['paged'];
                }                               
                $temp = $wp_query;
                $wp_query= null;

                $args = array(
                'post_type' => 'a-casa',
                'posts_per_page' => $betubeVideoCount,
                'paged' => $paged,
                'meta_key'      => 'semana',
                'meta_value'    => $atrizweek,
                'post_status' => 'publish',
                'orderby' => 'date',
                );
                $wp_query = new WP_Query($args);    


                //$wp_query->query('post_type=post&posts_per_page=".$betubeVideoCount."&paged='.$paged);
                $current = -1;
                $current2 = 0;
                $post_id = $post->ID;

            ?>
            <?php while ($wp_query->have_posts()) : $wp_query->the_post(); $current++; $current2++; ?>
            <div class="item large-4 medium-6 columns end <?php echo $myClass; ?>">
                <div class="post thumb-border">
                    <div class="post-thumb">
                        <?php 
                            if( has_post_thumbnail()){
                                echo get_the_post_thumbnail();
                                }else{
                            ?>
                            <img src="<?php echo get_template_directory_uri() . '/assets/images/nothumb.png' ?>" alt="No Thumb"/>
                            <?php
                            }
                        ?>
                        <a href="<?php the_permalink(); ?>" class="hover-posts">
                            <span><i class="fa fa-play"></i><?php esc_html_e( 'Watch Video', 'betube' ); ?></span>
                        </a>
                    </div><!--post thumb-border-->
                </div><!--item large-4-->
                <?php endwhile; ?>

                <div class="large-12 columns"><?php 
                    global $wp_rewrite;         
                    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

                    $classiera_pagination = array(
                    'base' => @add_query_arg('page','%#%'),
                    'format' => '',
                    'total' => $wp_query->max_num_pages,
                    'current' => $current,
                    'show_all' => false,
                    'type' => 'plain',
                    );

                    if( $wp_rewrite->using_permalinks() )
                    $classiera_pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg('s',get_pagenum_link(1) ) ) . 'page/%#%/', 'paged');

                    if( !empty($wp_query->query_vars['s']) )
                    $classiera_pagination['add_args'] = array('s'=>get_query_var('s'));

                    echo '<div class="pagination">' . paginate_links($classiera_pagination) . '</div>';         
                ?></div>
            </div><!--row list-group-->
            <?php wp_reset_query(); ?>
        </div><!--new-all-->        

Пожалуйста, используйте код ниже, надеюсь, он сработает для вас
<div class="row list-group">
    <?php 

        function  query_group_by_filter($groupby){
            global $wpdb;

            return $wpdb->postmeta . '.meta_value ';
        }
        global $paged, $wp_query, $wp;

        $args = wp_parse_args($wp->matched_query);
        if ( !empty ( $args['paged'] ) && 0 == $paged ) {
            $wp_query->set('paged', $args['paged']);
            $paged = $args['paged'];
        }                               
        $temp = $wp_query;
        $wp_query= null;
        add_filter('posts_groupby', 'query_group_by_filter');
        $args = array(
        'post_type' => 'a-casa',
        'posts_per_page' => 1,
        'paged' => $paged,
        'meta_key'      => 'semana',
        'post_status' => 'publish',
        'order' => 'ASC',
        );
        $wp_query = new WP_Query($args);                                    
        //$wp_query->query('post_type=post&posts_per_page=".$betubeVideoCount."&paged='.$paged);
        $current = -1;
        $current2 = 0;
        $post_id = $post->ID;
        remove_filter('posts_groupby', 'query_group_by_filter');
    ?>
    <?php while ($wp_query->have_posts()) : $wp_query->the_post(); $current++; $current2++; ?>
    <div class="large-12 columns">
        <div style="text-align: center;"> 
            <h3>Videos da Semana: <?php $atrizweek = get_field('semana'); echo $atrizweek; ?></h3>

            <h4><?php 
                $atriz_id = get_field('atrizes');

                $atriz = get_post( $atriz_id[0]);

            echo "<a style="text-align: center;" href="#">{$atriz->post_title}</a>"; ?></h4>                    
        </div>
    </div>

    <div class="large-12 columns"><div class="pagination-semana">

        <div class="nav-previous alignleft"><?php next_posts_link( 'Semana Anterior' ); ?></div>
        <div class="nav-next alignright"><?php previous_posts_link( 'Próxima Semana' ); ?></div>

    </div></div>
    <div class="item large-4 medium-6 columns end <?php echo $myClass; ?>">

    </div><!--item large-4-->

    <?php endwhile; ?>


    <?php wp_reset_postdata(); ?>
</div><!--new-all-->

<!-- NEW MY CUSTOM-->
<div class="tabs-content" data-tabs-content="newVideos">
    <div class="tabs-panel is-active" id="new-all">
        <div class="row list-group">
            <?php
                $args2 = wp_parse_args($wp->matched_query);

                if ( !empty ( $args2['paged'] ) && 0 == $paged ) {
                    $wp_query->set('paged', $args2['paged']);
                    $paged = $args2['paged'];
                }                               
                $temp = $wp_query;
                $wp_query= null;

                $args2 = array(
                'post_type' => 'a-casa',
                'posts_per_page' => $betubeVideoCount,
                'paged' => $paged,
                'meta_key'      => 'semana',
                'meta_value'    => $atrizweek,
                'post_status' => 'publish',
                'orderby' => 'date',
                );
                $wp_query2 = new WP_Query($args2);    


                //$wp_query->query('post_type=post&posts_per_page=".$betubeVideoCount."&paged='.$paged);
                $current = -1;
                $current2 = 0;
                $post_id = $post->ID;

            ?>
            <?php while ($wp_query2->have_posts()) : $wp_query2->the_post(); $current++; $current2++; ?>
            <div class="item large-4 medium-6 columns end <?php echo $myClass; ?>">
                <div class="post thumb-border">
                    <div class="post-thumb">
                        <?php 
                            if( has_post_thumbnail()){
                                echo get_the_post_thumbnail();
                                }else{
                            ?>
                            <img src="<?php echo get_template_directory_uri() . '/assets/images/nothumb.png' ?>" alt="No Thumb"/>
                            <?php
                            }
                        ?>
                        <a href="<?php the_permalink(); ?>" class="hover-posts">
                            <span><i class="fa fa-play"></i><?php esc_html_e( 'Watch Video', 'betube' ); ?></span>
                        </a>
                    </div><!--post thumb-border-->
                </div><!--item large-4-->
                <?php endwhile;  ?>

                <div class="large-12 columns"><?php 
                    global $wp_rewrite;         
                    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

                    $classiera_pagination = array(
                    'base' => @add_query_arg('page','%#%'),
                    'format' => '',
                    'total' => $wp_query->max_num_pages,
                    'current' => $current,
                    'show_all' => false,
                    'type' => 'plain',
                    );

                    if( $wp_rewrite->using_permalinks() )
                    $classiera_pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg('s',get_pagenum_link(1) ) ) . 'page/%#%/', 'paged');

                    if( !empty($wp_query->query_vars['s']) )
                    $classiera_pagination['add_args'] = array('s'=>get_query_var('s'));

                    echo '<div class="pagination">' . paginate_links($classiera_pagination) . '</div>';         
                ?></div>
            </div><!--row list-group-->
            <?php   wp_reset_postdata(); ?>
        </div><!--new-all-->    

.

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

Как реализовать две независимые пагинации на одной странице в WordPress

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

Шаг 1: Определите глобальные переменные

Прежде всего, необходимо убедиться, что вы правильно управляете глобальными переменными paged, wp_query и wp. Эти переменные обеспечивают правильную работу пагинаций и позволяют избежать конфликтов между двумя запросами.

global $paged, $wp_query, $wp;

Шаг 2: Настройте первый запрос

Рассмотрим первый запрос, который будет выводить данные по определенному критерию. Важно создать отдельный новый объект класса WP_Query для первого запроса, чтобы он не конфликтовал со вторым. Используйте wp_reset_postdata() после завершения работы с первым запросом.

$args1 = array(
    'post_type' => 'a-casa',
    'posts_per_page' => 1,
    'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1,
    'meta_key' => 'semana',
    'post_status' => 'publish',
    'order' => 'ASC',
);

$wp_query1 = new WP_Query($args1);

Вывод данных из первого запроса:

while ($wp_query1->have_posts()) : $wp_query1->the_post();
    // Ваш код для вывода поста
endwhile;

// Сбрасываем данные запроса
wp_reset_postdata();

Шаг 3: Настройте вторую пагинацию

Для второго запроса выполните аналогичные действия. Создайте новый объект WP_Query, а затем используйте разные параметры для второго запроса. Убедитесь, что каждый запрос использует отдельную переменную paged, например, paged2.

$args2 = array(
    'post_type' => 'a-casa',
    'posts_per_page' => $betubeVideoCount,
    'paged' => (get_query_var('paged2')) ? get_query_var('paged2') : 1,
    'meta_key' => 'semana',
    'meta_value' => $atrizweek,
    'post_status' => 'publish',
    'orderby' => 'date',
);

$wp_query2 = new WP_Query($args2);

Вывод данных для второго запроса:

while ($wp_query2->have_posts()) : $wp_query2->the_post();
    // Ваш код для вывода поста
endwhile;

// Сбрасываем данные запроса
wp_reset_postdata();

Шаг 4: Создайте элементы навигации для каждой пагинации

После того как вы отобразили посты, не забудьте добавить элементы навигации для каждой из пагинаций. Используйте функцию paginate_links() для создания индивидуальных ссылок пагинации:

$big = 999999999; // уникальное число
$paged1 = (get_query_var('paged')) ? get_query_var('paged') : 1;
$pagination1 = paginate_links(array(
    'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
    'format' => '?paged=%#%',
    'current' => $paged1,
    'total' => $wp_query1->max_num_pages,
));

echo '<div class="pagination">' . $pagination1 . '</div>';

Аналогично для второго запроса:

$paged2 = (get_query_var('paged2')) ? get_query_var('paged2') : 1;
$pagination2 = paginate_links(array(
    'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
    'format' => '?paged2=%#%',
    'current' => $paged2,
    'total' => $wp_query2->max_num_pages,
));

echo '<div class="pagination">' . $pagination2 . '</div>';

Заключение

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

Убедитесь, что ваша структура URL и параметры запроса правильно настроены для каждого из запросов, чтобы избежать конфликтов. Happy coding!

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

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