ネットワーク内の複数のサイトからの投稿をクエリしますか?
-
16-10-2019 - |
質問
私は、私が追いかけている解決策の周りで踊るいくつかの質問があることに気づきましたが、私は具体的なものを探していると思います。
これは実際には2つの部分の質問です。
1)私の目標は、WordPressをネットワーク(マルチサイト)モードで動作させることであり、特定のサイトを本質的に「グループ」する方法を把握しようとしています。私は「マルチネットワーク」プラグインを知っていますが、これがこれの最良のアプローチであるかどうか疑問に思いますか?ここで重要なのは、特定のユーザーが自分のサブネットワーク内のサイトを追加/編集できるようにすることです。
2)これがこの投稿の重要な質問です...このサイトの「ネットワーク」のこの「ネットワーク」から本質的に投稿することができる最良のアプローチを知りたいと思います。したがって、たとえば、このサブネットワーク内に10個のサイトがあり、それぞれが「ニュース」と呼ばれるカスタム投稿タイプ内に投稿を作成した場合、この10のコレクションの10個の投稿を表示する機能を希望します。サイト。
注:マルチサブネットワークを作成できる能力が必要です。これは、最新の公開された「ニュース」のクエリが正しいグループに属するものからのみ投稿のみを表示できることを意味します。
最後に、このようなことをするためのソリューションが存在することは実現していますが、データベースの負荷/クエリの量が少ない場合の両方のケースで最良のアプローチを探しています。また、余分な肥大化を作成するプラグインをインストールするのではなく、functions.phpファイルのコードを介してこれを行いたいと思います。
私はどんな提案に対しても非常にオープンで、どんな応答も感謝しています。
解決
プラグインをインストールしたくないと言ったことは知っていますが、それはまさにこの状況でやりたいことです。テーマにコードを配置します functions.php
ファイルでは、サブネットワーク内のすべてのサイトで同じテーマを使用するか、同じファイルの複数のコピーを維持する必要があります。一方、ネットワーク用のシンプルなプラグインを作成して、機能をカプセル化してから、 ネットワーク上でアクティブ化します, 、そしてすぐに、維持するファイルが1つだけで機能を使用できるようにします。これは実際に作成されます 以下 あなたに依存するよりも肥大化します functions.php
ファイル。
ここで留意すべきことは、ネットワーク上の各サイトをループして投稿を見つけたり、カスタムクエリを実行する必要があることです。もう少し複雑ですが、ブログごとに異なるクエリではなく単一のクエリであるため、2番目のルーチンを選択します。
基本的に...次のことを行う必要があります。
- ネットワーク/サブネットワーク内のすべてのブログIDのリストを取得します。バニラのインストールを使用している場合、これは
wp_blogs
テーブル。単純なことをしてくださいSELECT
クエリは配列をロードするために、ループを介して各ブログをメインクエリに追加できます。 - 各ブログを大きなクエリに追加するループを作成します。あなたはそうする必要があります
JOIN
テーブルを一緒に撮影し、に基づいて検索しますblog_id
(からwp_blogs
),post_id
(からwp_BLOG_posts
)、およびカスタム分類法。
私が言ったように、それは単純な解決策ではありません(SQLステートメントは 非常に 複雑で、私は現時点ではハッキングする時間がありません)が、それはすべての作業を行う単一のステートメントになります。
または...
- ブログIDのリストを取得し、配列に保存します。
- ネットワーク内の各ブログをクエリする配列を繰り返し、試合(特定の分類学期間の投稿)を別の配列に追加します。
代替方法を使用すると、ネットワーク内のすべてのブログに対して別のクエリを実行する必要があります。ネットワークが10〜20サイトの場合、これはそれほど問題ではありません。ネットワークが200〜500のサイトである場合、いくつかのパフォーマンスの問題が発生し始めることを期待しています。
また、可能であれば、クエリの結果をキャッシュする必要があります。複数のページのロードで実行されている場合(つまり、ネットワーク全体で共有されるサイドバーウィジェットの場合)、新しいデータがある場合にのみクエリを実行する必要があります。それ以外の場合は、ネットワークを遅くしないように、キャッシュされた結果を提供します。
他のヒント
同様の問題がありました。コメントでソートされたすべてのネットワークサイトで投稿のリストを取得する必要がありました(最も人気のある投稿を表示するため)。これが私が使用した関数です。
基礎は、最初にネットワーク内のすべてのブログIDのリストを取得することです。次に、列blog_id、id、およびcomment_countを含む結果を取得する結果が得られる大きなシングルクエリ(すべての行を結合するために、すべての行を結合し、醜い結合を必要としない)を構築します。それを使用して、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;
}
マルチサイトネットワークプラグインが必要です。現在3つの選択肢があります。2つは有料、1つは無料です。
そこから、サイト全体のタグプラグインのようなものを使用して、各ネットワークのメインブログに投稿することができます。
これらのどちらも、テーマの関数ファイルから実行することはできません(またはすべきではありません)。
カスタムGoogle検索エンジンを構築するGoogle.com/CSE検索するすべてのサイトを指定します
あなたのウェブサイトにそれを埋め込みました