web-dev-qa-db-fra.com

Comment interroger toutes les publications d'un type sur mon installation multisite?

J'ai une installation wordpress multisite avec 5 sites, et dans chaque site, il existe le même type de publication personnalisée,

Je souhaite interroger les 5 derniers articles sur tous les sites où le post_type est gallery

Est-il possible d’obtenir wp_query() pour parcourir tous les blogs du site au lieu du blog actuel?

5
Ash

Oui, mais pas dans une seule requête, par exemple:

if(is_multisite()){
    global $wpdb;
    $blogs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE spam = '0' AND deleted = '0' and archived = '0' and public='1'"));
    if(!empty($blogs)){
        ?><?php
        foreach($blogs as $blog){
            switch_to_blog($blog->blog_id);
            $details = get_blog_details($blog->blog_id);
            $q = new WP_query();
            if($q->have_posts()){
                while($q->have_posts()){
                    $q->the_post();
                    // do things
                    break;
                }
            }
            wp_reset_query();
            restore_current_blog();
        }
    }
}

Si vous souhaitez afficher le dernier message dans chaque blog, cela devrait être facile. Si vous souhaitez afficher le dernier message individuel sur l'ensemble du réseau, vous devez trouver le dernier blog de chaque blog, vous devez stocker le dernier message trouvé, remplacer ti lorsqu'un nouveau message est trouvé, puis l'afficher après la boucle. .

5
Tom J Nowell

switch_to_blog est TRES cher ... voici du code que j'utilise (j'utilise mon propre pager et mes vars de requête)

function recent_mu_posts($howmany, $paged, $when, $until, $search) {
/*  returns array of posts from all blogs in $blogs, newer than $when
*   older than $until, containing $search
*/
  global $options;
  global $wp_query;
  global $blogs;
  global $wpdb;
  global $table_prefix;

  $blogPostTableNames = get_mu_tables();
    if ( count( $blogPostTableNames ) > 0 ) :
      $query = ''; $i = 0;
      foreach ( $blogPostTableNames as $blogId => $tableName ) :
        if ( $i > 0 ) :
        $query.= ' UNION ';
        endif;
        $query.= " (SELECT ID, post_date, $blogId as `blog_id` FROM $tableName WHERE post_status = 'publish' AND post_type = 'post' AND post_date >= '$when' AND post_date <= '$until'";
        if (isset($search)) $query.= " AND ( post_content COLLATE UTF8_GENERAL_CI LIKE '%{$search}%' OR post_title COLLATE UTF8_GENERAL_CI LIKE '%{$search}% ')";
        $query.=")";
        $i++;
      endforeach;
      $query.= " ORDER BY post_date DESC ";
      /* pagination */
      $totalposts = $wpdb->get_results($query, OBJECT);
      $ppp = intval( get_query_var( 'posts_per_page' ) );
      $on_page = $paged; #intval( get_query_var( 'paged' ) ); 
      if( $on_page == 0 ) $on_page = 1;  
      $offset = ( $on_page - 1 ) * $ppp;
      //set global $wp_query object for pagination

      $wp_query->found_posts = count($totalposts);
      $wp_query->max_num_pages = ceil($wp_query->found_posts / $ppp); 
      $wp_query->request = $query . " LIMIT $ppp OFFSET $offset";

      //= " LIMIT $ppp OFFSET $offset"; 
      $rows = $wpdb->get_results( $wp_query->request, OBJECT);
      if ( $rows ) :
        $posts = array();
        $i=0;
        global $post;
        foreach ( $rows as $post ) :
            $posts[$i] = get_blog_post( $post->blog_id, $post->ID );
            $posts[$i]->blog_id = $post->blog_id;
            $i++;
        endforeach;
        $wp_query->posts = $posts;
        return $posts;
      endif;
  endif;
}
1
Creative Choice