使用具有要比较日期的ACF字段的SELECT查询自定义发布类型

时间:2019-06-20 作者:phptherightway

所以我有一个名为ads的CPT,它的ACF字段为ad\\u start\\u date和ad\\u end\\u date。我正在尝试使用SELECT语句编写自定义WP查询,而不是使用WP\\U查询,因为我返回了一个ajax请求,所以我需要准确地选择要发送的字段。

因此,对于一个测试,我确实使用了WP\\u查询方法,它工作得非常好。但是为了获得acf字段,或者说是特征图像,这个WP查询方法需要在一个模板php文件上。我需要一个自定义SELECT语句,以便在一个json响应中选择需要发送到JavaScript端的字段
仅供参考,此函数从以前的AJAX请求响应中检索ID数组,因此您可以看到“post\\u in”参数。但同样,下面的函数工作得很好,但无法使用它,因为来自WP\\u查询的响应是有限的,需要WP循环或post ID才能传递到ACF

get_field(\'ad_start_date\', post->ID) 
功能。我需要这个查询来获取这个查询调用上的所有内容,并作为json响应发回。

function get_ads() {
    $id = $_POST[\'ids\'];
    $integerIDs = json_decode( $id, true);
    $todays_date = date(\'Ymd\', strtotime("now"));
    $newargs = array(
        \'numberposts\'   => -1,
        \'post_type\'     => \'ads\',
        \'post__in\'      => $integerIDs,
        \'post_status\'   => \'publish\',
        \'meta_query\'    => array(
            array(
                \'key\'       => \'ad_start_date\',
                \'compare\'   => \'<\',
                \'type\'      => \'numeric\',
                \'value\'     => $todays_date,
                ),
            array(
                \'key\'       => \'ad_end_date\',
                \'value\'     => $todays_date,
                \'compare\'   => \'>\',
                \'type\'      => \'numeric\',
            ),
        ), 
    );
    $the_final_query = new WP_Query( $newargs );
    echo json_encode($the_final_query);
    wp_die();
}
下面是我在mysql workbench中使用自定义mysql语句获取此数据的尝试。但我没有取得任何成功。有人知道我的问题在哪里吗?

SELECT * FROM wp_posts
INNER JOIN wp_postmeta ON wp_postmeta.post_id = wp_posts.ID
AND( wp_postmeta.meta_key = \'ad_start_date\' AND wp_postmeta.meta_value < 
20190620)  
AND ( wp_postmeta.meta_key = \'ad_end_date\' AND wp_postmeta.meta_value > 
20190620)
WHERE wp_posts.post_type = \'ads\'
AND wp_posts.post_status = \'publish\'
第二次尝试强制转换为数字,因为meta\\u值是longtext数据类型

SELECT * FROM wp_posts
INNER JOIN wp_postmeta ON wp_postmeta.post_id = wp_posts.ID
AND( wp_postmeta.meta_key = \'ad_start_date\' AND (CAST(wp_postmeta.meta_value 
AS 
UNSIGNED) < 20190620) ) 
AND ( wp_postmeta.meta_key = \'ad_end_date\' AND (CAST(wp_postmeta.meta_value 
AS 
UNSIGNED) > 20190620) )
WHERE wp_posts.post_type = \'ads\'
AND wp_posts.post_status = \'publish\'
任何帮助都将不胜感激!

1 个回复
SO网友:Hannes

您可以使用

$the_final_query->request
这将为您提供定制SQL所需的起点

相关推荐

在WP_Query上设置SQL_BIG_SELECTS和MAX_JOIN_SIZE

尽管使用;$mysqli = new mysqli(\"localhost\", \"user\", \"pass\", \"db\"); $mysqli->query(\'SET SQL_BIG_SELECTS = 1\'); $mysqli->query(\'SET MAX_JOIN_SIZE = 999\'); $the_query = new WP_Query( $args ); 我正在接收;[2018年4月23日14:37:31 UTC