自定义字段(包括字母)上的数字排序


Numerical sort on custom field which includes letters

我正在尝试在自定义字段的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。并没有真正解决原始问题,字符串的数字排序,但至少它现在可以工作了。