使用帖子 meta_key 进行自然排序

Avatar of Chris Coyier
Chris Coyier

@@ -2033,6 +2033,7 @@

      if ( !empty($q['meta_key']) ) {
              $allowed_keys[] = $q['meta_key'];
              $allowed_keys[] = 'meta_value';
+             $allowed_keys[] = 'meta_value_num';
      }
      $q['orderby'] = urldecode($q['orderby']);
      $q['orderby'] = addslashes_gpc($q['orderby']);

@@ -2056,6 +2057,9 @@

      case 'meta_value':
              $orderby = "$wpdb->postmeta.meta_value";
              break;
+     case 'meta_value_num':
+             $orderby = "$wpdb->postmeta.meta_value+0";
+             break;
      default:
              $orderby = "$wpdb->posts.post_" . $orderby;
}

这是一个对核心文件/wp-includes/query.php的直接编辑。请注意,上面代码中的加号表示要添加的新行

作者笔记

一位客户希望我设置一个名为“指南排名”的自定义字段,允许他们为他们发布的酒吧列表分配 1-20 号。

运行帖子查询后,我发现 meta_value 被视为字符串,因此排序顺序混乱。

例如:1、10、2、3css-tricks.comC 7、8、9

要让 WordPress/MySQL 使用“自然排序顺序”,您只需将 +0 应用于字段名称,它将被视为数字(例如:meta_value+0)。

为了不中断现有行为,我只添加了新的类型“meta_value_num”。

我的查询行现在看起来像这样

$guide_posts = new WP_Query("cat=12&meta_key=guide_rank&orderby=meta_value_num&order=ASC&showposts=10");

返回结果为:1、2、3、4、5、6、7、8、9、10

这将在 WordPress 主干中包含,因此希望一旦应用后,就不再需要手动编辑文件。