查询当前和将来的事件,按开始日期排序

时间:2014-01-23 作者:tosca

使用自定义帖子类型UI扩展,我创建了一个“事件”自定义帖子类型,这些字段是使用自定义字段(使用扩展高级自定义字段创建)填充的,例如“date处女秀”和“date fin”。

在专门针对这种帖子类型的归档页面上,我试图显示接下来的10个(当前或未来)事件,按开始日期按时间顺序排列。

排序部分本身似乎正常;但是,当我在日期上添加测试时,它不再起作用了,不管怎样,这些测试也不起作用。

这是我的代码:

        $current_date = date(\'ymd\');
        $my_query = new WP_Query( array ( 
        \'post_type\'         => \'mna_event\',
        \'posts_per_page\'    => 10,
        \'orderby\'           => \'meta_value_num\',
        \'meta_key\'          => \'date_debut\',
        \'order\'             => \'ASC\',
        \'meta_query\'        => array (
            \'relation\'      => \'OR\',
            array (
                \'key\'       => \'date_debut\',
                \'value\'     => $current_date,
                \'compare\'   => \'>=\'
                ),
            array (
                \'key\'       => \'date_fin\',
                \'value\'     => $current_date,
                \'compare\'   => \'>=\'
                )
            )
        )
    );
如能就此事提出建议,将不胜感激。谢谢

1 个回复
最合适的回答,由SO网友:Parham 整理而成

这是因为OR 上的关系meta_query 以及WordPress生成实际查询字符串的方式。你需要省去meta_keyorderby 从查询参数和挂钩到posts_clauses 过滤器以修改whereorderby 查询片段:

function wpse_130954_orderby_fix($pieces){
    global $wpdb;
    $pieces[\'where\']  .= " AND $wpdb->postmeta.meta_key = \'date_debut\'";
    $pieces[\'orderby\']  = "$wpdb->postmeta.meta_value ASC";
    return $pieces;
}
在设置WP\\U查询对象之前添加筛选器,然后确保在运行查询后将其删除,以免影响其他查询:

add_filter( \'posts_clauses\', \'wpse_130954_orderby_fix\', 20, 1 );
$current_date = date_i18n(\'Y-m-d\');
$my_query = new WP_Query( array ( 
    \'post_type\'         => \'mna_event\',
    \'posts_per_page\'    => 10,
    \'meta_query\'        => array (
        \'relation\'      => \'OR\',
        array(
            \'key\'       => \'date_debut\',
            \'value\'     => $current_date,
            \'compare\'   => \'>=\',
            \'type\'      => \'DATE\'
            ),
        array(
            \'key\'       => \'date_fin\',
            \'value\'     => $current_date,
            \'compare\'   => \'>=\',
            \'type\'   => \'DATE\'
            )
        )
    )
);

$result = $my_query->posts;

remove_filter( \'posts_clauses\', \'wpse_130954_orderby_fix\', 20 );
UPDATE: 使用yy-mm-dd ACF设置中日期字段的格式。(yy-mm-dd 在JS/ACF中==Y-m-d 在PHP/MySQL-datetime格式中)我已经更新了上面的代码。(已更新$current_date 格式和添加\'type\' => \'DATE\' 在里面meta_query)

结束
查询当前和将来的事件,按开始日期排序 - 小码农CODE - 行之有效找到问题解决它

查询当前和将来的事件,按开始日期排序

时间:2014-01-23 作者:tosca

使用自定义帖子类型UI扩展,我创建了一个“事件”自定义帖子类型,这些字段是使用自定义字段(使用扩展高级自定义字段创建)填充的,例如“date处女秀”和“date fin”。

在专门针对这种帖子类型的归档页面上,我试图显示接下来的10个(当前或未来)事件,按开始日期按时间顺序排列。

排序部分本身似乎正常;但是,当我在日期上添加测试时,它不再起作用了,不管怎样,这些测试也不起作用。

这是我的代码:

        $current_date = date(\'ymd\');
        $my_query = new WP_Query( array ( 
        \'post_type\'         => \'mna_event\',
        \'posts_per_page\'    => 10,
        \'orderby\'           => \'meta_value_num\',
        \'meta_key\'          => \'date_debut\',
        \'order\'             => \'ASC\',
        \'meta_query\'        => array (
            \'relation\'      => \'OR\',
            array (
                \'key\'       => \'date_debut\',
                \'value\'     => $current_date,
                \'compare\'   => \'>=\'
                ),
            array (
                \'key\'       => \'date_fin\',
                \'value\'     => $current_date,
                \'compare\'   => \'>=\'
                )
            )
        )
    );
如能就此事提出建议,将不胜感激。谢谢

1 个回复
最合适的回答,由SO网友:Parham 整理而成

这是因为OR 上的关系meta_query 以及WordPress生成实际查询字符串的方式。你需要省去meta_keyorderby 从查询参数和挂钩到posts_clauses 过滤器以修改whereorderby 查询片段:

function wpse_130954_orderby_fix($pieces){
    global $wpdb;
    $pieces[\'where\']  .= " AND $wpdb->postmeta.meta_key = \'date_debut\'";
    $pieces[\'orderby\']  = "$wpdb->postmeta.meta_value ASC";
    return $pieces;
}
在设置WP\\U查询对象之前添加筛选器,然后确保在运行查询后将其删除,以免影响其他查询:

add_filter( \'posts_clauses\', \'wpse_130954_orderby_fix\', 20, 1 );
$current_date = date_i18n(\'Y-m-d\');
$my_query = new WP_Query( array ( 
    \'post_type\'         => \'mna_event\',
    \'posts_per_page\'    => 10,
    \'meta_query\'        => array (
        \'relation\'      => \'OR\',
        array(
            \'key\'       => \'date_debut\',
            \'value\'     => $current_date,
            \'compare\'   => \'>=\',
            \'type\'      => \'DATE\'
            ),
        array(
            \'key\'       => \'date_fin\',
            \'value\'     => $current_date,
            \'compare\'   => \'>=\',
            \'type\'   => \'DATE\'
            )
        )
    )
);

$result = $my_query->posts;

remove_filter( \'posts_clauses\', \'wpse_130954_orderby_fix\', 20 );
UPDATE: 使用yy-mm-dd ACF设置中日期字段的格式。(yy-mm-dd 在JS/ACF中==Y-m-d 在PHP/MySQL-datetime格式中)我已经更新了上面的代码。(已更新$current_date 格式和添加\'type\' => \'DATE\' 在里面meta_query)

相关推荐

如何通过jQuery Datepicker搜索帖子?

我正在WordPress网站上工作,我有自己的搜索筛选页面,在那里我添加了jquery日期选择器,现在我想按日期选择器搜索帖子?Html Codescript> $(function() { jQuery( \"#datepicker-13\" ).datepicker({ dateFormat : \"yy-mm-dd\" }); $(\"#datepicker-13\").datepicker().datepick