如何使用WP_QUERY搜索存储在自定义字段中的数组?

时间:2013-09-26 作者:Dave Navarro

我有一个名为“on air”的自定义帖子类型,其中包括一个名为“daysonair”的自定义字段。此表单中有一周中每天的复选框。

添加/更新帖子时,选中的项目将作为数组存储在自定义字段中。

我不知道如何将该自定义字段添加到我的WP\\u Query()搜索中:

array( \'key\' => \'daysonair\',
       \'value\' => \'Thursday\',
       \'compare\' => \'IN\' )
我尝试过多种类型的比较,但都没有成功。

数据库中的数据为:

a:5:{s:6:"Monday";s:6:"Monday";s:7:"Tuesday";s:7:"Tuesday";s:9:"Wednesday";s:9:"Wednesday";s:8:"Thursday";s:8:"Thursday";s:6:"Friday";s:6:"Friday";}
检查了所有工作日。我只是想看看星期四是否在阵列中。

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

在序列化数组中搜索既困难又低效,即速度慢。以下纯SQL将完成此操作:

SELECT *
FROM `wp_postmeta`
WHERE `meta_key` LIKE \'daysonair\'
AND `meta_value` LIKE \'%thursday%\'
LIMIT 0 , 100
像这样的东西应该WP_Query 做类似的事情:

$args = array(
  \'post_type\' => \'post\',
  \'meta_query\' => array(
    array(
      \'key\' => \'daysonair\',
      \'value\' => \'thursday\',
      \'compare\' => \'LIKE\',
    )
  )
);
$q = new WP_Query($args);
var_dump($q);
但是LIKE 使用通配符的查询--%-- 速度非常慢。查询必须检查表中的每一行是否匹配。

此外,这很容易出错,因为任何“星期四”的出现都会匹配,例如附件图像中的某个内容alt 文本

问题是序列化字符串是PHP构造。MySQL除了像对待任何其他字符串一样对待它之外,不知道如何处理它。

唯一真正好的修复方法,我不知道在您的情况下是否可能,是更改数据在数据库中的存储方式。如果需要搜索数据,则不应将其存储为序列化字符串。每段数据应存储为一个独立的键/值对。

SO网友:MathSmath

一个自定义的查询将在某种程度上起作用,但我个人不相信它除了最简单的实现(正如s\\u ha\\u dum在评论中所说的那样)。

更好的解决方案是create a custom taxonomy “一周中的几天”,然后运行a tax query 基于此。这正是分类系统设计的目的。

$args = array(
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'days_of_week\',
            \'field\' => \'slug\',
            \'terms\' => \'wednesday\'
        )
    )
);
$query = new WP_Query( $args );

结束

相关推荐

Meta value Array

我希望有人能帮助我。我创建了一个自定义元框并尝试存储一个数组,但在使用update_post_meta, 它似乎没有将其存储为数组。我通过api获取信息,从文本区域到update_post_meta.我试过了serialize, unserialize, maybe_serialize, maybe_unserialize 等等,这是我的代码。$movieCast(array) array ( 0 => array ( \'actor\