Вопрос или проблема
Я пытаюсь разместить два запроса на одной странице с пагинацией. Но пагинация одного мешает другому. Как я могу сделать это с двумя независимыми пагинациями?
<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!