Obtenha publicações recentes por data no Multisite

4

Tudo na explicação é sobre CDTuts

Eu criei uma Rede WordPress e eu quero é obter as postagens recentes de todos os blogs de subdomínio selecionados. Preciso receber as últimas Todas organizadas por data e não organizadas pelo ID do blog .

Eu não quero usar o switch_to_blog , portanto, usando o foreach, porque eu só faço postagens em loop nos próximos blogs que eu mudo. Eu quero realmente combinar os posts e organizá-los todos por data. Eu acho que você teria que fazer isso consultando mysql em vez de usar WP_Query. Mas eu estava esperando por uma maneira mais nativa de fazer isso. Isso é para a lista de postagens a serem feitas na parte inferior da primeira página, como você pode ver com os timestamps que não são aumentados ou diminuídos pelo número maior ou menor.

Eu até tentei fazer algo assim, mas isso também não funcionaria. Classificando a postagem pelo registro de data e hora do Unix, para perceber que as postagens ainda estão sendo organizadas por switch_to_blog em vez de em tempo hábil.

<?php           
    switch_to_blog(1);
    $main_posts = get_posts();
    switch_to_blog(2);
    $php_posts = get_posts();
    switch_to_blog(3);
    $wp_posts = get_posts();
    switch_to_blog(4);
    $mac_posts = get_posts();
    switch_to_blog(4);
    $psd_posts = get_posts();
    switch_to_blog(1);

    $posts = array_merge($main_posts, $php_posts, $wp_posts, $mac_posts, $psd_posts);
    usort($post, get_post_time);

    foreach($posts as $post){
    ?>
        <li class="thumb"><a href="<?php echo the_permalink(); ?>">
            <div class="site-name">
            </div>
            <div class="title">
                <?php echo the_title(); ?><br> <?php echo get_post_time(); ?>
            </div>
        </a></li>
    <?php }         
?>

Eu também criei uma função onde eu posso selecionar o ID do blog usando switch_to_blog . Isso só funcionará nos blocos no topo da primeira página. Mas também estou tentando fazer o mesmo para os posts mais recentes na parte inferior. Não poderei criar um deslocamento para que eu possa manter o design do bloco, mantendo as 6 postagens mais recentes.

Isso foi baseado em uma resposta anterior em StackExchange

function global_latest_post($LatestBlogNumber,$LatestPostNumber, $LatestThumbSize, $LatestThumbNumber) {
    $original_blog_id = get_current_blog_id();
    $bids = array($LatestBlogNumber);    

    foreach($bids as $bid) {
        switch_to_blog($bid);
        $tiles = new WP_Query('posts_per_page=1');
        while ($tiles->have_posts()) : $tiles->the_post(); ?>
            <a href="<?php echo the_permalink(); ?>" class="<?php echo $LatestThumbSize; ?> thumb-<?php echo $LatestThumbNumber; ?>">
                <p class="cover">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
                <p class="bold bottom">Read More &rarr;</p>
                <h1><?php echo $LatestPostNumber; ?>. <?php echo the_title(); ?> in <?php bloginfo('name'); ?></h1>
            </a>
        <?php           
        endwhile;
    }
    switch_to_blog( $original_blog_id ); //switched back to current blog
}
    
por Satan 04.10.2013 / 23:06

3 respostas

1

Como o multisite wordpress usa tabelas diferentes para todos os blogs, é muito ineficiente obter todos os artigos recentes de todos os blogs (agregação de conteúdo) em tempo de exibição, pois você precisa consultar todos os blogs, classificar os artigos por data e exibir o valor necessidade.

Plugins como o WordPress Post Indexer ( enlace ) adicionam todos os posts em uma tabela db central no momento em que você inserir ou atualizá-los. A partir daí, você pode consultá-los com muita eficiência.

Eu usei o plugin mencionado sozinho - vale a pena tentar. Eu não estou associado ao criador.

Há algumas coisas a considerar também: Por exemplo: se você quiser exibir campos meta met customizados, terá que usar switch_to_blog.

    
por jjarolim 19.04.2015 / 23:10
0

