如何按元值对“PRE_GET_POSTS”中的排序进行二次排序或将单个日期和时间组合成时间戳

时间:2013-12-09 作者:David Labbe

这在某种程度上是我问过的另一个问题的持续问题。这是原始帖子。pre_get_post filter returns results when there should not be

从那时起,我添加了orderby子句。。。。

  if ($post_ids) {
                $wp_query->set(\'post__in\', $post_ids);
                $wp_query->set(\'meta_key\', \'_start_date\');
                $wp_query->set(\'orderby\',\'meta_value\');
                $wp_query->set(\'order\', \'ASC\');
            }else{
                $wp_query->set(\'post__in\', array(0));

            }
            return $wp_query;
问题是我需要按另一个meta\\u键的值排序。meta\\u键是\'_start_time\'.

$post\\u id是从另一个(复杂的)查询编译而来的,然后我需要根据其他因素进一步编译它。我最终得到的是我需要的帖子ID,现在我只需要按我需要的顺序显示它们。我收到订单了_start_date 工作,但如果有一个以上的职位在该日期,那么他们没有在我需要的正确时间订购。所以我还需要根据\'_start_time\' meta\\u键值,但似乎无法找到解决方案。感谢您提供的任何帮助。

2 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

我为您在上一条评论中提出的问题概述了一个解决方案,因为这不适合评论格式。

Code:

function date_time_to_timestamp_meta( $post_id ) {

    // meta fields are saved in DATETIME, e.g. »2013-12-09 22:32:12«
    // here is only the date part relevant
    $datetime_date = get_post_meta( $post_id, \'_start_date\', true );
    // here is only the time part relevant
    $datetime_time = get_post_meta( $post_id, \'_start_time\', true );

    // we\'re extracting the relevant part with date()
    $extracted_date = date(\'Y-m-d\', $datetime_date);
    $extracted_time = date(\'G:i:s\', $datetime_time);

    // we\'re bringing back together the extracted relevant date and time
    $datetime_date_and_time = $extracted_date . \' \' . $extracted_time;

    // we\'re constructing the TIMESTAMP with strtotime()
    $date_time_timestamp = strtotime( $datetime_date_and_time );

    // we\'re updating/creating our TIMESTAMP meta field
    update_post_meta( $post_id, \'_date_time_timestamp\', $date_time_timestamp ); 

}   
add_action( \'save_post\', \'date_time_to_timestamp_meta\', 111 );
注:示例性和未经测试

因为这只是上述概念的证明,所以可以肯定的是,函数缺少了一些您通常想要的东西,比如对post类型和/或元字段的条件检查。如果您不确定如何使用php函数,请阅读相应的php函数。我认为这是一个高度优先的问题,不知道您所说的API调用是如何以及何时发生的,简而言之,您当然希望确保这是在两个单独的日期和时间字段提供了您所需的实际信息之后发生的。

SO网友:kaiser

我不完全确定,但要么是空格分隔的,要么,/逗号分隔。这两种选择之一应该可行。

结束