0

我正在尝试在自定义字段上的 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
));

但它不起作用。它做了某种排序,但不是数字。是否可以从字段中删除所有字符/字母,然后对剩余值进行数字排序,还是有其他方法可以解决这个问题?

4

2 回答 2

0

您不能对带有字母的字符串进行排序,就好像它都是数字一样。如果你尝试,你会得到一个字母数字排序——或多或少你会做什么,如果你按字母顺序排列某些东西,但它使数字看起来很奇怪,因为它匹配所有第一个字符,然后是第二个,依此类推,使数字看起来像:

  • 1
  • 10
  • 101
  • 2
  • 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,你会破坏数据,坦率地说,如果你有很多数据,这似乎很有可能。

于 2013-01-30T15:32:54.703 回答
0

我最终从所有字符串中删除了前导 E。对字符串进行数字排序并不能真正解决最初的问题,但至少现在可以了。

于 2013-01-31T08:48:33.833 回答