Obter postagens de sites no Multisite?


17

Estou tentando puxar várias postagens de sites. Por exemplo, posso extrair uma única postagem do site por categoria e o total de postagens 10.

Mas estou tentando extrair as duas postagens de dois blogs multisite 1 e 2. separados. Mas apenas o blog 1 funciona. Além disso, quero extrair outra categoria do blog 1 e do blog 2 por outra categoria. Como posso conseguir isso?

Aqui está o que estou tentando fazer:

<?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 ?>

Respostas:


12

A função WordPress switch_to_blog()espera um número inteiro como parâmetro de entrada. Você pode ler mais sobre isso no Codex:

http://codex.wordpress.org/Function_Reference/switch_to_blog

Por favor, tente este tipo de estrutura:

// 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 ); 

Atualizar:

Se você deseja buscar postagens de diferentes categorias para cada blog, pode usar, por exemplo:

// 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 ); 

Exemplo:

Aqui está um exemplo que permite que você use tags de modelo (isso funciona na minha instalação multisite):

// 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();

Aqui está uma captura de tela de demonstração do exemplo acima, com o site 1 chamado Beethoven e o site 4 chamado Bach :

demonstração

PS: Graças à @brasofilo fornecendo o link que esclarece meu mal-entendido sobre o restore_current_blog();-)

PPS: Agradecemos a @ChristineCooper por compartilhar o seguinte comentário:

Apenas um aviso amigável. Certifique-se de não definir o ID do blog original como variável $blog_id- isso ocorre porque, durante o switch_to_blog() processo, $blog_idserá substituído pela função principal, ou seja, quando você tentar voltar ao blog original, você terminará alternando para o último um que você percorreu. Um pouco de um quebra-cabeça. :)


aqui está como eu carrego minhas postagens pastie.org/7827649 como posso implementar isso também como menciono pelos dois IDs do blog, mas cada ID do blog por categoria específica do blog 1 terá vídeos de categoria e o blog 2 terá a categoria Notícias também receberão um total de posts de 10 limites.
DeadArtcore # 10/13

11
Atualizei a resposta para oferecer suporte a diferentes categorias.
Birgire

11
ps: atualizou o exemplo novamente, para que você possa usar tags de modelo como em the_title()vez de $post->post_title;-) Espero ter fornecido informações suficientes para que você possa concluir seu projeto.
birgire

11
Substitua foreach($rightbox as $post)por foreach($posts as $post)no seu pastie.
birgire

11
Espero que seja ok que eu adicionei o seu comentário ao @ChristineCooper resposta atualizados
birgire

0

Dê uma olhada no código no meu plug-in "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/ . Ele usa a técnica na outra resposta para percorrer as postagens. Eu também tenho plugins que fazem o mesmo para imagens.

Como é um código de código aberto, você pode passear pelo código e usar partes dele para seu próprio uso. (Parte do código é modificada do código de fonte aberta que encontrei.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.