Intereting Posts
3.1 форматы сообщений и конкретные категории / пользовательские таксономии Изменить заголовок только на динамической странице Поиск URL-адреса, который будет использоваться для проверки наличия плагина с темой Как создать разбивку на страницы для главной страницы с виджетной областью? Сколько плагинов кеширования должно использоваться? Полуспециализированный вопрос о таксономии Входные данные из таблицы WP users используются на другой странице Проверьте, не было ли обрезано пользовательское изображение размера томажа для правильных размеров Записи с сообщениями, которые содержат по крайней мере 3 тега текущего сообщения Ошибка форматирования сообщений в WordPress Создание изображений в сообщениях ссылки на файл изображения, а не на страницу вложения Поддерживает ли иерархия раздела API настройки темы WordPress? Перечислите первую букву категорий – вопрос о специальных символах (датские буквы) Предоставьте человеку разрешение на модерацию всех комментариев в блоге, не предоставляя им возможность редактировать другие публикации людей Почему я не могу добавить скриптовый код в настройки темы без 403-запрещенных?

get_post_meta завершается с ошибкой после switch_to_blog

У меня есть код для пользовательского cron в wordpress multisite, который с каждого сайта блога получает свои сообщения и данные постмета и помещает их в структуру xml.

Но когда я извлекаю метаданные (используя get_post_meta ) из каждого блога (используя switch_to_blog ), я получаю данные с основного сайта (blog_id = 1) не с сайта, который хотел бы (например, blog_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() ?

Solutions Collecting From Web of "get_post_meta завершается с ошибкой после switch_to_blog"

чтение через ваш код …

 if ( is_wp_error($change_ok) ) { WriteErrorLog($change_ok->get_error_message()); } 

не применимо, поскольку $ change_ok всегда будет правдой. https://codex.wordpress.org/Function_Reference/switch_to_blog

как говорится в комментариях, лучше использовать get_posts (), и это может исправить вашу проблему, иначе используйте wpdb-> make перед вашими get_results.

также комментарий состоит в том, что ваш оператор 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-config.php, и если сайт сделал «wp_» жестко запрограммированный префикс, он никогда не будет работать. $wpdb->base_prefix может использоваться для создания «wp_» «всегда соответствует текущему сайту. также 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 . '_'; } }