自定义帖子 wp_query 上的分页
Posted
技术标签:
【中文标题】自定义帖子 wp_query 上的分页【英文标题】:pagination on custom post wp_query 【发布时间】:2013-01-13 18:42:04 【问题描述】:<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$loop = new WP_Query(
array(
'post_type' => 'html5-blank',
'posts_per_page' => 5,
'paged'=>$paged
)
);
?>
<?php if ($loop->have_posts()): while ($loop->have_posts()) : $loop->the_post(); ?>
//Loop Code Here..
<?php wp_reset_query(); ?>
<nav>
<?php previous_posts_link( 'Newer posts »' ); ?>
<?php next_posts_link('Older »') ?>
</nav>
<?php endwhile; ?>
<?php else: ?>
当我输入结果时,下一页上的网址是:www.mywebsite.com/blog/page/2 is WORKING。 但我无法显示分页链接。
哪里出错了?
编辑:分页链接显示在page/2/
但不在主博客页面中。
为什么?
【问题讨论】:
【参考方案1】:我建议使用自定义帖子 wp_query 进行分页的 3 种方法。不幸的是,直到今天还没有很多关于这方面的好信息,或者至少在某些情况下还不清楚。希望这会有所帮助!
请注意,您确实也将 wp_reset_postdata() 放在了错误的位置,但还需要做更多工作才能使其正常工作。
选项 1 - 使用 max_num_pages 变量
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 1,
'paged' => $paged,
'post_type' => 'cpt_type'
);
$cpt_query = new WP_Query($args);
?>
<?php if ($cpt_query->have_posts()) : while ($cpt_query->have_posts()) : $cpt_query->the_post(); ?>
//Loop Code Here...
<?php endwhile; endif; ?>
<nav>
<ul>
<li><?php previous_posts_link( '« PREV', $cpt_query->max_num_pages) ?></li>
<li><?php next_posts_link( 'NEXT »', $cpt_query->max_num_pages) ?></li>
</ul>
</nav>
您将在上面看到,previous_posts_link
和 next_posts_link
的格式略有不同,它们现在访问 max_num_pages
变量。访问max_num_pages
时请务必使用您自己的查询变量名称。请注意,我使用 $cpt_query 因为这是我的查询示例的变量。
选项 2 - 暂时使用 $wp_query 变量进行循环查询
这是很多人推荐的,但要小心将 $wp_query 变量分配给临时变量并重新分配它,否则您会遇到各种麻烦。这就是为什么我推荐选项#1。如CSS Tricks 所述,您可以执行以下操作:
<?php
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query('showposts=6&post_type=news'.'&paged='.$paged);
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<!-- LOOP: Usual Post Template Stuff Here-->
<?php endwhile; ?>
<nav>
<?php previous_posts_link('« Newer') ?>
<?php next_posts_link('Older »') ?>
</nav>
<?php
$wp_query = null;
$wp_query = $temp; // Reset
?>
选项 3 - 使用 WP-pagenavi 插件
就像另一个选项一样,您可以做的是使用WP-pagenavi 插件,并按照选项#1 设置您的查询。但是,在安装插件后,对代码进行一次更改,删除元素中的所有内容并替换为此功能。所以你会结束:
<nav>
<?php wp_pagenavi( array( 'query' => $cpt_query ) ); ?>
</nav>
【讨论】:
【参考方案2】:我认为您将<?php wp_reset_query(); ?>
放在了错误的位置.. 它不应该是下一个还是分页代码之后?
类似的东西
<?php endwhile; ?>
<?php else: ?>
<?php wp_reset_query(); ?>
【讨论】:
对。我把它放在 div 导航之后。现在可以了。谢谢! 哇!这不正是我告诉你的有问题吗?【参考方案3】:@Trevor 非常充分地回答了这个问题,但我需要实现编号分页,还有更多的研究要做。我希望我的代码可以帮助其他人实现编号分页。
<div class="frontpage-posts">
<?php
if (get_query_var('paged'))
$paged = get_query_var('paged');
elseif (get_query_var('page'))
$paged = get_query_var('page');
else
$paged = 1;
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query('posts_per_page=12&paged=' . $paged);
if ($wp_query->have_posts()) :
while ($wp_query->have_posts()) : $wp_query->the_post();
echo the_title();
endwhile; ?>
<nav>
<?php
the_posts_pagination(array(
'mid_size' => 2,
'prev_text' => __('Back', 'textdomain'),
'next_text' => __('Onward', 'textdomain'),
));
?>
</nav>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_postdata();
endif;
?>
</div>
【讨论】:
【参考方案4】:$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'post_type' => 'wp-rest-api-log',
'posts_per_page' => 5,
'paged' => $paged,
'orderby' => 'date',
);
$loop = new WP_Query( $args );
if ($loop->have_posts()) :
while ($loop->have_posts()) : $loop->the_post();
echo the_title();
endwhile;
echo "<nav class=\"sw-pagination\">";
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $loop->max_num_pages
) );
echo "</nav>";
endif;
wp_reset_query();
【讨论】:
【参考方案5】:<?php
add_shortcode('show_all_news', 'show_all_news');
function show_all_news($atts)
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$limit = 4;
$offset = ( $limit * $paged ) - $limit;
$atts['pages'] = $paged;
$atts['post-type'] = 'your_custom_post_type';
$atts['orderby'] = 'date';
$atts['order'] = 'DESC';
$atts['offset'] = $offset;
$atts['posts_per_page'] = $limit;
$atts['caller_get_posts'] = 1;
$result = new WP_Query($atts);
echo '<div class="news-cont">';
if($result->have_posts())
while ($result->have_posts()) : $result->the_post();
echo '<div class="bg-white news-block">';
echo '<em class="date">'. get_the_date().'</em>' ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php
echo "<p>";
the_excerpt();
echo "</p>";
echo '</div>';
endwhile;
?>
<ul class="pagination" style="width:100%;">
<li id="previous-posts" style="float:left">
<?php previous_posts_link( '<< Vorige Pagina', $result->max_num_pages ); ?>
</li>
<li id="next-posts" style="float:right">
<?php next_posts_link( 'Volgende Pagina >>', $result->max_num_pages ); ?>
</li>
</ul>
<?php
echo '</div>';
wp_reset_query();
【讨论】:
suraj sing,您想通过更新添加一些您在答案中解决的细节吗? 这是一个工作代码只需更改帖子类型............添加您的自定义帖子类型并将此代码添加到 functions.php 和 do_shortcode('shortcodename ');在您需要分页的类别列表页面中......这将起作用 @surajsingh,在这种情况下,涉及短代码是不推荐或根本不需要的。此外,您没有提供任何有关解释您的解决方案的信息。谢谢。以上是关于自定义帖子 wp_query 上的分页的主要内容,如果未能解决你的问题,请参考以下文章
自定义wp_query上的Wordpress分页(next_posts_link)未显示