Wordpress:meta_query 带有自定义字段(帖子按子字段获取)(WP_QUERY)

Wordpress: meta_query with custom fields ( posts get by sub-field ) (WP_QUERY)

我在 WP 中创建了一个名称为 'add_info' (type=Repeater) 的自定义字段 该字段有一个名为 comments (name=ai_comment, type=text)

的子字段

我如何才能只获得带有评论的帖子!= NULL / EMPTY?

$args = array(
            'post_type'         => 'cpt_articles', 
            'meta_query'        => array(
                                        array(
                                            'key'       => 'add_info_%_ai_comment', 
                                            'value'     => '""',
                                            'compare'   => '!='
                                        )
                                   ),
            'orderby'           => 'meta_value',
            'order'             => 'DESC',
            'posts_per_page'    => 10,
        );

我在这里找到的有点奇怪的解决方案(additional_tests_%_acomment):http://www.advancedcustomfields.com/resources/how-to-query-posts-filtered-by-custom-field-values/#example-5

但不起作用...显示为空

这里是转储..

string(431) "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND wp_posts.post_type = 'cpt_articles' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND ( ( wp_postmeta.meta_key = 'add_info_%_ai_comment' AND CAST(wp_postmeta.meta_value AS CHAR) != '\"\"' ) ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 10"

试试这个,我认为它应该有效:

$sql = "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID"
    . " FROM wp_posts"
    . " INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )"
    . " WHERE 1=1"
    . " AND wp_posts.post_type = 'cpt_articles'"
    . " AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')"
    . " AND ( ( wp_postmeta.meta_key LIKE 'add_info_%_ai_comment' AND wp_postmeta.meta_value IS NOT NULL AND wp_postmeta.meta_value != '')"
    . " GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 10";

你没有应用那个过滤器,教程里有什么。所以你的 wp_postmeta.meta_key = 不会被 wp_postmeta.meta_key LIKE 取代,通配符也不起作用。其次,检查我如何使用 NOT NULL 和字符串比较。

您不需要将您的字段转换为字符串,因为它已经是一个 LONGTEXT 字段。直接在 MySql 中尝试,并在评论中告诉我结果。 (当你想直接在mysql中使用它时,首先在PHP中回显它,这是我回答中的PHP字符串。

在我使用的 wordpress 版本 (4.9.4) 中,ACF 中的子字段在字段之间以“0”保存。我首先认为“%”也会捕捉到“0”,但通过测试我发现它(在我的例子中)没有。

所以在我的例子中是:

$args = array(
                        'post_type'     => 'trainingen',
                        'order'         => 'ASC',
                        'meta_query'    => array(
                                                'key' => 'data_en_tijden_0_locatie',
                                                'compare' => '=',
                                                'value' => '"'.get_the_ID().'"'
                                                )

如果这不起作用,您还可以使用自定义 SQL 查询,例如:

SELECT post_id FROM `wp_postmeta` p INNER JOIN wp_posts w on w.ID=p.meta_value WHERE meta_key="data_en_tijden_0_locatie" and w.ID="'.get_the_ID().'"

注意:我使用的是 ACF 关系字段,而不是 post_object 字段。该字段可以配置为 return post_id,而不是整个对象。从而简化比较。

希望对您有所帮助!