检查自定义字段是否存在

时间:2013-11-10 作者:Mister Melotte

我正在使用高级自定义字段插件,我想做一个查询来显示所有帖子,其中一个“日期”字段在今天之前,另一个自定义字段(报告)有值。

现在我有这个,但我总是得到所有过去的事情。

       \'post_type\' => \'activiteit\',
   \'meta_key\' => \'activiteit_datum\',
   \'post_status\' => \'publish\',
   \'orderby\' => \'meta_value\',
   \'order\' => \'DESC\',
   \'meta_query\' => array(
      \'relation\' => \'AND\',
      array( \'key\' => \'activiteit_verslag\',\'compare\'=>\'EXISTS\'),
      array( \'key\' => \'activiteit_datum\', \'compare\' => \'<\', \'value\' => $fullDate,\'type\' => \'DATE\')

   )
);

$pastActivities=query_posts($arg);

1 个回复
SO网友:s_ha_dum

问题似乎是,根据问题中的一串注释activiteit_verslag 即使值为空,也会为许多或所有帖子设置键/NULL. EXISTS 仅检查是否存在key. 不考虑该值,因此返回的值太多。

有几件事我可以帮你做。

首先是使用!= 而不是EXISTS.

array( 
  \'key\' => \'activiteit_verslag\',
  \'value\' => \'\',
  \'compare\' => \'!=\'
),
如果您的值始终设置为空字符串,并且如果key 为所有帖子设置。

WP_Query/WP_Meta_Query 无法像您需要检查键是否未设置或已设置但为空那样执行复杂的逻辑,尽管您可以编写过滤器使其工作。。。但不要这样做。随着逻辑变得更加复杂,生成的SQL将变得越来越低效。

正确的解决方案是备份和更改数据的保存方式。如果该值为空activiteit_verslag 钥匙,然后delete the key. 如果您这样做,那么您上面的查询应该可以工作(显然未经测试,但我非常确定),并且您可能拥有针对这种情况的最有效的查询。

我知道你正在使用高级自定义字段来完成你的工作,但@ialocin认为该插件可能有过滤器,可以让你改变它的行为。我不使用ACF(或许多其他插件,因为其他人不喜欢我,因此是错误的:),所以我不知道你能用它的钩子做什么,也不知道你不能用它的钩子做什么,但是核心钩子save_post 应该在紧要关头做。

概念验证:

add_action(
  \'save_post\',
  function($pid) {
    $empty = get_post_meta($pid,\'delete_me\',true);
    if (empty($empty)) {
      delete_post_meta($pid,\'delete_me\',\'\');
    }
  }
);

结束

相关推荐

检查自定义字段是否存在 - 小码农CODE - 行之有效找到问题解决它

检查自定义字段是否存在

时间:2013-11-10 作者:Mister Melotte

我正在使用高级自定义字段插件,我想做一个查询来显示所有帖子,其中一个“日期”字段在今天之前,另一个自定义字段(报告)有值。

现在我有这个,但我总是得到所有过去的事情。

       \'post_type\' => \'activiteit\',
   \'meta_key\' => \'activiteit_datum\',
   \'post_status\' => \'publish\',
   \'orderby\' => \'meta_value\',
   \'order\' => \'DESC\',
   \'meta_query\' => array(
      \'relation\' => \'AND\',
      array( \'key\' => \'activiteit_verslag\',\'compare\'=>\'EXISTS\'),
      array( \'key\' => \'activiteit_datum\', \'compare\' => \'<\', \'value\' => $fullDate,\'type\' => \'DATE\')

   )
);

$pastActivities=query_posts($arg);

1 个回复
SO网友:s_ha_dum

问题似乎是,根据问题中的一串注释activiteit_verslag 即使值为空,也会为许多或所有帖子设置键/NULL. EXISTS 仅检查是否存在key. 不考虑该值,因此返回的值太多。

有几件事我可以帮你做。

首先是使用!= 而不是EXISTS.

array( 
  \'key\' => \'activiteit_verslag\',
  \'value\' => \'\',
  \'compare\' => \'!=\'
),
如果您的值始终设置为空字符串,并且如果key 为所有帖子设置。

WP_Query/WP_Meta_Query 无法像您需要检查键是否未设置或已设置但为空那样执行复杂的逻辑,尽管您可以编写过滤器使其工作。。。但不要这样做。随着逻辑变得更加复杂,生成的SQL将变得越来越低效。

正确的解决方案是备份和更改数据的保存方式。如果该值为空activiteit_verslag 钥匙,然后delete the key. 如果您这样做,那么您上面的查询应该可以工作(显然未经测试,但我非常确定),并且您可能拥有针对这种情况的最有效的查询。

我知道你正在使用高级自定义字段来完成你的工作,但@ialocin认为该插件可能有过滤器,可以让你改变它的行为。我不使用ACF(或许多其他插件,因为其他人不喜欢我,因此是错误的:),所以我不知道你能用它的钩子做什么,也不知道你不能用它的钩子做什么,但是核心钩子save_post 应该在紧要关头做。

概念验证:

add_action(
  \'save_post\',
  function($pid) {
    $empty = get_post_meta($pid,\'delete_me\',true);
    if (empty($empty)) {
      delete_post_meta($pid,\'delete_me\',\'\');
    }
  }
);

相关推荐