Wp query posts between dates, but any year

Wp query posts between dates, but any year

我正在使用 ACF pro,需要查询 post 具有某些特殊 ACF 字段的特定值。 但我还需要获得任何年份的 posts,但日期应介于今天和距今天 + 30 天之间。我不能使用静态月份号,因为如果 post 在第 1 天制作,它就无法提前找到它。 这是我的初始查询,它不起作用。如果只获取特定的年份和月份,它就可以工作,但是从那个日期开始只获取 posts。

//$date_month_advance_month = ... month number of today + 30 days
//$date_month_advance_day= ... day number of today + 30 days
    // args
    $args = array(
        'post_type'     => 'my_post_type',
        'posts_per_page'=> -1,
        'meta_key'      => 'status',
        'meta_value'    => 'accepted',
        'date_query' => array(
         'compare'   => 'BETWEEN',
                 array(
                     'month' => $date_today_month,
                     'day'   => $date_today_day,
                 ),
                array(
                    'month' => $date_month_advance_month,
                    'day'   => $date_month_advance_day,
                ),
            ),
    );

您可以创建自定义 query。我很快做了一个,测试了日期,但没有测试自定义字段 status,因为我没有。将 my_post_type 替换为您的 post 类型名称。

global $wpdb;

$query = "
SELECT * FROM {$wpdb->posts} as p
LEFT JOIN {$wpdb->postmeta} as pm
ON pm.post_id = p.ID
WHERE p.post_type = 'my_post_type'
AND pm.meta_key = 'status'
AND pm.meta_value = 'accepted'
AND REPLACE(SUBSTRING(p.post_date, 6, 10), '-', '') BETWEEN %s AND %s
GROUP BY p.ID
";

// Should replace 0301 and 0331 by variables (date('mO1') and date('m31') for example), I let you handle this.
$prepared_query = $wpdb->prepare($query, array('0301', '0331'));

$result = $wpdb->get_results($prepared_query);

foreach($result as $r) {
  $cs_post = get_post($r->ID);

  echo '<p>';
  echo get_the_title($cs_post->ID) .'<br>';
  echo get_the_date('Y-m-d', $cs_post->ID) .'<br>';
  echo '</p>';

}

不确定这是否是正确的方法,但它确实有效。