รับโพสต์จากไซต์ใน Multisite หรือไม่


17

ฉันพยายามดึงโพสต์เว็บไซต์หลายแห่ง ตัวอย่างเช่นฉันสามารถดึงโพสต์ไซต์เดียวตามหมวดหมู่และโพสต์ทั้งหมด 10

แต่ฉันพยายามดึงทั้งสองโพสต์จากสองบล็อก Multisite 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 ?>

คำตอบ:


12

ฟังก์ชั่น WordPress switch_to_blog()คาดว่าจะเป็นจำนวนเต็มเป็นพารามิเตอร์ป้อนเข้า คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ใน Codex:

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 สำหรับการแบ่งปันความคิดเห็นต่อไปนี้:

เพียงแค่คำเตือนที่เป็นมิตร ตรวจสอบให้แน่ใจว่าไม่ได้ตั้งค่า ID บล็อกดั้งเดิมของคุณเป็นตัวแปร$blog_id- เนื่องจากในระหว่างswitch_to_blog() กระบวนการ$blog_idจะถูกแทนที่ด้วยฟังก์ชันหลักซึ่งหมายความว่าเมื่อคุณพยายามเปลี่ยนกลับไปเป็นบล็อกดั้งเดิมคุณจะจบลงด้วยการเปลี่ยนไปใช้บล็อกสุดท้าย อันที่คุณลูปผ่าน เป็นปริศนาจิ๊กซอว์เล็กน้อย :)


นี่คือวิธีที่ฉันโหลดโพสต์ของฉันpastie.org/7827649ฉันจะนำสิ่งนั้นไปใช้ในส่วนนี้ได้อย่างไรเช่นเดียวกับที่ฉันพูดถึงจาก ID บล็อกทั้งสอง แต่แต่ละ ID บล็อกตามหมวดหมู่เฉพาะบล็อก 1 จะมีวิดีโอหมวด & บล็อก 2 โพสต์ทั้งหมด 10 รายการ
DeadArtcore

1
ฉันอัพเดตคำตอบเพื่อรองรับหมวดหมู่ที่แตกต่างกัน
Birgire

1
ps: อัปเดตตัวอย่างอีกครั้งเพื่อให้คุณสามารถใช้เทมเพลตแท็กเช่นthe_title()แทนที่จะเป็น$post->post_title;-) ฉันหวังว่าฉันจะให้ข้อมูลที่เพียงพอแก่คุณเพื่อให้คุณสามารถทำโครงการให้เสร็จ
Birgire

1
แทนที่foreach($rightbox as $post)ด้วยforeach($posts as $post)ใน Pastie ของคุณ
Birgire

1
หวังว่ามันจะโอเคที่ฉันได้เพิ่มความคิดเห็นของคุณไปยังคำตอบอัพเดท
@ChristineCooper

0

ลองดูที่รหัสในฉัน "Multisite โพสต์อ่าน" ปลั๊กอินhttps://wordpress.org/plugins/multisite-post-reader/ มันใช้เทคนิคในคำตอบอื่น ๆ ในการวนซ้ำโพสต์ ฉันยังมีปลั๊กอินที่ทำสิ่งเดียวกันกับรูปภาพ

เนื่องจากเป็นรหัสโอเพนซอร์ซคุณจึงสามารถท่องไปในรหัสและใช้ชิ้นส่วนต่าง ๆ เพื่อการใช้งานของคุณเอง (รหัสบางส่วนถูกแก้ไขจากรหัสโอเพนซอร์สที่ฉันพบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.