WordPress手动修改文章排列顺序
日期:
标签:WordPress教程
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务: 点此联系我
文章目录
如果你想让访客自行选择文章排序方式,可以参考:WordPress让访客选择文章的排序方式。
我们常见的WordPress站点文章排序,通常情况下是按发布时间的升序或降序方式排列,这种排序方式几乎可以满足大多数站点的需求了,但是有些另类的站点可能会有一些另类的需求:我想手动修改文章的排列方式,可以随意更改文章的排列位置。其实WordPress的pre_get_posts就可以轻松解决这个问题,不过你得自己动手改一些代码。
修改方法:
1、打开WordPress当前主题目录,打开functions.php,添加以下PHP代码:
/**
* 名称:WordPress手动修改文章排列顺序
* 作者:露兜
* 博客:https://www.ludou.org/
* 最后修改:2015年10月21日
*/
add_action('pre_get_posts', 'ludou_orderby');
function ludou_orderby( $query ) {
if ( (is_home() || is_archive()) && $query->is_main_query() ) {
$query->set( 'meta_key', 'sort' );
$query->set( 'orderby', array('meta_value_num' => 'DESC', 'date' => 'DESC') );
}
return $query;
}
2、给之前发表的所有文章添加自定义字段(或者称作自定义栏目,在文章编辑页底部可以看到),名称为 sort ,值填数字。这样在首页,文章的排列顺序就按照sort字段的值,从大到小排列了。通过修改sort字段的值,可以达到自定义文章排列顺序的目的。
3、需要注意的是,通过以上修改后,你必须给所有文章添加自定义字段sort,否则没有添加sort字段的文章将无法在首页显示。这也许就是手动排序需要付出的代价吧,要不然何谓手动?
注意:以上修改将影响主页、分类页、标签页、日期页和作者页面等。
-- 完 --
本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-customize-posts-order.html
抱歉,在文章编辑页底部没有看到,名称为sort是什么问题呢?
@网赚沙龙 文章编辑页顶部,显示选项,勾选 自定义栏目
@Ludou 这个方法不也可以修改分类栏的文章排列顺序了吗?那在分类栏下置顶不也可以在这个基础上面开发了吗?
您好,我想问下如果自定义字段sort的值写成一样的了,是否可以让一样sort值的文章按发布时间显示呢,其余的就按sort值大小排列,我自己试了下如果sort值都一样了,它会随机显示了,麻烦您了,谢谢!
@Blade WordPress没法实现
大神求指教:
这样做后,文章置顶也会出现在首页中,那不要他置顶,只出现自定义的文章,ignore_sticky_posts函数怎么加?
@常熟人家 11行改成:
'order' => DESC,
'ignore_sticky_posts' => 1
@Ludou 大神谢谢,
meta_value_num 按照数字大小排列
但如果有特殊需求,需要按照 大写数字大小排列该怎么办,如自定义字段的值为 一,二,三……
@SJY 不支持中文
把这篇文章得正文和所有的评论都看了几篇,还是没有找到能解决我的需求的代码,我的需要时是首页输出8篇文章,第1-4篇按日期排列,第5-8篇按浏览数量排列,不知道博主可有办法解决??
@北极鱼 你用wp_query吧,首页放两个即可,第一个输出4篇文章,按日期排;第二个输出4篇文章,按浏览数排。
原来是'orderby' => 'meta_value_num',终于明白我之前错在哪里了~~
'orderby' => 'meta_value_num',太感谢了,需要的就是这句,折腾了很久,
谢谢。
$posts = array(
'post__not_in' => array(363,373,407,379,377,375,383,381,3105,3081),
'order' => ASC,
'showposts'=>$nmnber
);
$arms = array_merge($posts, $wp_query->query);
query_posts($arms);
嘿嘿,搞定了,我这个网站终于搞定了,不过这段代码用在我另外一个网站却有点奇葩,在分类列表那里还有1个没效果(意思是有9个被我排除了,还有1个没效果),然后我再进入子分类就没有效果?呵呵。。有点奇葩,又得慢慢想下咋回事(下面是我的代码- -~)
$cat=get_category_by_slug('company-case'); //获取分类别名为 wordpress 的分类数据
?>
<?php if( $posts ) : ?>
<?php foreach( $posts as $post ) : setup_postdata( $post); ?>
我在用您的方法修改代码后自定义排序是实现了,但我发现又有个比较严重的问题,分类及标签页当用sort值来自定义排序并且已设置默认每篇文章的sort值为1时,有分页状态下,翻到第二页或往后任意页,每页的数据均重复,但排序顺序都不一样,应该是因为sort值相同导致随机排序了。如果是用在首页,在大部分sort值为默认值1的应用场景下也是随机排序,但sort值为1以上的是能置顶排序的。请问如何实现按自定义sort值从大到小排序的同时,将sort设为默认值1的文章仍然按文章ID从大到小排序以解决这个排序混乱的问题?请指教,万分感激!
@博弈 文中代码已修改
有一点不同之处在于,我主题下面的index.php没有while (have_posts())和endwhile;不过找到了一个loop-index.php和content-page.php有这两个函数,于是照章修改,可是却不起作用,只改了'sort'为我的自定义字段,不知道是哪里的问题了
@shenweibin 我目前跟你遇到相同的问题,你找到答案了吗?求分享!非常感谢!
@小白 抱歉,我也没有实现这个功能,博主的新代码会导致出错。
@shenweibin 出现什么错误?有错误提示吗?
@露兜 所有文章打不开,提示链接错误
@shenweibin 我这边测试是没有问题的。
另外,新代码添加了新的条件判断,可能更好点,你可以试试。
想把一些新发的Post放在前边,正好参考。
你好,我的代码中没有找到 while (have_posts())或者 if (have_posts())该怎么做啊
@小白 文中代码已经修改,请参考最新代码。
请教下,有没有办法让没有添加字段的就还是按原来发布顺序排列,添加了sort字段的就按sort字段排序?
我一直在找一个功能,就是分类的 文章 排序!
类似分类产品页那样 筛选的!
最新
最多点击
——–
自定义字段筛选
作为露兜博客资深读者,感谢博主给出的代码。
—————————————————————-
add_action('pre_get_posts', 'ludou_orderby');
function ludou_orderby( $query ) {
if ( (is_home() || is_archive()) && $query->is_main_query() ) {
$query->set( 'meta_key', 'sort' );
$query->set( 'orderby', array('meta_value_num' => 'DESC', 'date' => 'DESC') );
}
return $query;
}
上面的代码是“文章的排列顺序就按照sort字段的值,从大到小排列了”
—————————————————————-
若按sort值从小到大排序呢,值越小越排在前面,如何修改。
@幻城博客 DESC改成ASC
能否在首页,最新文章哪里改一下,按照字段custom field 值筛选?
你好。分类的文章显示, 通过sort数值大小,已经正常排列了,但是首页还不行。请问应该怎么办?
@心宇 看你首页的文章是不是通过主循环来获取文章列表的:
if (have_posts()) : while (have_posts())
如果是WP_Query获取的就不行
@心宇 另外,你可以将上面代码中的
&& $query->is_main_query()
删除试试
@露兜 尝试了,还是不行。主题有四个不同的首页,有点复杂。
刚看到一个神奇的网站,才来查询有关排序问题。我现在严重怀疑那个网站是手动排序的,甚至ID都是手动指定的。要不然不可能有那么完整的排序