从多站点中的站点获取帖子?


17

我正在尝试拉多个网站的帖子。例如,我可以按类别和总帖子数拉出单个网站帖子。

但是,我试图从两个单独的多站点博客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 ?>

Answers:


12

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名为Beethoven,站点4名为Bach

演示

PS:感谢@brasofilo提供的链接阐明了我对restore_current_blog();-)的误解

PPS:感谢@ChristineCooper分享了以下评论:

只是一个友好的警告。确保不要将原始博客ID设置为变量$blog_id-这是因为在此switch_to_blog() 过程中,$blog_id核心功能将覆盖该博客ID ,这意味着当您尝试切换回原始博客时,最终会切换到最后一个博客一个你循环。有点令人费解。:)


这是我如何加载我的帖子pastie.org/7827649如何将其实现为这点,就像我通过两个博客ID提到的那样,但是按特定类别博客1 列出的每个博客ID都会具有类别视频,而博客2也会具有类别新闻总数不得超过10个。
DeadArtcore

1
我更新了答案以支持不同的类别。
birgire 2013年

1
ps:再次更新了示例,因此您可以使用模板标签the_title()代替$post->post_title;-)我希望我给了您足够的信息,以便您可以完成项目。
birgire

1
替换foreach($rightbox as $post)foreach($posts as $post)您的pastie。
比尔吉里(Birgire),

1
希望我可以将您的评论添加到更新的答案中@ChristineCooper
birgire

0

看看我的“ Multisite Post Reader”插件https://wordpress.org/plugins/multisite-post-reader/中的代码。它在另一个答案中使用该技术遍历帖子。我也有对图像执行相同操作的插件。

由于它是一个开放源代码,因此欢迎您浏览该代码并将其片段用于自己的用途。(有些代码是从我发现的开源代码中修改的。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.