我正在尝试在自定义字段的WP_Query中进行排序。自定义字段包含"E100"、"E500"和"E123b"等字符串。我想对这些值进行数字排序,即在自定义字段上进行排序,就好像字符不存在一样。
我的查询如下所示:
$subpages = new WP_Query(array(
"post_type" => "page",
"meta_key" => "[customFieldNameHere]",
"orderby" => "meta_value_num",
"order" => "ASC",
"posts_per_page" => 5000
));
但它不起作用。它做了某种排序,但它不是数字。是否可以从字段中去除所有字符/字母,然后对剩余值进行数字排序,或者是否有其他方法可以解决此问题?
不能像全是数字一样对带有字母的字符串进行排序。如果你尝试,你会得到一个字母数字排序 - 或多或少如果你正在按字母顺序排列某些东西,但它使数字看起来很奇怪,因为它匹配所有第一个字符,然后是第二个,依此类推,使数字看起来像:
- 1
- 10
- 101
- 阿拉伯数字
- 20
我不知道MySQL中内置的任何功能都可以做你想要的,WP_Query
也没有任何这样的功能。我拥有的最佳解决方案是将您的结果拉出未排序,稍后再对其进行排序。您希望拉取未排序的数据,以便数据库不会执行额外的工作。
$subpages = new WP_Query(array(
"post_type" => "page",
"meta_key" => "[customFieldNameHere]",
"posts_per_page" => 5000
));
$sorted = array();
foreach ($subpages as $s) {
$kname = preg_replace('/[^0-9]+/','',$s->customFieldNameHere]);
$sorted[$kname] = $s;
}
// you may need
// ksort($sorted);
var_dump($sorted);
一个问题是碰撞。如果你最终得到两个匹配的$knames
你会破坏数据,坦率地说,如果你有很多数据,这似乎很有可能。
我最终从所有字符串中删除了前导 E。并没有真正解决原始问题,字符串的数字排序,但至少它现在可以工作了。