如何在wp-Query中比较不同的时间戳以获取事件自定义帖子类型?

时间:2012-02-16 作者:Jonas

我有一个带有自定义元数据库的自定义帖子类型(as seen on wptheming.com) 并且希望进行查询以显示即将发生的事件,例如在侧边栏中,过去的日期被忽略。

但我需要一个当前时间的值来和事件开始时间进行比较。

现在我从current_time(\'mysql\') 看起来是这样的:

2012-02-16 13:15:31

元的开始时间如下所示:

201108121100

如何使这两个日期具有可比性?我可以在查询中执行吗?或者是否有其他解决方案?

以下是我到目前为止的查询(值留空,时间戳回显):

<?php $args = array( 
    \'post_type\'     => \'event\',
    \'meta_key\'      => \'_start_eventtimestamp\',
    \'orderby\'       => \'meta_value_num\',
    \'meta_query\'    => array(
                         array(
                                \'key\'     => \'_start_eventtimestamp\',
                                \'value\'   => \'\',
                                \'compare\' => \'!=\',
                                \'type\'    => \'NUMERIC\'
                            )
                        ),
    \'order\' => \'ASC\',
    \'posts_per_page\' => 10,
    );

$events = new WP_Query( $args );

if ( $events->have_posts() ) :
echo \'<ul>\';
while ( $events->have_posts() ) : $events->the_post();
echo \'<li><a href="\' . get_permalink() . \'">\' . current_time(\'mysql\') . \'</a></li>\';
echo \'<li><a href="\' . get_permalink() . \'">\' . get_post_meta( $post->ID, \'_start_eventtimestamp\', true ) . \'</a></li>\';
endwhile;
echo \'</ul>\';

endif;
?>

下面是我函数中的代码。php。(它可以在archive-event.php中正常工作,但在其他任何地方都不行):

function ep_event_query( $query ) {

// http://codex.wordpress.org/Function_Reference/current_time
$current_time = current_time(\'mysql\');
list( $today_year, $today_month, $today_day, $hour, $minute, $second ) = split( \'([^0-9])\', $current_time );
$current_timestamp = $today_year . $today_month . $today_day . $hour . $minute;

global $wp_the_query;

if ( $wp_the_query === $query && !is_admin() && is_post_type_archive( \'event\' ) ) {
    $meta_query = array(
        array(
            \'key\' => \'_start_eventtimestamp\',
            \'value\' => $current_timestamp,
            \'compare\' => \'>\'
        )
    );
    $query->set( \'meta_query\', $meta_query );
    $query->set( \'orderby\', \'meta_value_num\' );
    $query->set( \'meta_key\', \'_start_eventtimestamp\' );
    $query->set( \'order\', \'ASC\' );
}
}

add\\u操作(“pre\\u get\\u posts”、“ep\\u event\\u query”);

我该怎么做?

2 个回复
SO网友:Matth_eu

看起来在post meta中存储了unix时间戳,因此您应该与unix时间戳进行比较,而不是与MySQL的时间戳进行比较。

要获取当前时间作为时间戳,应使用以下代码:

当前时间(\'时间戳\');

SO网友:krembo99

您可以按照Matth\\u eu的建议执行,也可以使用PHP函数date,如下所示:

$Now =  date("Ymdhi");
小心“h”参数-你需要看看你的META是如何获得时间的-领先的“0”,12/24小时等(从你的例子中不清楚)

有关此功能的更多信息,请参见此处:

http://php.net/manual/en/function.date.php

我附上了一个我不久前编写的工作函数,它与您需要的非常相似,它将日期(格式YYYY-MM-DD)的元数据与今天进行比较,并检索要在小部件中显示的“升级”事件。我希望它能帮助你理解它是如何工作的。

function dl_upccoming(){
$orig_post = $post;
global $post;
$todaysDate = date(\'Y-m-d\'); // set today\'s date to check against custom field
$today = date(\'d\');//testing
$post_no = 8;//how many we want
// query posts
$my_query = new WP_Query(\'posts_per_page=\'.$post_no.\'&meta_key=_sub_deadline&meta_compare=>=&meta_value=\' . $todaysDate . \'&orderby=meta_value&order=ASC\');
if( $my_query->have_posts() ) {
$pospstring = \'<div id="upcomming"><ul class="sidebar-widget sidelists">\';
while( $my_query->have_posts() ) {
$my_query->the_post();

$pospstring .= \'<li><a href="\' . the_permalink() . \'" rel="upcomming" title="Deadline :\' . get_post_meta($post->ID, \'_sub_deadline\', true) .\' | \' . the_title() . \' - ">\';
$pospstring .=  the_post_thumbnail(\'tooltip-50\');
$pospstring .= \'<span><\' .  the_title() .\'</span>\';
$pospstring .= \'<span>Deadline : \' .  get_post_meta($post->ID, \'_sub_deadline\', true) . \'</span></a></li>\';
}
}
$pospstring .=  \'</ul></div>\';

echo $poststring;
$post = $orig_post;
wp_reset_query();
}

结束

相关推荐

带有复选框的Metabox未更新

我试图用一个复选框设置一个meta\\u框,一切正常,但是如果我取消选中并保存帖子,它会再次标记为选中,我一直在查看,但我找不到我的错误。看看我的代码。function am_checkbox_option() { global $post; $custom = get_post_custom($post->ID); $front_event = $custom[\"front_event\"][0]; wp_nonce_field(_