含有某个自定义字段的文章
我们常见的WordPress站点文章排序,通常情况下是按发布时间的升序或降序方式排列,这种排序方式几乎可以满足大多数站点的需求了,但是有些另类的站点可能会有一些另类的需求:我想手动修改文章的排列方式,可以随意更改文章的排列位置。其实WordPress的query_posts就可以轻松解决这个问题,不过你得自己动手改一些代码。
1、打开WordPress当前主题要修改的php文件,搜索代码:while (have_posts())将其替换成:
/**
* 名称:WordPress手动修改文章排列顺序
*/
$args = array(
'meta_key' => 'sort',
'orderby' => 'meta_value_num', // 须 WordPress 2.8 及以上版本
'order' => DESC
);
$arms = array_merge($args, $wp_query->query);
query_posts($arms);
while (have_posts())
接着搜索:endwhile;将其改成:endwhile;wp_reset_query();
2、给之前发表的所有文章添加自定义字段(或者称作自定义栏目,在文章编辑页底部可以看到),名称为 sort ,值填数字。这样在首页,文章的排列顺序就按照sort字段的值,从大到小排列了。通过修改sort字段的值,可以达到自定义文章排列顺序的目的。
3、需要注意的是,通过以上修改后,你必须给所有文章添加自定义字段sort,否则没有添加sort字段的文章将无法在首页显示。这也许就是手动排序需要付出的代价吧,要不然何谓手动?
4、如果你同时想手动修改标签页、分类页等存档页面的文章排列顺序,同样可以按照第一步介绍的方法来操作,修改主题目录下的archive.php等。
其实这种方式你可以看成怎样只显示我推荐的文章,那么含有这个自定义字段的文章就是推荐文章。
访客自行选择文章排序方式
其实实现过程也比较简单,一个是构造链接,另外一个是使用query_posts来改变一下主循环就可以了。
构造链接
链接主要用于传递GET参数,让PHP程序知道你到底想怎么排序。在主题的index.php中你需要的位置插入以下代码,用于输出排序按钮的HTML,这个排序按钮的样式,你再自己写写css咯。需要注意的是以下代码会自动获取当前用户已选择的排序方式,并给这个排序按钮的 li 添加了class=”current”:
<h4>文章排序</h4>
<ul>
<li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='rand') ) echo 'class="current"'; ?> href="<?php echo get_option('home'); ?>/?order=rand" rel="nofollow">随机阅读</a></li>
<li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='commented') ) echo 'class="current"'; ?> href="<?php echo get_option('home'); ?>/?order=commented" rel="nofollow">评论最多</a></li>
<li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='alpha') ) echo 'class="current"'; ?> href="<?php echo get_option('home'); ?>/?order=alpha" rel="nofollow">标题排序</a></li>
</ul>
改变主循环首先你得先在主题的index.php中找到以下语句:if (have_posts())然后在这句之前添加以下代码:
if ( isset($_GET['order']) )
{
switch ($_GET['order'])
{
case 'rand' : $orderby = 'rand'; break;
case 'commented' : $orderby = 'comment_count'; break;
case 'alpha' : $orderby = 'title'; break;
default : $orderby = 'title';
}
global $wp_query;
$args= array('orderby' => $orderby, 'order' => 'DESC');
$arms = array_merge($args, $wp_query->query);
query_posts($arms);
}
if (have_posts())
好了,就这么简单,复制粘贴,轻轻松松实现排序效果。

