【发布时间】:2020-05-13 23:22:49
【问题描述】:
我有一个名为 custom_order 的自定义字段(高级自定义字段),我希望 WordPress 按字段值对所有帖子进行排序。
custom_order 字段的值可以用 3 种方式写入:
-
仅限数字(
3、400、6424) -
数字,然后是字符串(
3A、3B、5000A) -
数字,然后是字符串,然后是数字(
3A1、3A2、401AZ1、9000A3、9000A1)
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