切换到博客后,GET_POST_META失败

时间:2017-04-14 作者:TorryVic

我在wordpress multisite中为自定义cron编写了一些代码,这些代码来自每个博客站点,获取他们的帖子和Posteta数据,并将它们放在xml结构中。

但是,当我检索元数据时(使用get_post_meta) 来自每个博客(使用switch_to_blog), 我从主站点(blog\\u id=1)获取数据,而不是从我想要的站点(例如blog\\u id=33)获取数据

这是我的部分代码的一个示例:

function generate_xml(33);

function generate_xml($blog_id){
global $wpdb;

$change_ok = switch_to_blog($blog_id);
if ( is_wp_error($change_ok) ) {
    WriteErrorLog($change_ok->get_error_message());
}
else {
    $xml = new SimpleXMLElement(\'<?xml version="1.0" encoding="UTF-8"?><data></data>\', null, false);
    $Body = $xml->addChild(\'Body\');
    $add_adverts = $Body->addChild(\'add_adverts\');

    $sql_posts = "select id, post_title, post_content from wp_".$blog_id."_posts where post_type = \'custom_add\' and post_status = \'publish\'";
    $result_posts = $wpdb->get_results ($sql_posts);
    foreach ( $result_posts as $data_posts ){
        $post_id_loop = $data_posts->id;
        $advert  = $add_adverts->addChild(\'advert\');
        //...
        $price = get_post_meta($post_id_loop, \'_price\', true);
        $advert->addChild(\'price\', $price);
        $color = get_post_meta($post_id_loop, \'_color\', true);
        $advert->addChild(\'color\', $color);
        $size = get_post_meta($post_id_loop, \'_size\', true);
        $advert->addChild(\'size\', $size);
        //...
    }
}
//... more code
restore_current_blog(); 
}

数据库表中的数据摘要如下:

Example:

但是,我得到的数据如下:

enter image description here

如何使用get_post_meta() 完成后在每个网站的博客上switch_to_blog()?

1 个回复
SO网友:Justin

正在阅读您的代码。。。

if ( is_wp_error($change_ok) ) {
    WriteErrorLog($change_ok->get_error_message());
}
不适用,因为$change\\u ok始终为true。参考https://codex.wordpress.org/Function_Reference/switch_to_blog

正如注释所述,最好使用get\\u posts(),这可能会解决您的问题,否则请使用$wpdb->在get\\u结果之前准备。

还有一条评论是,您的SQL语句将不适用于主站点。。$sql_posts = "select id, post_title, post_content from wp_".$blog_id."_posts where post_type = \'custom_add\' and post_status = \'publish\'";

需要注意的是,可以在wp配置中更改“wp\\uu0”表前缀。php文件,如果一个站点已经完成了“wp\\uu0”硬编码前缀,那么$wpdb->base_prefix 可用于使“wp\\u0”始终适合当前站点。还有wp_".$blog_id."_posts 不适用于主站点,因为表结构不同

一个获取当前站点WP数据库表前缀的简单函数。。。

// Get the database prefix
function get_blog_prefix( $blog_id=null ) {

    global $wpdb;

    if ( null === $blog_id ) {
        $blog_id = $wpdb->blogid;
    }
    $blog_id = (int) $blog_id;

    if ( defined( \'MULTISITE\' ) && ( 0 == $blog_id || 1 == $blog_id ) ) {
        return $wpdb->base_prefix;
    } else {
        return $wpdb->base_prefix . $blog_id . \'_\';
    }
}