東京都練馬区。Wordpressはおまかせ。印刷・ホームページなど販売促進のためのデザインを提案します。

デザイン事務所ダウンアンダー

営業
10:00-
19:00

WPマルチサイトのグローバルサーチ

     2012/09/24   技術ノート   ,  野村貞次

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”;//ホスト名をhttp://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(); ?>
     2012/09/24   技術ノート   ,  野村貞次

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

 こちらの記事も読んで見ましょう

WPマルチサイトのグローバルサーチ 東京都練馬区。Wordpressはおまかせ。印刷・ホームページなど販売促進のためのデザインを提案します。

Copyright©デザイン事務所ダウンアンダー,2012 All Rights Reserved.

ページ先頭へ