WordPress手动修改文章排列顺序

日期: 标签:WordPress教程 101 条留言
如需帮忙改代码,或者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
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者,主业是淘宝店主,卖些工艺品,感兴趣可以到我的淘宝店看看(旺旺不提供技术咨询):西西弗sisyphe

101 条留言

点此留言
1 2 153
  1. 网赚沙龙

    抱歉,在文章编辑页底部没有看到,名称为sort是什么问题呢?

    • Ludou

      @网赚沙龙 文章编辑页顶部,显示选项,勾选 自定义栏目

      • wangzhuansl

        @Ludou 这个方法不也可以修改分类栏的文章排列顺序了吗?那在分类栏下置顶不也可以在这个基础上面开发了吗?

  2. Blade

    您好,我想问下如果自定义字段sort的值写成一样的了,是否可以让一样sort值的文章按发布时间显示呢,其余的就按sort值大小排列,我自己试了下如果sort值都一样了,它会随机显示了,麻烦您了,谢谢!

  3. 常熟人家

    大神求指教:

    这样做后,文章置顶也会出现在首页中,那不要他置顶,只出现自定义的文章,ignore_sticky_posts函数怎么加?

    • Ludou

      @常熟人家 11行改成:
      'order' => DESC,
      'ignore_sticky_posts' => 1

      • 常熟人家

        @Ludou 大神谢谢,

  4. SJY

    meta_value_num 按照数字大小排列
    但如果有特殊需求,需要按照 大写数字大小排列该怎么办,如自定义字段的值为 一,二,三……

  5. 北极鱼

    把这篇文章得正文和所有的评论都看了几篇,还是没有找到能解决我的需求的代码,我的需要时是首页输出8篇文章,第1-4篇按日期排列,第5-8篇按浏览数量排列,不知道博主可有办法解决??

    • Ludou

      @北极鱼 你用wp_query吧,首页放两个即可,第一个输出4篇文章,按日期排;第二个输出4篇文章,按浏览数排。

  6. Leon

    原来是'orderby' => 'meta_value_num',终于明白我之前错在哪里了~~

  7. 爱兜

    'orderby' => 'meta_value_num',太感谢了,需要的就是这句,折腾了很久,
    谢谢。

  8. 灿烂星空

    $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); ?>

  9. 博弈

    我在用您的方法修改代码后自定义排序是实现了,但我发现又有个比较严重的问题,分类及标签页当用sort值来自定义排序并且已设置默认每篇文章的sort值为1时,有分页状态下,翻到第二页或往后任意页,每页的数据均重复,但排序顺序都不一样,应该是因为sort值相同导致随机排序了。如果是用在首页,在大部分sort值为默认值1的应用场景下也是随机排序,但sort值为1以上的是能置顶排序的。请问如何实现按自定义sort值从大到小排序的同时,将sort设为默认值1的文章仍然按文章ID从大到小排序以解决这个排序混乱的问题?请指教,万分感激!

  10. shenweibin

    有一点不同之处在于,我主题下面的index.php没有while (have_posts())和endwhile;不过找到了一个loop-index.php和content-page.php有这两个函数,于是照章修改,可是却不起作用,只改了'sort'为我的自定义字段,不知道是哪里的问题了

    • 小白

      @shenweibin 我目前跟你遇到相同的问题,你找到答案了吗?求分享!非常感谢!

      • shenweibin

        @小白 抱歉,我也没有实现这个功能,博主的新代码会导致出错。

        • 露兜

          @shenweibin 出现什么错误?有错误提示吗?

          • shenweibin

            @露兜 所有文章打不开,提示链接错误

          • 露兜

            @shenweibin 我这边测试是没有问题的。
            另外,新代码添加了新的条件判断,可能更好点,你可以试试。

  11. Kevin

    想把一些新发的Post放在前边,正好参考。

  12. 小白

    你好,我的代码中没有找到 while (have_posts())或者 if (have_posts())该怎么做啊

    • 露兜

      @小白 文中代码已经修改,请参考最新代码。

  13. 冷然

    请教下,有没有办法让没有添加字段的就还是按原来发布顺序排列,添加了sort字段的就按sort字段排序?

  14. LEO

    我一直在找一个功能,就是分类的 文章 排序!
    类似分类产品页那样 筛选的!
    最新
    最多点击
    ——–
    自定义字段筛选

  15. 幻城博客

    作为露兜博客资深读者,感谢博主给出的代码。
    —————————————————————-
    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值从小到大排序呢,值越小越排在前面,如何修改。

  16. YESV

    能否在首页,最新文章哪里改一下,按照字段custom field 值筛选?

  17. 心宇

    你好。分类的文章显示, 通过sort数值大小,已经正常排列了,但是首页还不行。请问应该怎么办?

    • 露兜

      @心宇 看你首页的文章是不是通过主循环来获取文章列表的:
      if (have_posts()) : while (have_posts())

      如果是WP_Query获取的就不行

    • 露兜

      @心宇 另外,你可以将上面代码中的
      && $query->is_main_query()
      删除试试

      • 心宇

        @露兜 尝试了,还是不行。主题有四个不同的首页,有点复杂。

  18. 花卉说

    刚看到一个神奇的网站,才来查询有关排序问题。我现在严重怀疑那个网站是手动排序的,甚至ID都是手动指定的。要不然不可能有那么完整的排序

1 2

发表留言