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.