web-dev-qa-db-ja.com

複数のwp_queryオブジェクトをマージする

私は以下のマルチサイトインストール用のコードを持っています。それはうまく機能しますが、WordPressループを持つ別のテンプレートで使用するために、各マルチサイトからの各WP_Queryループオブジェクトをマージする必要があります。これは可能ですか。オブジェクトを以下のものとマージしてみました。

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);       

しかし、オブジェクトには関数が含まれているのでうまくいきません。アイデア?

<?php

// Set up global variables. Great
global $wpdb, $blog_id, $post, $merged_loop;

// Get a list of blogs in your multisite network
$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM ftc_blogs ORDER BY blog_id" ) );

// Iterate through your list of blogs
foreach ($blogs as $blog){

    // Switch to the next blog in the loop.
    // This will start at blog_id == 1 because of the ORDER BY statement.
    switch_to_blog($blog->blog_id);

    // Get the 5 latest posts for the blog and store them in the $query variable.
    $args = array( 'post_type' => array('post', 'page'), 'category_name' => 'dashboard', 'posts_per_page' => 5 );
    $loop = new WP_Query( $args );

    // need to merge $loop data into $merged_loop for use in template.

    // Switch back to the main blog
    restore_current_blog();
}

endif;
?>
4
Ian Hoar

各WP_Queryオブジェクトの投稿だけが必要な場合は、次のようにすることができます。

<?php
// fetch blogs here
$all_posts = array()
foreach($blogs as $b)
{
    switch_to_blog($b->blog_id);
    $query = new WP_Query(/* your args here */);
    if($query->have_posts())
        $all_posts = array_merge($all_posts, $query->posts); // posts are stored in the `posts` property
    restore_current_blog(); // FYI: this tends to slow things down
}

この場合、手動でWP_Queryオブジェクトを作成するのではなく、get_postsを使用するだけのほうが賢明です。結果の配列だけが必要です。これがget_postsの動作です。もちろん、背後でWP_Queryを使用しています。

<?php
// fetch blogs here
$all_posts = array()
foreach($blogs as $b)
{
    switch_to_blog($b->blog_id);
    $posts = get_posts(/* your args here */);
    if($posts)
        $all_posts = array_merge($all_posts, $posts);
    restore_current_blog();
}

get_post_metaのような関数は、最後に投稿をループするときには期待通りには動作しないことに注意する必要があります - あなたはほとんど各投稿オブジェクトを操作することができるだけです。

3
chrisguitarguy