按事件日期排序(如果存在)或发布日期(如果不存在)-如何根据元值或日期重新排序帖子

时间:2019-08-01 作者:jongoeson

我需要一种根据事件日期(如果存在)或发布日期(如果没有)对标签和类别档案中的帖子进行排序的方法。

我有一个用于事件和帖子的组合存档,但希望根据事件的event\\u date meta而不是发布日期来列出事件。

我知道我需要更新查询以添加“orderby”参数,但想不出构造查询参数以获得所需结果的最佳方法。

我的想法是,我需要做如下事情:

foreach($posts as $post) {

    $event_start = get_post_meta($object_id, \'event_start\',   TRUE);

    if($event_start) {

        $event_start = strtotime($event_start);
        $list_timestamp_map[$object_id] = $event_start;

        } else {

            $post_date = get_the_date(\'Y-m-d H:i:s\',$object_id);

            $post_date = strtotime($post_date);
            $list_timestamp_map[$object_id] = $post_date;

        }

    }

    arsort($list_timestamp_map);

}
基本上:

检查“event\\u start”(事件开始)字段是否有值如果有,获取/使用该日期如果没有,获取/使用发布日期根据该列表对帖子进行排序,但如何根据自定义字段数据和发布日期的组合查询/比较/排序现有存档?

我不能这样做:

function rtt_event_sorting( $query ) {

    if( $query->is_main_query() && ( is_category() || is_tag() && empty( $query->query_vars[\'suppress_filters\'] ) ) {

        $query->set(\'orderby\',\'meta_value\');
        $query->set(\'meta_key\',\'event_start\');
        $query->set(\'orderby\',\'DESC\');

        return $query;

    }

}

add_filter( \'pre_get_posts\', \'rtt_event_sorting\' );
因为如果我添加一个“meta\\u key”参数,它将根据该元是否存在返回帖子,而不是根据其值(如果存在)和发布日期(如果不存在)返回帖子。

我可能想得太多了,但这里最好的解决方案是什么?

1 个回复
SO网友:Antti Koskinen

基于

  1. Can I exclude a post by meta key using pre_get_posts function? //在pre\\u get\\u posts中设置metaQuery all posts where a meta key does not exist //存在(&E);格式不存在multiple orderby in pre_get_posts action //如何设置多个ordeby
您可以在pre_get_posts 滤器

//Get original meta query
$meta_query = $query->get(\'meta_query\');

//Add our meta query to the original meta queries
// Posts that have and don\'t have the meta value
$meta_query[] = array(
  \'relation\' => \'OR\',
  array(
   \'key\'     => \'event_start\',
   \'compare\' => \'NOT EXISTS\',
   \'value\'   => \'\'
  ),
  array(
   \'key\'     => \'event_start\',
   \'compare\' => \'EXISTS\'
  )
);
$query->set(\'meta_query\',$meta_query);

$query->set(\'orderby\', array(\'meta_value\' => \'DESC\', \'date\' => \'DESC\'));
很抱歉,我无法测试这个代码示例,因为我的任何WP沙盒中都没有类似的数据,而且我写这篇文章有点晚,所以我可能遗漏了一些东西,所以对此持保留态度。

相关推荐

使用jQuery点击项目以打开最相关的元素(弹出窗口

使用WP Job Manager插件的警报扩展。将显示用户创建的警报列表,其中包含每个警报的一些信息。我想在弹出窗口中显示信息,而不是在列表中。创建了一个按钮,单击该按钮可打开弹出窗口,其中包含与特定警报相关的信息。它通常可以工作,但问题是,无论我单击哪个按钮(对于警报1、警报2、警报3等),它都会打开警报1的弹出窗口。如何仅对相关项目应用效果?试着玩弄.closest() 但不起作用,或者我没有正确使用它。已经在谷歌上搜索了几个小时,试图找到一种为每个警报分配唯一ID的方法(我无法预先定义它们,因为每个