Я пытаюсь вытащить несколько сайтов сообщений. Например, я могу вытащить один пост на сайте по категории и всего постов 10.
Но я пытаюсь извлечь обе записи из двух отдельных мультисайтовых блогов 1 и 2. Но работает только блог 1. Кроме того, я хочу извлечь другую категорию из блога 1 и блога 2 другой категорией. Как мне этого добиться?
Вот что я пытаюсь сделать:
<?php
global $switched;
switch_to_blog(1,2); //switched to 1 & 2 but only 1 working
// Get latest Post
$latest_posts = get_posts('&cat=64&showposts=10');
$cnt =0;?>
<ul>
<?php foreach($latest_posts as $post) : setup_postdata($post);?>
<li>
<a href="<?php echo get_page_link($post->ID); ?>" title="<?php echo $post->post_title; ?>"><?php echo short_title('...', 7); ?></a>
</li>
<?php endforeach ; ?>
<?php restore_current_blog(); //switched back to main site ?>
Функция WordPress switch_to_blog()
ожидает целое число в качестве входного параметра. Вы можете прочитать больше об этом в Кодексе:
http://codex.wordpress.org/Function_Reference/switch_to_blog
Пожалуйста, попробуйте такую структуру:
// Get the current blog id
$original_blog_id = get_current_blog_id();
// All the blog_id's to loop through
$bids = array( 1, 2 );
foreach( $bids as $bid )
{
// Switch to the blog with the blog_id $bid
switch_to_blog( $bid );
// ... your code for each blog ...
}
// Switch back to the current blog
switch_to_blog( $original_blog_id );
Если вы хотите получать сообщения из разных категорий для каждого блога, вы можете использовать, например:
// Get current blog
$original_blog_id = get_current_blog_id();
// Setup a category slug for each blog id, you want to loop through - EDIT
$catslug_per_blog_id = array(
1 => 'video',
4 => 'news'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Switch to the blog with the blog id $bid
switch_to_blog( $bid );
// ... your code for each blog ...
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 10,
)
);
// ... etc
}
// Switch back to the current blog
switch_to_blog( $original_blog_id );
Вот пример, который позволяет вам использовать теги шаблона (это работает на моей многоузловой установке):
// Get current blog
$original_blog_id = get_current_blog_id();
// Setup a category for each blog id you want to loop through - EDIT
$catslug_per_blog_id = array(
1 => 'video',
4 => 'news'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
//Switch to the blog with the blog id $bid
switch_to_blog( $bid );
// Get posts for each blog
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 2,
)
);
// Skip a blog if no posts are found
if( empty( $myposts ) )
continue;
// Loop for each blog
$li = '';
global $post;
foreach( $myposts as $post )
{
setup_postdata( $post );
$li .= the_title(
$before = sprintf( '<li><a href="%s">', esc_url( get_permalink() ) ),
$after = '</a></li>',
$echo = false
);
}
// Print for each blog
printf(
'<h2>%s (%s)</h2><ul>%s</ul>',
esc_html( get_bloginfo( 'name' ) ),
esc_html( $catslug ),
$li
);
}
// Switch back to the current blog
switch_to_blog( $original_blog_id );
wp_reset_postdata();
Вот демонстрационный скриншот для нашего примера с сайтом 1 с именем Бетховен и сайтом 4 с именем Бах :
PS: благодаря @brasofilo предоставив ссылку , которая проясняет мое недопонимание restore_current_blog()
;-)
PPS: Спасибо @ChristineCooper за то, что поделились следующим комментарием:
Просто дружеское предупреждение. Убедитесь, что в исходном идентификаторе блога не задана переменная
$blog_id
- это связано с тем, что во время процессаswitch_to_blog()
функция$blog_id
будет переопределена основной функцией, что означает, что при попытке вернуться к исходному блогу вы в конечном итоге переключитесь до последнего, который вы перебрали. Немного загадки ума. :)
Взгляните на код в моем плагине "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/ . Он использует технику в другом ответе, чтобы просмотреть сообщения. У меня также есть плагины, которые делают то же самое для изображений.
Поскольку это код с открытым исходным кодом, вы можете побродить по коду и использовать его для собственного использования. (Часть кода модифицирована из открытого исходного кода, который я нашел.)