wordpress - 根据序列化的元值获取帖子
问题描述
我有一系列帖子,并且都有一个值为“所有者”的 meta_key 和一个带有序列化数据的 meta_value,例如“a:3:{i:0;s:3:”325”;i:1;s:2 :"41";i:2;s:2:"29";}"
元密钥owner
元值a:3:{i:0;s:3:"325";i:1;s:2:"41";i:2;s:2:"29";}
我试图弄清楚如何正确使用get_posts()
来返回所有具有 meta_key 值的帖子,owner
并且 meta_value 包含特定值,例如41
$args = array(
'post_type' => 'rp_applications',
'nopaging' => true,
'meta_query' => array(
'relation' => 'AND',
array(
'compare' => '=',
'key' => 'archived',
'value' => '0000-00-00'
),
array(
'compare' => '=',
'key' => 'owner',
'value' => ???? WHAT DO I PUT HERE ????
)
)
);
$applications = get_posts($args);
解决方案
听起来您应该将“所有者”存储为分类术语而不是元数据。它还将为您提供更轻松、更快的查询能力。
也就是说,绝对有可能做你想做的事。不过我会保持谨慎,因为postmeta
默认情况下该表未编制索引,因此对它运行元查询的大型表会大大降低您的网站速度。如果表格变得非常大,您可能需要考虑向表格添加部分索引(或者再次切换到分类术语而不是为此发布元数据)。
如果您仍然关心使用元查询,请查看docs中提供的compare
选项。WP_Meta_Query()
可用选项之一是REGEXP
,因此您可以执行以下操作:
$args = array(
'post_type' => 'rp_applications',
'nopaging' => true,
'meta_query' => array(
'relation' => 'AND',
array(
'compare' => 'REGEXP',
'key' => 'owner',
'value' => sprintf( 'a:\d:{i:0;s:\d:"\d.*?";i:1;s:%d:"%d".*', strlen($owner_id), $owner_id )
),
array(
'compare' => '=',
'key' => 'archived',
'value' => '0000-00-00'
)
)
);
当然,此方法仅适用于每个序列化数据的格式相同的情况,如果不是,您需要调整正则表达式 - 但这应该足以让您开始!