【问题标题】:wordpress Wp_query and meta query issue with date field日期字段的wordpress Wp_query和元查询问题
【发布时间】:2019-08-22 12:15:36
【问题描述】:

我将项目作为帖子插入到我的 WordPress 数据库中。目前在我家,显示了最近 3 个发布的项目。现在我的目的是我想首先显示今天到期的项目,而不是最后发布的项目。

例如,今天有 2 个项目即将到期,而不是在主页上它将显示 2 个今天到期的项目和 1 个最后发布的项目。这意味着总共将显示 3 个项目。

请检查下面的 WP_query,它只返回最后发布的项目

$args = array('post_type' => 'ignition_product', 'posts_per_page' => $project_count, 'paged' => $paged);

$newargs = apply_filters('project_query', $args);
$wp_query = new WP_Query($newargs);

下面的查询我尝试使用元键和值但没有运气。 “ign_fund_end” 将日期存储为字符串,所以我认为这就是为什么不比较日期的原因。 我的最终目标是如上所述,我应该展示总共 3 个项目。首先应该是今天到期,然后是最后一次发布之后。

$args = array(
        'post_type' => 'ignition_product',
        'posts_per_page' => $project_count,
        'paged' => $paged,        
        'meta_query' => array(// WordPress has all the results, now, return only the events after today's date
            array(
                'key' => 'ign_fund_end', // Check the start date field
                'value' => date('m/d/Y'), // Set today's date (note the similar format)
                'compare' => '>=', // Return the ones greater than today's date
                'type' => 'DATE' // Let WordPress know we're working with date
            )
    ));

请查看下图以供参考。

感谢任何解决方案。

【问题讨论】:

  • 你能分享一个ign_fund_end 字段的示例值吗?您是否使用 acf 创建自定义字段?
  • @SaqibAmin 我添加了一张图片作为价值参考。请检查。谢谢
  • 感谢您发布屏幕截图。您需要将此字段的保存格式更改为Y-m-d 格式才能正常工作。
  • @SaqibAmin 在我们触发查询时是否无法将 str 更改为日期?
  • 这种转换是不可能的。您可以轻松更改元键的保存格式,能否提及您用于创建自定义字段的插件?

标签: php mysql wordpress meta-query


【解决方案1】:

由于您的自定义字段 ign_fund_end 不是 MySQL 日期兼容格式,因此这是您的 WP_Query 无法按预期方式工作的主要原因。我的建议是使用 save_post 在自定义字段中保存结束日期的时间戳,然后将 $args 更改为 WP_Query 以在该字段上工作。

这里是您问题的完整解决方案:

1:在自定义字段中保存时间戳

add_action( 'save_post', function( $post_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( $parent_id = wp_is_post_revision( $post_id ) ) {
        $post_id = $parent_id;
    }

    if( isset( $_POST['ign_fund_end'] ) && !empty($_POST['ign_fund_end']) ) {
        $end_date = $_POST['ign_fund_end'];
        $end_date = strtotime($end_date);
        update_post_meta( $post_id, '__end_date', $end_date );
    }
} );

2:修改$args

$args = array(
    'post_type' => 'ignition_product',
    'posts_per_page' => $project_count,
    'orderby'   => 'meta_value_num',
    'order'     => 'ASC',
    'meta_key'  => '__end_date',
    'paged' => $paged,        
    'meta_query' => array(// WordPress has all the results, now, return only the events after today's date
    array(
        'key' => '__end_date', // Check the start date field
        'value' => strtotime('today'), // Set today's timestamp
        'compare' => '>=', // Return the ones greater than today's date
        'type' => 'NUMERIC'
    )
));

【讨论】:

    【解决方案2】:

    您只需从数组参数中删除type

    $args = array(
            'post_type' => 'ignition_product',
            'posts_per_page' => $project_count,
            'paged' => $paged,        
            'meta_query' => array(// WordPress has all the results, now, return only the events after today's date
                array(
                    'key' => 'ign_fund_end', // Check the start date field
                    'value' => date('m/d/Y'), // Set today's date (note the similar format)
                    'compare' => '>=', // Return the ones greater than today's date
                    'type' => 'DATE' // Let WordPress know we're working with date
                )
        ));
    

    收件人:

    $args = array(
            'post_type' => 'ignition_product',
            'posts_per_page' => $project_count,
            'paged' => $paged,        
            'meta_query' => array(// WordPress has all the results, now, return only the events after today's date
                array(
                    'key' => 'ign_fund_end', // Check the start date field
                    'value' => date('m/d/Y'), // Set today's date (note the similar format)
                    'compare' => '>=', // Return the ones greater than today's date
                    //'type' => 'DATE' // Let WordPress know we're working with date
                )
        ));
    

    注意:原因是表中meta_value不是DATE类型。

    在 PHPMyAdmin 中,默认的日期类型是:

    2019-04-16
    

    【讨论】:

    • 是的,但是。我想比较两个日期,然后它会使用 >= 比较两个日期
    • 但是 meta_value 字段不是 DATE 类型,这就是它不起作用的原因
    • @CodeEmbassy,请参阅此解决方案。 wordpress.stackexchange.com/a/50187/137328
    猜你喜欢
    • 2018-08-06
    • 2022-07-06
    • 1970-01-01
    • 2019-02-02
    • 2018-02-10
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多