比较3个自定义域并按最早的时间排序

时间:2014-02-07 作者:Mia

我正在建立一个电影档案馆。对于我正在填写3个国家/地区发行日期的每部电影,它们都存储为自定义字段(通过Pods添加)

现在,当我列出电影时,我想构建一个数组并循环每个帖子,检查字段是否有值,然后比较这些值并按第一个日期(最早或最晚的日期)排序。如果所有字段都没有值,则应使用过账日期进行排序。我已经在按一个自定义字段对某些类别及其子类别的帖子进行排序,如下所示:

function orderby_additionaldate($query) {
    if (! is_admin() && $query->is_main_query() && is_category( array( 2,57,530 ) ) || cat_is_ancestor_of(2, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(57, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(530, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() ) {
        if ( $query->query_vars ) {
            $query->set( \'order\', \'DESC\' );
            $query->set( \'meta_key\', \'additional_date\' );
            $query->set( \'orderby\', \'meta_value\' );
        }
    }
}
add_action( \'pre_get_posts\', \'orderby_additionaldate\' );
这其中缺少两件事:

这不是比较3个元键值(release_f, release_ukrelease_us), 并且它不会检查其中一个是否为空,而是使用发布日期(它只是将空的值设置为1970年1月1日)我想为

if (is_post_type_archive(\'project\') )
然后它应该检查3个meta\\u键release_f, release_ukrelease_us 对于值,如果有,请选择最早的日期;如果没有值,请选择帖子的日期,然后orderby 此数组的结果。这可能吗?

1 个回复
SO网友:s_ha_dum

虽然您描述的查询在SQL中并非不可能,但它不会非常有效,因为查询必须计算表中与这些键匹配的每一行,然后根据计算结果进行排序。

正如@Shazzad所建议的那样,您最好保存第四个值并对其进行排序。比如:

    function gen_sort_meta_wpse_133851($pid) {
      var_dump($pid);
      $release[] = get_post_meta($pid,\'release_f\',true);
      $release[] = get_post_meta($pid,\'release_uk\',true);
      $release[] = get_post_meta($pid,\'release_us\',true);
      $sort = max($release);
      $release_sort = get_post_meta($pid,\'_release_sort\',true);
      update_post_meta($pid,\'_release_sort\',$sort,$release_sort);
    }
    add_action(\'save_post\',\'gen_sort_meta_wpse_133851\');
然后,您应该能够使用以下内容进行排序:

function orderby_additionaldate($query) {
  if (! is_admin() 
    && $query->is_main_query() 
    && is_category( array( 2,57,530 ) ) 
    || cat_is_ancestor_of(2, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
    || cat_is_ancestor_of(57, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
    || cat_is_ancestor_of(530, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
  ) {
    if ( $query->query_vars ) {
        $query->set( \'order\', \'DESC\' );
        $query->set( \'meta_key\', \'_release_sort\' );
        $query->set( \'orderby\', \'meta_value\' );
    }
  }
}
add_action( \'pre_get_posts\', \'orderby_additionaldate\' );
我不知道这种逻辑是否正确。一长串未细化的布尔条件是获得意外行为的好方法。

结束

相关推荐

post ordering question

我有一个自定义类型的职位,我需要使它以不同的方式订购。不是按日期、id、名称。有没有办法把订单号和清单按编号排列?因为我们有几个新职位应该放在第二,第三,。。。等等,但我不认为这很容易做到。所以我在想,如果有任何地方可以放置订购编号,按编号订购将是最好的。有没有其他的插件?

比较3个自定义域并按最早的时间排序 - 小码农CODE - 行之有效找到问题解决它

比较3个自定义域并按最早的时间排序

时间:2014-02-07 作者:Mia

我正在建立一个电影档案馆。对于我正在填写3个国家/地区发行日期的每部电影,它们都存储为自定义字段(通过Pods添加)

现在,当我列出电影时,我想构建一个数组并循环每个帖子,检查字段是否有值,然后比较这些值并按第一个日期(最早或最晚的日期)排序。如果所有字段都没有值,则应使用过账日期进行排序。我已经在按一个自定义字段对某些类别及其子类别的帖子进行排序,如下所示:

function orderby_additionaldate($query) {
    if (! is_admin() && $query->is_main_query() && is_category( array( 2,57,530 ) ) || cat_is_ancestor_of(2, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(57, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(530, get_query_var(\'cat\') ) && $query->is_main_query() && ! is_admin() ) {
        if ( $query->query_vars ) {
            $query->set( \'order\', \'DESC\' );
            $query->set( \'meta_key\', \'additional_date\' );
            $query->set( \'orderby\', \'meta_value\' );
        }
    }
}
add_action( \'pre_get_posts\', \'orderby_additionaldate\' );
这其中缺少两件事:

这不是比较3个元键值(release_f, release_ukrelease_us), 并且它不会检查其中一个是否为空,而是使用发布日期(它只是将空的值设置为1970年1月1日)我想为

if (is_post_type_archive(\'project\') )
然后它应该检查3个meta\\u键release_f, release_ukrelease_us 对于值,如果有,请选择最早的日期;如果没有值,请选择帖子的日期,然后orderby 此数组的结果。这可能吗?

1 个回复
SO网友:s_ha_dum

虽然您描述的查询在SQL中并非不可能,但它不会非常有效,因为查询必须计算表中与这些键匹配的每一行,然后根据计算结果进行排序。

正如@Shazzad所建议的那样,您最好保存第四个值并对其进行排序。比如:

    function gen_sort_meta_wpse_133851($pid) {
      var_dump($pid);
      $release[] = get_post_meta($pid,\'release_f\',true);
      $release[] = get_post_meta($pid,\'release_uk\',true);
      $release[] = get_post_meta($pid,\'release_us\',true);
      $sort = max($release);
      $release_sort = get_post_meta($pid,\'_release_sort\',true);
      update_post_meta($pid,\'_release_sort\',$sort,$release_sort);
    }
    add_action(\'save_post\',\'gen_sort_meta_wpse_133851\');
然后,您应该能够使用以下内容进行排序:

function orderby_additionaldate($query) {
  if (! is_admin() 
    && $query->is_main_query() 
    && is_category( array( 2,57,530 ) ) 
    || cat_is_ancestor_of(2, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
    || cat_is_ancestor_of(57, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
    || cat_is_ancestor_of(530, get_query_var(\'cat\') ) 
    && $query->is_main_query() 
    && ! is_admin() 
  ) {
    if ( $query->query_vars ) {
        $query->set( \'order\', \'DESC\' );
        $query->set( \'meta_key\', \'_release_sort\' );
        $query->set( \'orderby\', \'meta_value\' );
    }
  }
}
add_action( \'pre_get_posts\', \'orderby_additionaldate\' );
我不知道这种逻辑是否正确。一长串未细化的布尔条件是获得意外行为的好方法。

相关推荐

Get_Terms()Order by Term_Meta

我正在做一个get_terms() 我试图按自定义术语元排序的查询。自定义术语元键是\'order\' 它是一个数值(介于1和10之间)。我尝试了以下方法,但顺序似乎没有遵循元值-任何指针都是值得赞赏的。$type_terms = get_terms( \'type\', array( \'hide_empty\' => false, array( \'key\' => \'order\', ), \'or