如何使orderby‘meta_value_num’成为可选的?

时间:2014-06-06 作者:Mayeenul Islam

$args = array(
          \'cat\' => 5,
          \'posts_per_page\' => 8,
          \'meta_key\' => \'custom_sort_order\',
          \'order\' => \'ASC\',
          \'orderby\' => \'meta_value_num\'
        );

$custom_query = new WP_Query( $args );
使用上面的代码,我可以按照自定义字段的值顺序(升序)对帖子进行排序。但是,如果我忘记为帖子分配自定义字段键和值,查询将找不到整个帖子,因为custom_sort_order meta\\u键-因为它不存在于某个帖子中。

但我需要把\'meta_key\' => \'custom_sort_order\' 因为法典上说:

\'meta_value_num\' - 按数值元值排序(2.8版提供)。还请注意\'meta_key=keyname\' must 也将出现在查询中。

是否有一种方法,我可以绕过它,并设置查询的默认排序顺序,但可以使用custom_sort_order meta\\u键是否具有升序数字?所以,即使我忘了提到custom_sort_order post\\u meta,将正常查询帖子。

在@HeatenJesus的回答和@engelen的评论之后,我们似乎在艰难地处理这个话题。我们可以考虑一个过滤器,通过它我们可以使用自定义的自定义排序顺序meta\\u键修改自定义的WP\\u Query()?

假设我们的WP\\u查询参数为:

 $args = array(
          \'cat\' => 5,
          \'posts_per_page\' => 8,
          \'meta_key\' => \'other_post_meta\',
          \'meta_value\' => \'yes\',
          \'order\' => \'ASC\'
        );

$custom_query = new WP_Query( $args );
我们排除了\'orderby\' => \'meta_value_num\' 并使用其他meta\\u键和相应的值过滤我们的查询。但是custom_sort_order meta\\u键不存在。我们将实现某种过滤器,并使用自定义值从外部修改订单custom_sort_order.

我们能那样想吗?

事实上,我们可以提出这样一个问题吗;Post Type Re-Order插件是如何做到这一点的"E;

1 个回复
SO网友:heathenJesus

简而言之:你不能。无论如何,不是那样的。

但是,您可以从查询中获取所有结果,而不管是否存在该自定义字段,并且完全不排序,然后使用PHP函数对其排序uksorthttp://us1.php.net/manual/en/function.uksort.php

类似于:

$args = array(
      \'cat\' => 5,
      \'numberposts\' => 8
    );
$posts = get_posts($args);
uksort($posts,"sort_posts_by_custom_order");

function sort_posts_by_custom_order($a,$b)
{
  $custom_a = get_post_meta($a->ID,\'custom_sort_order\',true);
  $custom_b = get_post_meta($b->ID,\'custom_sort_order\',true);
  $custom_a = isset($custom_a) ? $custom_a : -1;
  $custom_b = isset($custom_b) ? $custom_b : -1;
  if ($custom_a == $custom_b) { return 0; }
  return ($custom_a < $custom_b) ? -1 : 1;      
}
肯定比打一个DB电话要贵得多,但这是为不一致的数据付出的代价。

结束

相关推荐

Sorting past events by month

我有一个网站,列出了即将发生的事件和过去发生的事件。在我的类别中,过去的事件。php模板,这是我如何以降序(从最新到最旧)显示过去事件的方式: <?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; $args = array( \'posts_per_page\' => 1