如何通过meta_value列中的对象进行解析

时间:2015-08-23 14:42:34

标签: php sql wordpress

我想帮助迭代存储在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表中。

1 个答案:

答案 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以完成您要查找的内容。