我正在尝试在自定义字段的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
));
但它不起作用。它做了某种排序,但它不是数字。是否可以从字段中删除所有字符/字母,然后对剩余值进行数字排序,还是有其他方法可以解决这个问题?
答案 0 :(得分:0)
您不能将带字母的字符串排序,就好像它都是数字一样。如果你尝试将获得一个字母数字排序 - 如果你按字母顺序排列的东西或多或少你会做什么,但它会使数字看起来很奇怪,因为它匹配所有的第一个字符,然后是第二个字符,依此类推使数字看起来像:
我不知道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.通过对字符串进行数字排序,并没有真正解决原始问题,但至少它现在可以正常工作。