自定义字段的数字排序,包括字母

时间:2013-01-30 14:43:12

标签: php wordpress

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

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

2 个答案:

答案 0 :(得分: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,那么您将破坏数据,坦率地说,如果您拥有大量数据,这似乎很有可能。

答案 1 :(得分:0)

我最终删除了所有字符串中的前导E.通过对字符串进行数字排序,并没有真正解决原始问题,但至少它现在可以正常工作。