我在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();
}
数据库表中的数据摘要如下:
但是,我得到的数据如下:
如何使用
get_post_meta()
完成后在每个网站的博客上
switch_to_blog()
?
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 . \'_\';
}
}