Veja minha resposta em Receba postagens da rede (Multisite) . Meu plugin 'Multisite Post Reader' (livre, código aberto) pega todas as postagens de todos os subsites com opções para limitar a contagem, data, etc.

Provavelmente é um pouco "pesado" (ineficiente), como mencionado por @jjarolim, mas talvez o código o ajude em seus esforços.

    
por Rick Hellewell 24.05.2017 / 19:28
0

Eu percebo que esta pergunta é bastante "antiga", no entanto, eu encontrei uma solução.

É possível recuperar postagens de outros blogs na rede multisite sem a necessidade de usar switch_to_blog(); ou restore_current_blog(); .

/**
 * This is an example of retrieving posts from multiple blogs in Multisite.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 * @param array $user_args
 *
 * @return array|bool|null|object
 */
function mbe_get_network_posts( Array $user_args = Array() ) {

    if ( ! is_multisite() ) {
        return false;
    }

    $default_args = array(
        'post_type'   => 'post',
        'post_status' => 'publish',
        'limit'       => absint( get_option( 'posts_per_page' ) ),
        'orderby'     => 'post_date',
        'order'       => 'DESC'
    );

    $args = wp_parse_args( $user_args, $default_args );

    $args['orderby'] = strtolower( $args['orderby'] );
    $args['order']   = strtoupper( $args['order'] );

    if ( ! in_array( $args['orderby'], array(
        'id',
        'post_title',
        'post_name',
        'post_date',
        'post_modified',
        'post_author',
        'blog_id'
    ) ) ) {
        return false;
    }

    if ( ! in_array( $args['order'], array(
        'ASC',
        'DESC'
    ) ) ) {
        return false;
    }

    global $wpdb;

    if ( ! $blog_ids = $wpdb->get_col( "SELECT DISTINCT blog_id FROM {$wpdb->blogs}" ) ) {
        return false;
    }

    $queries = array();

    $where = array(
        'post_type'   => $wpdb->prepare( "AND post_type = %s", $args['post_type'] ),
        'post_status' => $wpdb->prepare( "AND post_status = %s", $args['post_status'] ),
    );

    foreach ( $blog_ids as $blog_id ) {

        if ( $blog_id == 1 ) {
            $prefix = substr( $wpdb->base_prefix, 0, - 1 );
        } else {
            $prefix = $wpdb->base_prefix . $blog_id;
        }

        $queries[] = $wpdb->prepare(
            "
            ( 
                SELECT *, {$blog_id} AS blog_id
                FROM {$prefix}_posts
                WHERE 1=1 " . join( " ", $where ) . "
                ORDER BY {$args['orderby']}
                {$args['order']}
                LIMIT %d
            )
            ",
            absint( $args['limit'] )
        );

    }

    $query = join( "UNION", $queries ) . "ORDER BY {$args['orderby']} {$args['order']}";

    return $wpdb->get_results( $query );

}

Eu mantive isso curto e direto ao ponto. No entanto, você poderia expandir isso, permitindo vários tipos de postagens ou post status, etc.

Atualmente, com essa função acima, você pode controlar o tipo de postagem, o status da postagem e classificar por:

Opções classificáveis:

  • ID da postagem
  • Título da postagem
  • Post Slug
  • Data de publicação de postagem
  • Data de modificação da postagem
  • ID do autor da postagem
  • ID do blog

Veja os argumentos padrão para uma lista de argumentos a serem substituídos para atender às suas necessidades específicas.

Pensei em compartilhar isso como uma possível solução para alguém usar uma base para qualquer situação em que você precise recuperar mensagens em toda a rede.

Além disso, você pode modificá-lo para retornar IDs de postagem, em vez de tudo. Em seguida, você poderia usar os IDs de postagem em new WP_Query(); para algo mais complexo, como Meta Queries e / ou Taxonomy, etc.

Espero que alguém ache isso útil.

    
por Michael Ecklund 25.05.2017 / 01:08