ネットワーク内の複数のサイトからの投稿をクエリしますか?


8

私が求めている解決策については、いくつかの質問があることに気づきましたが、何か具体的なものを探していると思います。

これは実際には2つの部分からなる質問です。

1)私の目標は、ワードプレスをネットワーク(マルチサイト)モードで動作させることであり、特定のサイトを本質的に「グループ化」する方法を理解しようとしています。私は「マルチネットワーク」プラグインを知っていますが、これがこのための最良のアプローチであるかどうか質問しますか?ここで重要なのは、特定のユーザーが自分のサブネットワーク内でサイトを追加/編集できるようにすることです。

2)これがこの投稿の重要な質問です...このサイトの「サブネットワーク」内から投稿を本質的に照会できるようにする最善の方法を知りたいのですが。たとえば、このサブネットワーク内に10のサイトがあり、それぞれが「ニュース」と呼ばれるカスタム投稿タイプ内に投稿を作成した場合、たとえば、この10のコレクションから最近公開された10の投稿を表示する機能が必要です。サイト。

注:私は複数のサブネットワークを作成できる能力が必要です。つまり、最新の公開された「ニュース」のクエリでは、正しいグループに属する投稿のみを表示できます。

最後に、私はこのようなことを行うための解決策が存在することを認識していますが、データベースのロード/クエリの量が最小である必要がある両方のケースで最良のアプローチを探しています。私はまた、余分な膨らみを作成するプラグインをインストールするのではなく、functions.phpファイルのコードを通じてこれを実行したいと思っています。

私はどんな提案にも非常にオープンであり、どんな反応にも感謝します。

回答:


7

プラグインをインストールしない方がいいとおっしゃっていましたが、それはまさにこの状況でしたいことです。コードをテーマのfunctions.phpファイルに配置するには、サブネットワーク内のすべてのサイトで同じテーマを使用するか、同じファイルの複数のコピーを維持する必要があります。一方、ネットワーク用のシンプルなプラグインを作成して機能をカプセル化し、ネットワーク上でアクティブにして、 1つのファイルだけで維持できる機能をすぐに利用できます。これは実際には、ファイルに依存するよりも膨らみを少なくしfunctions.phpます。

ここで覚えておくべきことは、投稿を見つけるためにネットワーク上の各サイトをループするか、カスタムクエリを実行する必要があるということです。もう少し複雑ですが、ブログごとに異なるクエリではなく単一のクエリであるため、2番目のルーチンを選択します。

基本的に...あなたは次のことをする必要があります:

  1. ネットワーク/サブネットワーク内のすべてのブログIDのリストを取得します。バニラインストールを使用している場合、これはwp_blogs表に記載されています。単純なSELECTクエリを実行して配列をロードしたら、ループして各ブログをメインのクエリに追加できます。
  2. 大きなクエリに各ブログを追加するループを作成します。JOINテーブルをまとめ、blog_id(からwp_blogs)、post_id(からwp_BLOG_posts)、およびカスタム分類法に基づいて検索する必要があります。

私が言ったように、それは単純な解決策ではありません(SQLステートメントは非常に複雑であり、現時点でハッキングする時間はありません)が、すべての作業を行う単一のステートメントになります。

あるいは...

  1. ブログIDのリストを取得して、配列に格納します。
  2. 配列を反復処理して、ネットワーク内の各ブログをクエリし、一致(特定の分類用語の投稿)を別の配列に追加します。

別の方法では、ネットワーク内のすべてのブログに対して個別のクエリを実行する必要があります。ネットワークが10〜20のサイトである場合、これはそれほど大きな問題ではありません。ネットワークが200〜500のサイトの場合、パフォーマンスの問題が発生し始めると予想されます。

また、可能な場合は、クエリの結果をキャッシュする必要があります。複数のページの読み込みで実行されている場合(つまり、ネットワーク全体で共有されるサイドバーウィジェットの場合)、取得する新しいデータがある場合にのみクエリを実行します。それ以外の場合は、ネットワークの速度が低下しないように、キャッシュされた結果を提供します。


お返事をありがとうございます。カスタムSQLクエリを使用してこれを行うと、負荷が軽減されると想定しているので、気に入っています。私が期待しているのは、サイトを関連付けることができるこれらのサブネットワークを作成するために使用するプラグインを示し、すべての投稿を自動的にクエリするために使用する必要があるSQLクエリがあるときですそのサイトはサブネットワークを割り当てました。私はあなたの時間に非常に感謝します
NetConstructor.com

3
可能であれば更新してください
NetConstructor.com

1

同様の問題がありました。(最も人気のある投稿を表示するために)コメントでソートされたすべてのネットワークサイトにわたる投稿のリストを取得する必要がありました。これは私が使った機能です。

基本は、まずネットワーク内のすべてのブログIDのリストを取得することです。次に、大きな単一のクエリを作成し(UNIONを使用してすべての行を結合し、醜いJOINを必要としない)、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;

}


-1

マルチサイトネットワークプラグインが必要です。現在、3つの選択肢があります。2つは有料、もう1つは無料です。

そこから、サイト全体のタグプラグインなどを使用して、各ネットワークのメインブログに投稿をプルできます。

これらのどちらも、テーマの関数ファイルから実行することはできません(または実行する必要があります)。


あなたが言及している有料のものは何ですか?
NetConstructor.com


1
支払い済み:(mine)wpebooks.com/networks
andrea_r

-3

カスタムgoogle検索エンジンgoogle.com/cseを作成して、検索するすべてのサイトを指定します

あなたのウェブサイトに埋め込む


@mirelle-しかし、これは私が探していた答えではありません
NetConstructor.com
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.