検索結果をテンプレート別に作りたい
-
日本語ページと英語ページを実装しています。
どのように実装したのかによるので、条件次第ですが、
検索結果ごとにテンプレートを当てるのは可能でしょうか。
は可能です。
Plugin API/Filter Reference/template include
をご覧ください。
kjmtshさん、ご返信ありがとうございます。
ちょっとこちらを調べてみます。add_filter( ‘template_include’, ‘portfolio_page_template’, 99 );
function portfolio_page_template( $template ) {
if ( is_page( ‘portfolio’ ) ) {
$new_template = locate_template( array( ‘portfolio-page-template.php’ ) );
if ( ” != $new_template ) {
return $new_template ;
}
}
return $template;
}こちらを利用するという事ですね?
はい、その通りです。デフォルトで使われるテンプレートを変更します。このフィルタ自体の条件は、「WP_USE_THEMES 定数が true になっている」ということのなので、コアをいじっていない限り動作します。
併せて、
テンプレート階層(日本語)
および、
Template Hierarchy(英語、最後にExampleがあります)
をご覧になると、理解しながら進めることができると思います。Good luck.
やはりそうですか。
固定ページということで、プラグインで言語を分けているのではないと想像したのですが、各投稿に言語データを持たせていたりするんでしょうか? あまり言えない部分もあるでしょうが、状況がわかれば、またお手伝いできるかもしれません。
kjmtshさん、ご返信ありがとうございます。
英語日本語のページはheader.phpとfooter.phpを二つ用意して、個別ページ作成時にテンプレートから選び、普通に入力して作成している状況です。
こんな説明で理解できますでしょうか。
つたない説明で申し訳ありません3つほど、疑問な点があります。
- サイトを訪れたユーザを英語ページと日本語ページに振り分けると思うのですが、これはどのようにしていますか? つまり、英語を読みたい訪問者と日本語を読みたい訪問者、それぞれをどのように判別しているのでしょう?
- 英語ページで検索した場合と、日本語ページで検索した場合とでは、検索結果に違いが出ますか? それとも、同じ単語を検索したら、同じ結果になりますか?
- 検索テンプレートを分ける目的は何ですか?
場合によっては、上のコードサンプルは使わなくてもいいかもしれませんね。
kjmtshさま
ご返信ありがとうございます
1.サイトを訪れたユーザを英語ページと日本語ページに振り分けると思うのですが、これはどのようにしていますか?
>>こちらは英語版を通常トップにしておりまして、日本語ページへはリンクボタンによってユーザの意思で移動してもらっています。自動振り分け等はありません。日本語から英語に戻る際にも同様です。2.英語ページで検索した場合と、日本語ページで検索した場合とでは、検索結果に違いが出ますか? それとも、同じ単語を検索したら、同じ結果になりますか?
>>同じ結果で良いとの事です。検索結果に多言語の内容が表示されても問題はありません。3.検索テンプレートを分ける目的は何ですか?
>>お客さんの要望です。テンプレートを英語ページにした場合、
日本語のページで検索をしたのに、検索結果のみ英語のテンプレートになるのがどうしても親切で無いのでいやだと言われております。
検索結果ページを統一の別デザインで提案しましたが却下されてしまったので、今回の要望になりました。質問の回答になっておりますでしょうか。
全然関係ありませんが、僕も同色のストラトを持っております。プロフ写真、クラプトンが弾くスタイルに似ていますね。条件:
- 英語がデフォルトである。
- 日本語ページでの検索と英語ページでのそれを判定するのは、ページタイトルや本文、スラッグなどしかない。
- 日本語メニューやタイトルなどが出せればよい。
2. から考えると、検索ボタンがクリックされた後は、英語か日本語かの情報がどこにもないですね。
これはちょっと面倒かも、です。REFERER を調べるとしても、日本語ページが複数あったら、そのデータを保持しておく必要があります。この場合、データベースから条件を指定して動的に日本語ページだけのスラッグを得る手段はないでしょう。もちろん、スラッグの文字を判別すればできなくはないですが、日本語ページで products のようなスラッグが使われたら意味がありませんし、いちいちアクセスするのはもっと嫌ですよね。
とりあえず、こんなので、動きますかねぇ? 完全一致で判定なので、使われているスラッグを正確に指定する必要があります(日本語ページのスラッグが全部 -ja とかなってたりしませんかね?)。テンプレートが見つからない場合の処理は省略しました。
固定ページが何十ページもあったり、投稿もあったりするという条件なら、設計を見直した方がいいと思いますが… サンプルコードを利用しましたけど、ここでは判定条件が全てなので、検索テンプレートで場合分けをしてもいいと思います。自分では試してません。
add_filter('template_include', 'replace_search_template', 99); function replace_search_template($template) { $ja_slugs = array('日本語ページスラッグ1', '日本語ページスラッグ2', ...); $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; if ($referer == '') return $template; $referer = rtrim($referer, '/'); $splitted_arr = preg_split('/\\//', $referer, -1); $from_page_slug = array_pop($splitted_arr); if (is_search() && in_array(urldecode($from_page_slug), $ja_slugs)) { $new_template = locate_template( array('日本語検索テンプレート')); return $new_template; } return $template; }
/* ストラトは娘のを借りて弾いてます 🙂 */
kjmtshさん、何度もありがとうございます。
上記を参考にして少数ページで試しています。
動きそうな感じですが、固定ページが数十あるので、kjmtshさんの言うとおり設計を見直すのが良いのかもしれません。とても参考になっております。
ありがとうございます。固定ページが数十あるので…
ページが増えるごとにしこしこ配列に追記する姿を想像して、ちょっと申し訳なく思ってしまいました。動いても、仕事を増やすコードはよくないです。ということで、アイディアだけの別解です。
英語日本語のページはheader.phpとfooter.phpを二つ用意して…
とあるので、日本語ページの header.php にグローバル変数か定数を1つ追加できませんか? $lang=’ja’ みたいな感じです。これを flag として、検索フォームの hidden フィールドから飛ばし、関数でそれを受けて、場合わけをするというのはどうでしょう? 流れは次のようになります。
header.php で、
$lang = 'ja';
search_form で、
<input type="hidden" name="lang" value="$lang" />
function で、
if (is_search() && isset($_GET['lang']) && $_GET['lang'] == 'ja') 日本語処理 リターン else デフォルト リターン
- トピック「検索結果をテンプレート別に作りたい」には新たに返信することはできません。