博客 / WordPress 教程

在WordPress中通过自定义字段来控制排序

通过ACF做了一个item_order作为排序值控制页面输出的顺序,如果这个值没有设置的时候,post可以正常输出,按默认时间排到后面,有排序值的就按排序值处理。

需求说明

1、通过ACF新增了字段item_order 作为排序值输入;
2、当有设置了排序值,则按排序值输出;
3、如果没设置排序值,则按默认时间输出:
4、优先输出有排序值的Post,没有的这靠后站。

<?php
$current_category = get_queried_object(); // 获取当前分类对象
$category_name = $current_category->name; // 获取当前分类名称

$args = array(
    'post_type' => array('product', 'service'),
    'category_name' => $current_category->slug, // 当前分类的别名
    'posts_per_page' => -1, // 每页显示所有文章
    'paged'  => get_query_var('paged') ? get_query_var('paged') : 1,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'item_order',
            'compare' => 'EXISTS' // 找到有item_order的文章
        ),
        array(
            'key' => 'item_order',
            'compare' => 'NOT EXISTS' // 找到没有item_order的文章
        )
    ),
    'orderby' => array(
        'meta_value_num' => 'ASC', // 按照item_order值从小到大排序
        'date' => 'DESC' // 如果没有item_order,则按时间排序
    ),
);

$tit_query = new WP_Query($args);
?>

代码说明:

  1. meta_query部分:
    • EXISTS 用于筛选有 item_order 的文章。
    • NOT EXISTS 用于处理没有设置 item_order 的文章。
  2. orderby部分:
    • meta_value_num 确保按 item_order 的数值排序。
    • 当没有 item_order 时,使用 date 进行默认的时间排序。

这样,没有设置 item_order 的文章将会排在有 item_order 的文章之后,并按时间排序。

评论留言

您的邮箱地址不会被公开。 必填项已用 * 标注