【问题标题】:WordPress posts orderby meta value with strings and numbersWordPress 使用字符串和数字发布 orderby 元值
【发布时间】:2020-05-13 23:22:49
【问题描述】:

我有一个名为 custom_order 的自定义字段(高级自定义字段),我希望 WordPress 按字段值对所有帖子进行排序。

custom_order 字段的值可以用 3 种方式写入:

  • 仅限数字34006424
  • 数字,然后是字符串3A3B5000A
  • 数字,然后是字符串,然后是数字3A13A2401AZ19000A39000A1

custom_order 值的更多示例:

想要的订单:

1, 2, 3, 3A, 3B, 3C, 3CA, 4, 400, 401, 401A, 401AZ, 401Z, 9000, 9000A, 9000A1, 9000A3

条件:

  • 3 应该在 200 之前(数字顺序)
  • 3 应该在 3A 之前(数字和字符串)
  • 3A 应该在 3A1 之前(数字、字符串、数字)

我的尝试:

我当前的代码是按数字排序的(条件 1),但忽略了条件 2 和条件 3。

因此,我的代码给了我这个命令:

1, 2, 3A, 3, 3C, 3B, 4

我正在使用的代码(functions.php):

add_action('pre_get_posts', function ($q) {
    if (
        !is_admin() // Target only front end queries
        && $q->is_main_query() // Target the main query only
        && ($q->is_search() || $q->is_post_type_archive('data-base'))
    ) {
        $q->set('meta_key', 'custom_order');
        $q->set('order',    'DESC');
        $q->set('orderby',  'meta_value_num');
    }
});

【问题讨论】:

  • 如果您首先想象如何编写一个遵循这些规则的 MySQL 查询,很快就会发现,虽然有可能,但很难做到,而且不太可能是WordPress 已内置在其中。如果您可以为查询对象提供排序功能会很酷,但文档中没有类似的功能。我认为您必须在查询运行后对结果进行排序。
  • 嘿,杰瑞,谢谢,我相信通过 MySQL 可以做到这一点,但我在这方面的知识有限。我找到了一个内置于 WordPress 中的简洁解决方案,请参阅下面的答案。
  • 我认为在涉及分页的搜索结果中会出现问题(因为它会强制获取所有帖子,这是一项繁重的任务),但是,这是一个非常酷的钩子!感谢分享

标签: php mysql sql wordpress sql-order-by


【解决方案1】:

我找到了一个巧妙的解决方案!

$q->set(
    'meta_query',
    array(
        'relation' => 'OR', //**** Use AND or OR as per your required Where Clause
        'clause1' => array(
            'key'     => 'custom_order',
            'compare' => 'EXISTS',
        ),
    )
);
$q->set(
    'orderby',
    array(
        'meta_value_num'  => 'ASC', // this reorders by numbers
        'meta_value'  => 'ASC', // this reorders by strings after sorting numbers
    )
);

【讨论】:

  • 我会测试你现在所说的并告诉你我的结果,等等
  • 你总是可以用足够数量的前导零填充第二个数字,所以它是 1A022 和 1A003
  • 你是对的。这不是最好的解决方案,但是您建议使用填充第二个数字的方法可以解决问题!太棒了。
  • 或者您可以将 custom_order 字段拆分为三个,并按顺序排列。
  • 我之前实际上已经尝试过,但遇到了问题,它按字符串而不是数字对字段进行排序,导致“8”出现在“41”之后。这是我的帖子:stackoverflow.com/questions/61708882/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2015-04-06
相关资源
最近更新 更多