全ブログをサイト内検索の対象にする[マルチサイト,WordPress]
WordPressマルチサイトの全てのブログをページ内検索の対象に含める方法を紹介します。search.phpにコードを書くという方法です。
まえがき
マルチサイトのWordPressの場合、デフォルトのページ内検索だと一つのブログしか検索対象に含まれません。
デフォルトのページ内検索はformタグのaction属性に指定されているURLのブログが検索対象となります。
しかし、WordPressをマルチサイトにしている場合は全てのブログを検索対象に含めたいことが結構あるはずです。
今回はマルチサイトの全ブログを検索対象に含める方法を紹介します。
search.php(検索結果ページ)にコードを追加する方法です。
全ブログを検索対象にするためsearch.phpを編集
search.phpのループ部分を下記のように修正します。
<div>検索キーワード '<?php echo get_search_query(); ?>'</div> <?php $query_string=esc_attr($query_string); $blogs = get_blogs_of_user(1); // 特権管理者のユーザーID foreach ( $blogs as $blog ): switch_to_blog($blog->userblog_id); $search = new WP_Query($query_string.'&showposts=-1'); if ($search->found_posts>0) { $nopost=false; foreach ( $search->posts as $post ) { setup_postdata($post); ?> <section> <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1> <div> <?php the_excerpt(); ?><br /> <a href="<?php the_permalink(); ?>" class="morebtn">続きを読む</a> </div> </section> <?php } } endforeach; if(!$nopost){ ?> <div>見つかりません。</div> <?php } restore_current_blog(); ?>
これだけで検索結果に全ブログの記事が表示されるようになります。簡単ですね!
解説していきます。
まず、2行目の「get_blogs_of_user(1)」でユーザーIDが「1」つまり特権管理者がアクセス権限を持っているブログの情報を取得しています。
ということは要するに「get_blogs_of_user(1)」で全てのブログの情報を取得しています!
その情報をもとに「switch_to_blog()」で各ブログの検索結果をループで表示しています。
出力ループ内に「$nopost」という変数を用意して、検索結果が無い場合は「$nopost」を参照して「見つかりません。」と表示されるようにしています。
マークアップはもちろん各々変えてくださいね。
全ブログを検索対象にした場合、ページ送りを表示させることが非常に難しい
上のコードで何でループのクエリに「’showposts=-1’」を入れているか。
これは上で紹介した方法で全ブログを検索対象にした場合
ページ送り機能は難易度が高すぎて付けれないからです笑
少なくともKoToRiのチンケなプログラムスキルでは敷居が高すぎます。
そもそも上で紹介した方法はブログ毎にforeachで該当する記事をループ出力しているという形なのでブログの数だけループが増えます。
そうなると、「一つのループに対してのページ送り」というデフォルトのWordPressのページ送りではロジックが噛み合いません。
なので早々に諦めると同時に何かいい方法が無いか誰かが手を差し伸べてくれるその日まで「’showposts=-1’」で全記事を表示させておきたいと思います。
まとめ
search.phpにコードを記述するだけというのは最初驚きましたが、よくよく考えると納得です。出力条件を決定しているのはsearch.phpのクエリですもんね。
しかし、心残りはやはり「ページ送り」でしょう。
本当にいい方法をご存じの方は教えていただきたいです。
お願いします。
KoToRiも何かいい方法を発見したら記事にしたいと思います。