WordPress函数query_posts用法,不显示(只显示)置顶文章

2017-11-1213:48:31 发表评论 986
摘要

置顶文章是wp2.7引进的一个功能,具体作用如名称“置顶”。query_posts函数在WordPress主题中是用于控制哪些文章可以出现在主循环中,由于设置方便,样式多样并且合乎很多人的偏好,所以用处比较大。

query_posts函数在WordPress主题中是用于控制哪些文章可以出现在主循环中,可能说主循环很多人都不懂,那么举个例子,首页、存档页的这些文章(包括分页中的)都是在主循环中的。在不使用query_posts函数控制的情况,首页、存档页等都是按照文章的发布时间列出你博客上所有已发布的文章,而如果你想定义哪些文章可以显示,哪些文章不显示,文章按照什么样的方法排序等,那么你就要用到query_posts函数了,本站首页的文章排序:随机阅读、评论最多和标题排序就是用query_posts函数来实现的。

WordPress

基本用法:

一、怎样让某分类的文章不显示/显示

如果你不想让某分类的文章出现在主循环中,那么你可以使用query_posts添加参数category__not_in即可:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
// 2, 6就是你不想显示的分类ID,多个用半角逗号隔开
'category__not_in'   => array(2, 6),
'paged' => $paged
);
query_posts($args);

如果只想让显示某个分类的文章,可以将category__not_in改成category__in。同理,如果不显示某标签下的文章,可以将category__not_in改成:tag__not_in,或者只想让显示某个标签下的文章,可以将category__not_in改成tag__in,后面跟着标签的ID即可。

二、如何对文章进行排序

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
// 以下代码中的title就是orderby的值,按标题排序
'orderby'   => title,
'paged' => $paged
);
query_posts($args);

根据orderby的值不同,可以让文章按照很多种方式进行排序,下面是列举几个常见的值及其对应的排序方式:title:按标题;date:按发布日期;modified:按修改时间;ID:按文章ID;rand:随机排序;comment_count:按评论数

三、只显示相应ID的文章

如我只想显示ID为2,4,6的文章,可以使用以下代码:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
// 以下代码中的2,4,6就是文章的ID
'post__in'   => array(2,4,6),
'paged' => $paged
);
query_posts($args);

如果不想显示2,4,6这几篇文章,可以将 post__in 改成 post__not_in 。另外如果只想显示置顶文章,那么可以将array(2,4,6)改成get_option('sticky_posts'),这段代码会自动给你填充所有置顶文章的ID。

四、让置顶文章不置顶

如果你不想让置顶文章显示在顶部,而是让它们安装正常的顺序排列,那么可以使用以下代码:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args=array(
'paged' => $paged,
'ignore_sticky_posts' => 1
);
query_posts($args);

置顶文章是wp2.7引进的一个功能,具体作用如名称“置顶”。由于设置方便,样式多样并且合乎很多人的偏好,所以用处比较大。昨天折腾的时候想添加一个功能:首页的顶部框框里滚动显示置顶文章,首页内容区隐藏置顶文章。解决办法可以用 is_sticky() 判断或者 query(...) 来输出。

但是在具体实施过程中遇到了三个问题:

  • 不显示置顶文章则每页文章有多有少,看着不爽。
  • 前一页、后一页功能失效。
  • archive等归档页面失效。

1、首先可以肯定,直接判定 !is_sticky() 就输出的办法是可行的。但是分页依旧按照原来的,比如第一页的9篇文章中有4篇置顶的,除去置顶文章,第一页就只显示4篇文章,对于边栏内容比较丰富的同学们,主要内容部分必然会空出一大片。

2、其次,用 query_posts() 可以吗?当然,这也是官方给出的解决方案。只需按需要在while(…)前加入

$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
'ignore_sticky_posts' => 1,//忽略sticky_posts,不置顶,但是输出置顶文章
'post__not_in' => $sticky,//排除置顶文章,不输出
'paged' => $paged
);
query_posts( $args );

这里遇到了一个问题,由于这个主题脱胎于twenty ten,所以文章列表显示用的是loop.php文件,稍微看看可以知道,所有需要列表文章的地方全是在这一个文件中实现的,所以在这里面改明显是不行 的,直接影响的是所有页面。所以最后的解决办法还是在index.php里面的 get_template_part( 'loop', 'index' ); 的前面加入上述的语句,后面记得 wp_reset_query(); 以防不测。

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: