2017-04-01 166 views
0

我试图查询ACF字段“show_on_frontpage”值等于“是”(请参阅​​下面屏幕截图中此字段的定义)的帖子。作为ACF docs规定,这里是我的代码:高级自定义字段:无法通过自定义字段查询帖子

$args = array(
    'posts_per_page' => -1, 
    'meta_key' => 'show_on_frontpage', 
    'meta_value' => 'yes' 
); 
$my_posts = new WP_Query($args); 
if ($my_posts->have_posts()) { 
    while ($my_posts->have_posts()) : $my_posts->the_post(); 
    if (get_field('show_on_frontpage')) the_field('show_on_frontpage'); ?> 
    endwhile; 
} 

这将返回/无显示。如果我简单地使用$args = array('posts_per_page' => -1);,那么我会得到我所有的帖子,并且对于那些具有“yes”作为其“show_on_frontpage”字段的值的用户,会显示“yes”。

我的代码有什么问题?

enter image description here

+1

您的报价代码块2号线缺少一个逗号 - 这只是一个转录错误? – DavidCara

+0

更正,谢谢。这不是问题虽然;) – drake035

回答

1

根据这个问题上的ACF论坛/回答:

https://support.advancedcustomfields.com/forums/topic/using-checkbox-fields-in-custom-queries/

这将是最好的复选框字段切换到真/假领域,而不是,因为它似乎是你的复选框组领域唯一包含一个选项。

复选框以序列化数据的形式存储,您将无法使用WP_Query通过复选框字段进行过滤。

如果您使用true/false字段,那么您可以使用WP_Query, true/false字段的值为0(零)为false,1为true。

所以,如果你打开你的复选框字段到真/假现场,你可以按如下方式重写代码:

$args = array(
    'posts_per_page' => -1, 
    'meta_key' => 'show_on_frontpage', 
    'meta_value' => 1 /* or true */ 
); 
$my_posts = new WP_Query($args); 
if ($my_posts->have_posts()) { 
    while ($my_posts->have_posts()) : $my_posts->the_post(); 
     /* My content for each post with the checkbox checked goes here */ 
    endwhile; 
} 
+0

谢谢@Joe和很好的发现。它现在工作!只有一件事:在更改字段类型后,该字段设置为“true”的帖子未被查询拾取。我必须将它们设置为“false”,更新,然后再次将它们设置为“true”,以便可以选择它们。任何想法为什么?看起来像改变一个领域的类型有点混乱 – drake035

+0

我不确定是否有一个程序化的方式来解决这个问题。应用内容的某些字段类型在字段类型更改为其他字段时做得不好。有时候内容会翻译过来,其他时候你会遇到这样的情况。希望你没有太多页面来更新这个方法。 – Joe

0

如果使用较新的meta_query => array()语法这应该工作:

$args = array(
     'posts_per_page' => -1, 
     'meta_query' => array(
      array(
       'key' => 'show_on_frontpage', 
       'value' => 'yes', 
       'compare' => 'LIKE', 
      ) 
     ), 
    ); 

    $my_posts = new WP_Query($args); 

    if ($my_posts->have_posts()) { 

     while ($my_posts->have_posts()) : $my_posts->the_post(); 

      echo get_the_title(); 
      // Post stuff 

     endwhile; 

     /* Restore original Post Data */ 
     wp_reset_postdata(); 

} 

请注意,您需要给文章ID ACF的辅助功能get_field() & the_field() while循环中。

https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

在更广泛的注意,这条质疑使用post_meta键用于此目的的智慧,是值得一读:https://tomjn.com/2016/12/05/post-meta-abuse/。该文章建议使用自定义分类来实现你所需要的 - 更好的性能。

+0

我试图使用的代码的全部重点是,我不选择所有帖子,只是为了测试哪些符合标准(浪费资源)。您的$ args会返回所有帖子。 – drake035

+0

你错了,它只返回'show_on_frontpage'元键被设置为'yes'的帖子。我可以解开你的困惑,所以我将修改答案以删除ACF条件检查。 – DavidCara

+0

对不起!原始代码有一个错误(我遗漏了嵌套数组,并使用了错误的比较运算符)。我已经编辑了答案,现在应该可以工作。 – DavidCara

相关问题