Wordpressのマルチサイト全体で検索できるようにする

Wordpressでマルチサイト化した場合、マルチサイト全体から該当文字列を含む投稿を取得する機能がなかった用なので関数を作成した。

まずは、検索キーワードを取得するためにsearch.phpに
[php]
// 検索クエリを取得
$search_result = get_search_query();
// マルチサイト内を検索
$search_results = search_multisite($search_result);
[/php]

で、実際に検索を行う関数。

[php]
function search_multisite($query_string) {
// 文字列エンコード
$query_string = esc_attr($query_string);
$search_result = array();

// ネットワーク上のブログを取得
$blogs = get_blogs_of_user( 1, true);
foreach ( $blogs as $blog ):
  // ブログを切り替える
  switch_to_blog($blog->userblog_id);
  // 切り替えたブログでqueryを実行
  $search = new WP_Query( array( 's' => $query_string ) );

  if ($search->found_posts > 0):
    foreach ( $search->posts as $post ):
      // 投稿記事に関連するグローバル変数を設定する
      setup_postdata($post);
      array_push($search_result, $post);
    endforeach;
  endif;

endforeach;

return $search_result;

}
[/php]

get_blogs_of_user( 1, true); でネットワーク上のブログを取得して
switch_to_blog でブログを切り替えて、WP_Queryで検索クエリオブジェクトを渡すことでできました。

ただ、上記の方法は全てのブログを user_id=1 のユーザーが作成してるときに限られるので、もしこの条件が使えない場合は、ネットワーク上のブログを取得する関数を作成し、

[php]
// ネットワーク上のブログを取得
function get_blog_from_network($blog_id, $cache_clear_flag) {
// cacheをクリアする
if(false === $cache_clear_flag) wp_cache_delete(‘get_blog_from_network’);

// cacheがあればキャッシュから取得する
$blogs = wp_cache_get(‘get_blog_from_network’);
if ( false === $blogs ):
global $wpdb;
$query = "SELECT * FROM $wpdb->blogs ORDER BY blog_id";
$blogs = $wpdb->get_results( $wpdb->prepare($query));
wp_cache_add(‘get_blog_from_network’, $blogs);
endif;

if(!empty($blog_id)):
if(preg_match("/^[0-9]+$/", $blog_id)):
foreach ($blogs as $blog):
if($blog->blog_id == $blog_id) $result = $blog;
endforeach;
endif;

if(is_array($blog_id)):
  $result = array();
  for ($i= 0; $i < count($blog_id) ; $i++):
    foreach ($blogs as $blog):
      if(intval($blog->blog_id) == $blog_id[$i]) $result[] = $blog;
    endforeach;
  endfor;
endif;
return $result;

else:
return $blogs;
endif;
}

// マルチブログの検索
function search_multisite($query_string) {
// 文字列エンコード
$query_string = esc_attr($query_string);
$search_result = array();
// ネットワーク上のブログを取得
$blogs = get_blog_from_network();
foreach ( $blogs as $blog ):
// ブログを切り替える
switch_to_blog($blog->blog_id);
// 切り替えたブログでqueryを実行
$args = array(
‘s’ => $query_string
);
$search = new WP_Query($args);
if (intval($search->found_posts) > 0):
foreach ( $search->posts as $post ):
// 投稿記事に関連するグローバル変数を設定する
setup_postdata($post);
array_push($search_result, $post);
endforeach;
endif;
endforeach;
restore_current_blog();
return $search_result;
} [/php]

以下の情報が記事ごとに返却されます。
[php]
array (size=1)
0 =>
object(WP_Post)[4688]
public ‘ID’ => int 1
public ‘post_author’ => string ‘1’ (length=1)
public ‘post_date’ => string ‘2013-07-27 15:34:21’ (length=19)
public ‘post_date_gmt’ => string ‘2013-07-27 06:34:21’ (length=19)
public ‘post_content’ => string ‘記事’ (length=12)
public ‘post_title’ => string ‘タイトル’ (length=3)
public ‘post_excerpt’ => string ‘’ (length=0)
public ‘post_status’ => string ‘publish’ (length=7)
public ‘comment_status’ => string ‘open’ (length=4)
public ‘ping_status’ => string ‘open’ (length=4)
public ‘post_password’ => string ‘’ (length=0)
public ‘post_name’ => string ‘’ (length=27)
public ‘to_ping’ => string ‘’ (length=0)
public ‘pinged’ => string ‘’ (length=0)
public ‘post_modified’ => string ‘2013-07-27 17:28:51’ (length=19)
public ‘post_modified_gmt’ => string ‘2013-07-27 08:28:51’ (length=19)
public ‘post_content_filtered’ => string ‘’ (length=0)
public ‘post_parent’ => int 0
public ‘guid’ => string ‘http://localhost/?p=1' (length=22)
public ‘menu_order’ => int 0
public ‘post_type’ => string ‘post’ (length=4)
public ‘post_mime_type’ => string ‘’ (length=0)
public ‘comment_count’ => string ‘0’ (length=1)
public ‘filter’ => string ‘raw’ (length=3)
[/php]

あとは返却されたオブジェクトから必要な情報を取得してページを作成する感じでいいのかな。

Comments