質問: ネットワーク内の複数のサイトから投稿を問い合わせる 私は私が追い求めている解決策のまわりで踊るいくつかの質問があることを認識していますが、私は私が何か特別なことを探していると信じています。これは実際には二部構成の質問です。1)私の目標はワードプレスをネットワーク(マルチサイト)モードで動作させることであり、私は本質的に特定のサイトを一緒に「グループ化」する方法を見つけようとしています。私は "マルチネットワーク"プラグインを知っていますが、これがこれに対する最善のアプローチであるかどうか私は質問しますか?ここで重要なのは、特定のユーザーが自分のサブネットワーク内でサイトを追加/編集できるようにすることです。2)これはこの記事の重要な問題です...私は私がサイトのこの「サブネットワーク」の中から本質的に記事を問い合わせることを可能にするであろう最善のアプローチを知りたいのですが。したがって、たとえば、このサブネットワーク内に10のサイトがあり、それぞれが "news"というカスタム投稿タイプ内に投稿を作成した場合、たとえば、この10のコレクションから最近公開された10の投稿を表示できます。サイト.注:私は複数のサブネットワークを作成することができるという能力が必要です。それは今度は最新の「ニュース」のクエリが正しいグループに属するものからの投稿しか表示できないことを意味します。最後に - 私はこのようなことを行うための解決策が存在することを認識していますが、私はデータベース負荷/クエリの最小量を必要とする両方のケースで最良のアプローチを探しています。余分な肥大化を引き起こすプラグインをインストールするのではなく、私のfunctions.phpファイルのコードを通してこれをしたいと思います。私はどんな提案にも非常に寛容で、どんな反応にも感謝します。
回答: 私は同様の問題を抱えていました。私はコメントでソートされたすべてのネットワークサイトにわたる投稿のリストを入手する必要がありました(最も人気のある投稿を表示するため)。これが私が使った機能です。基本は、ネットワーク内のすべてのブログidのリストを最初に取得することです。次に、blog_id、id、およびcomment_count列を含む結果を取得する、大きな単一のクエリ(unionを使用してすべての行を結合し、見苦しいjoinを必要としない)を作成します。それを使って、get_blog_post()を使って各投稿の詳細情報を取得します。何が起こっているのかを確認するためにさまざまな時点で使用できるデバッグ行がいくつかあります。function txx_top_posts_mu( $howmany = 10 ) { global $wpdb; global $table_prefix; // get an array of the table names that our posts will be in // we do this by first getting all of our blog ids and then forming the name of the // table and putting it into an array $rows = $wpdb->get_results( "select blog_id from $wpdb->blogs where public = '1' and archived = '0' and mature = '0' and spam = '0' and deleted = '0';" ); if ( $rows ) : $blogposttablenames = array(); foreach ( $rows as $row ) : $blogposttablenames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts'; endforeach; //print_r($blogposttablenames); // now we need to do a query to get all the posts from all our blogs // ordered by the number of comments and with limits applied if ( count( $blogposttablenames ) > 0 ) : $query = ''; $i = 0; foreach ( $blogposttablenames as $blogid => $tablename ) : if ( $i > 0 ) : $query.= ' union '; endif; $query.= " select id, comment_count, $blogid as `blog_id` from $tablename "; $i++; endforeach; $query.= " order by comment_count desc limit 0,$howmany;"; //echo $query; $rows = $wpdb->get_results( $query ); // now we need to get each of our posts into an array and return them if ( $rows ) : $posts = array(); foreach ( $rows as $row ) : $posts[] = get_blog_post( $row->blog_id, $row->id ); endforeach; //print_r($posts); return $posts; endif; endif; endif; return false; }