web-dev-qa-db-ja.com

マルチサイトインストールで1つのタイプのすべての投稿をクエリするにはどうすればよいですか?

私は5つのサイトを持つマルチサイトのワードプレスインストールを持っています、そして各サイト内に同じ4つのカスタム投稿タイプがあります、

post_typegalleryであるすべてのサイトで最新の5件の投稿をクエリしたいです。

現在のブログだけでなく、サイト内のすべてのブログをwp_query()で検索することは可能ですか。

5
Ash

はい、しかし単一の問い合わせではありません。

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

あなたがそれぞれの個々のブログで最新の記事を見せたいならば、それは簡単であるべきです。ネットワーク全体で個々の最新の投稿を表示したい場合は、各ブログの最新の投稿を見つける必要があります。最新の投稿を保存し、新しい投稿が見つかった場合はtiに置き換えてループ後に出力する必要があります。 。

5
Tom J Nowell

switch_to_blogは非常に高価です...ここに私が使用するコードがあります(私は自分のページャを使用してvarを問い合わせます)

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