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,而不是整个对象。从而简化比较。
希望对您有所帮助!
我在 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,而不是整个对象。从而简化比较。
希望对您有所帮助!