WPマルチサイトのグローバルサーチ
この記事は2012/04/16に公開され2012/09/24に更新、698回読まれました。
WordPressのマルチサイトを作成したところ、サイト全体から検索(グローバルサーチ)することが標準ではできません。
プラグインも現在は動作するものが配布されていないようです。
一般的な解決策としては
- ブログIDをすべて取得。
- switch_to_blog()で各ブログに切り替え。
- 必要な情報(検索結果や最新記事等)を取得。
という手法が掲載されていますが、どうもswitch_to_blog()はたいへんペナルティが大きいらしく、サーバによってはハングアップしてしまいます。
また、当社で作成した子サイトが170あるサイトでは、正常に結果を取得することができませんでした。
そこで、データベースを直接触ってみることにしました。
- 記事はwp_postsテーブルに格納されている。
- 子サイトではwp_xx_postsという名前になっている。
- サイト名等はwp_optionsテーブルに格納されている。
- 子サイトではwp_xx_optionsという名前になっている。
<!–// Change about each template //–>で囲まれた部分を、テーマのsearch.phpの該当部分に入力してください。
- <?php get_header(); ?>
- <!–// Change about each template //–>
- <?php
- global $wpdb;//mysqlのデータベース情報を格納しているグローバル変数$wpdbを使うには宣言が必要です。
- $searchfor = get_search_query(); // Get the search query for display in a headline
- $dbhost = “$wpdb->dbhost”;//ホスト名をhttps://d7r.com/といった形で取得します。
- $dbname=”$wpdb->dbname”;//データベース名を取得します。他にユーザ名が必要ですが、レンタルサーバではデータベース名=ユーザ名であることが一般的です。
- $dbpassword = “$wpdb->dbpassword”;//データベスパスワードを取得します。
- ?>
- <h2>「<?php echo $searchfor; ?>」の検索結果</h2>
- <?php
- $dbc=mysql_connect($dbhost,$dbname,$dbpassword) or die(“MySQL接続失敗 :”.mysql_error());
- $sdb = mysql_select_db($dbname,$dbc) or die(“データベースの選択に失敗しました。”);
- $sql=”SHOW TABLES FROM “.$dbname; //テーブル一覧を取得するSQL文を作成
- $res=mysql_query($sql,$dbc); //テーブル一覧を$resに格納
- if(!$res){
- echo “【データベースエラー】テーブルリストの取得に失敗しました<br />\n”;
- echo “MySQL Error: “.mysql_error();
- exit;
- }
- mysql_set_charset(‘utf8’); //dbの文字コードを指定
- while($dat=mysql_fetch_row($res)){ //$datにテーブルを格納するループ
- if( preg_match(“/_options/”,$dat[0]) ) { //optionsテーブル
- if( !preg_match(“/v_options/”,$dat[0]) ) {
- $searchquery_siteurl = “SELECT * FROM ” .$dat[0]. ” WHERE option_name = ‘siteurl’ “; //siteurlを取得するループ
- $result_siteurl = mysql_query($searchquery_siteurl);
- if (!$result_siteurl) {
- die(‘クエリーが失敗しました。1’.mysql_error());
- }
- while ($row_siteurl = mysql_fetch_assoc($result_siteurl)) {
- $siteurl = $row_siteurl[‘option_value’]; //$siteurlは検索結果のリンクに使用
- }
- }
- }
- if( preg_match(“/_posts/”,$dat[0]) ) { //postsテーブルループ
- if( !preg_match(“/v_posts/”,$dat[0]) ) {
- $searchquery_posts = “SELECT * FROM ” .$dat[0]. ” WHERE post_status = ‘publish’ && post_content LIKE ‘%” .$searchfor. “%'”;
- $result_posts = mysql_query($searchquery_posts);
- if (!$result_posts) {
- die(‘クエリーが失敗しました。3’.mysql_error());
- }
- }
- }
- while ($row = mysql_fetch_assoc($result_posts)) {//検索結果を表示するHTMLを出力
- echo “<div class=’searchlink’><a href='”;
- print($siteurl);
- echo “?page_id=”;
- print($row[‘ID’]);
- echo “‘>「”;
- print($row[‘post_title’]);
- echo “」</a></div>”;
- print(mb_substr(strip_tags($row[‘post_content’]),0,200));//contentからHTMLタグを取り除き200文字のみ表示
- echo “<br />\n”;
- }
- }
- mysql_free_result($res);
- ?>
- <!–// Change about each template //–>
- </div><!– #content–>
- <?php get_sidebar(); ?>
- <?php get_footer(); ?>