我想帮助迭代存储在meta_value
表的wp_postmeta
列中的对象。
我有ID存储在列中,我想在内部SELECT
中使用这些ID,这些ID将获取与每个ID相关联的页面标题。
这是我的SQL:
SELECT p.ID, p.post_title, p.post_status, p.post_type, pm.meta_key, pm.meta_value
FROM wp_posts p, wp_postmeta pm
WHERE p.ID = pm.post_id
AND pm.meta_key = topic_related_topics
AND pm.meta_value != ''
ORDER BY p.post_title, p.post_type desc
这是一个带回来的例子:
1313,ADIPIC ACID,draft,post,topic_related_topics,
a:5:
{i:0;s:3:"961";
i:1;s:4:"1313";
i:2;s:3:"975";i:
基本上我需要知道与ID 961相关联的标题。标题位于wp_posts
表中。
答案 0 :(得分:2)
您在数据库中看到的值是一个已被PHP序列化为字符串的数组。 i
代表“整数”,s
代表“字符串”,s
后面的数字表示字符串的长度。在这种情况下,即使“961”是一个整数,它也会作为一个字符串存储在一个包含5个元素的数组的第一个位置(看起来你切断了最后的2个)。
没有一种很好的方法可以在SQL中反序列化数据,因此您需要在PHP中执行此操作,然后再进行第二次查询以获取标题。您可以使用WordPress函数maybe_unserialize()
将其转换回数组。
global $wpdb;
$sql = "your sql....";
$rows = $wpdb->get_results( $wpdb->prepare( $sql, $your_args ) );
foreach( $rows as $row ){
// convert to an array
$ids = maybe_unserialize( $row->meta_value );
// loop through the array
foreach( $ids as $id ){
// fetch the titles
$sql = "SELECT post_title FROM $wpdb->posts WHERE ID = %d";
$title = $wpdb->get_var( $wpdb->prepare( $sql, $id ) );
}
}
更标准的方法是使用get_post_meta()
来获取数组,并让WordPress在内部处理序列化。这里的另一大优势是,如果您正在使用缓存,那么对它的支持已经内置到这些函数中。
最后,如果您做希望能够在单个SQL查询中获取所有内容,则需要一些额外的逻辑,可能与保存元值有关。除了将其保存为数组之外,您还可以获取要加入的单个值并将其保存在自己的meta_key中。使用单个值,您可以将posts表连接到postmeta以完成您要查找的内容。