Cocoonフォーラム

サイト内検索
書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示高速化を無効にしてください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法
  7. ブラウザ環境チェックツール
  8. Cocoonカスタマイズ依頼

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

ページ内検索を実装したい
 
共有:
通知
すべてクリア

[解決済] ページ内検索を実装したい

13 投稿
4 ユーザー
14 Reactions
255 表示
(@kobat)
Trusted Member Registered
結合: 2年前
投稿: 37
トピックスターター  

tozankai.comのページの中に大きな表がありまして、ワードにある検索機能の様なものを実装したいと希望しています。例えば山の名前とか駅名で検索して、検索された文字がマーカーされたような表示にしたいと思っています。サイト内検索はウイジェットのサイドバーに実装していますが、検索に入れた文字があるページしか表示されていなくて目的の文字までたどり着けません。それよりページ内の検索を実装したい。


   
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3161
 

●回答

この要望は不可能です。Cocoonだからではありません。

ブラウザ上では単なる文面に見えても、実際にはHTMLコードでページが構成されています。
検索キーに該当する文字列をハイライト表示させるには、<span>タグを追加する必要があります。

しかし、ページは複数のHTMLコードで構成されているため、単純に検索キーを<span>で囲むだけでは問題が発生します。

例えば、次のようなコードがあった場合

<span class="red">この文字は赤色</span>

このような構造の中で「class」というキーワードを検索してハイライトしようとすると、次のようにネストされた不正なタグ構造が生成されてしまいます。

<span <span>class</span>=red>この文字は赤色</span>

結果として、レイアウトが崩れ、ページが正しく表示されなくなる可能性があります。

このため、ページ内の検索は、一般的にブラウザの検索機能(Ctrl + Fなど)を使い、再度検索キーを入力して該当部分を探すことになります。

また、ネット掲載されているキーワード検索結果のハイライトは、主にカードのスニペットが対象となっています。
これは、スニペットが通常、HTMLタグを含まず、単なる文字列で構成されているため、タグの追加による問題が発生しないからです。


   
kobat reacted
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3161
 

●ご参考

上記のことから、検索キーワードにコードを指定した場合、レイアウトが崩れます。
キーを全角を必ず含む文字列とか限定すれば可能かも笑笑

// Cocoonテーマの 'entry-card' テンプレートに検索クエリ 's' を追加するフィルター
add_filter('cocoon_part__tmp/entry-card', function($content) {
  // 検索クエリ 's' を取得
  $search_query = isset($_GET['s']) ? $_GET['s'] : '';

  // 正規表現で<a href="URL">部分に?s=検索クエリを追加
  $content = preg_replace(
    '/(<a\s+href="[^"]+)"/i',
    '$1?s=' . urlencode($search_query) . '"',
    $content
  );
  
  return $content;
});


// 検索クエリを 'the_content' 内でハイライトする関数
add_filter('the_content', function($content) {
  // 検索クエリ 's' を取得し、空でない場合に処理
  if (isset($_GET['s']) && !empty($_GET['s'])) {
    $search_query = sanitize_text_field($_GET['s']);

    // 検索クエリをハイライト用の <span> タグで囲む
    $highlighted = '<span class="highlight" style="background-color: yellow;">' . esc_html($search_query) . '</span>';
    
    // 正規表現で、検索クエリに一致する部分をハイライト (大文字・小文字を無視して検索)
    $content = preg_replace('/(' . preg_quote($search_query, '/') . ')/iu', $highlighted, $content);
  }
  
  return $content;
}, 99);
 
●ブラウザで検索

   
kobat reacted
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3161
 

●改善

検索キーが全角のみのとき、ページ内検索のキーを渡す。

// Cocoonテーマの 'entry-card' テンプレートに検索クエリ 's' を追加するフィルター
add_filter('cocoon_part__tmp/entry-card', function($content) {
  // 検索クエリ 's' を取得
  $search_query = isset($_GET['s']) ? $_GET['s'] : '';

  // 検索クエリが全角文字のみの場合
  if (preg_match('/^[^\x01-\x7E]+$/u', $search_query)) {
    // 正規表現で<a href="URL">部分に?s=検索クエリを追加
    $content = preg_replace(
      '/(<a\s+href="[^"]+)"/i',
      '$1?s=' . urlencode($search_query) . '"',
      $content
    );
  }
  
  return $content;
});

   
kobat reacted
はる
(@haruinoue)
Noble Member Moderator
結合: 4年前
投稿: 1090
 

特定の文字列部分をハイライトするライブラリを調べてみたらmark.jsというがありました。

https://qiita.com/gp333/items/c5831f1b966895979cca

上記ライブラリを使えば多少楽できそうですが、依然実装は結構大変そうです。

要望カテゴリへの投稿ですが、テーマの機能として実装するにはニッチなのかなぁと思いました。

技術的に不可能とまでは言えませんが、結構大規模な開発が必要そうです。


   
kobat reacted
(@kobat)
Trusted Member Registered
結合: 2年前
投稿: 37
トピックスターター  

短時間にこのような詳細のご教授、心から感謝いたします。シニア(私は80歳ジャストです)にとってこのフォーラムはホームページ制作に大変有意義で、大変勉強になります。サイトのページ検索は難しいと思っていましたが、私の能力以上でした。でもチャレンジしたいと思います。教えて頂いたことを実際にやってみます。幸い、さくらサーバーはステージングサーバーがありますので、色々弄繰り回してみます。有難うございます。


   
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3161
 

投稿者:: @kobat

でもチャレンジしたいと思います。

恐れ入りますが、フォーラムの注意書きにも記載されている通り、本来、PHPやJavaScriptに関する質問にはお答えできません。ご自身で、調べ対応願います。
また本件ですが、業者に依頼し有償にて対応するレベルの要望かと思います。その点はご理解ください。


●改善版

はるさんの言われる「mark.js」にハイライト表示を任せてみました。単なる私の興味本位です。
前述のような問題は解決されたかと思います。

ただ確認不十分です。

// Cocoonテーマの 'entry-card' テンプレートに検索クエリ 's' を追加するフィルター
add_filter('cocoon_part__tmp/entry-card', function($content) {
  // 検索クエリ 's' を取得
  $search_query = isset($_GET['s']) ? $_GET['s'] : '';

  // 検索クエリをエスケープ処理
  $escaped_search_query = esc_attr($search_query);

  // ?s=検索クエリを追加するための部分を構築
  $query_string = $search_query ? '?s=' . urlencode($escaped_search_query) : '';

  // 正規表現で<a href="URL">部分に検索クエリを追加
  $content = preg_replace(
    '/(<a\s+href="[^"]+)"/i',
    '$1' . $query_string . '"',
    $content
  );
  
  return $content;
});

add_action('wp_footer', function() {
  if (isset($_GET['s']) && !empty($_GET['s'])) {
    $search_query = sanitize_text_field($_GET['s']);
    echo <<<EOF
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js"></script>
<script>
let contexts = document.querySelector(".entry-content");
let instance = new Mark(contexts);
instance.mark("{$search_query}", {
  "element": "span",
  "className": "highlight"
});
</script>
<style>
.highlight {
  background-color: yellow;
}
</style>
EOF;

  }
});

   
わいひら and kobat reacted
(@kobat)
Trusted Member Registered
結合: 2年前
投稿: 37
トピックスターター  

ご親切に色々アイデアを頂き感謝いたします。html・cssやプラグインかなと気楽に考えPHPやJavaScriptに関する質問になっているとは分かっていませんでした。お詫び申し上げます。ページ内検索が大変難しい問題との認識を新たにしました。色々試しますが、当面はご教授の中に記載されているプラウサーの検索(chromaやedgeのctrl+f)で凌げます。

重ねて感謝申し上げます。


   
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 4年前
投稿: 8106
 

kobatさん

こちらの状況はいかがでしょうか。
このトピックは宙ぶらりんになっております。

「解決済」「クローズ」など、できるのであればしたいところです。


   
kobat reacted
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3161
 

@mk2_mk2 さん

本文はHTMLタグの集合体で、ハイライト表示のspanを追加するのには現実的ではありません。
このため、テーマ機能としてサポートは難しいです。
結果、本件はクローズかと思います。


   
kobat reacted
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 4年前
投稿: 8106
 

投稿者:: @chu-ya

テーマ機能としてサポートは難しいです。

はい、そう思っています。
ただ、「色々試す」とありましたので、一応ご本人のお返事をお待ちしようと思いました。
(もし進展があれば、その後の状況を書いていただくのも、フォーラムの活用にはなりますので)

基本的には、トピックをお立てになった方のご意向で判断したいと思っています。
あまり強制的にクローズということはしたくないという感じです。

一応、今回1週間という期限は設定させていただきましたので、それでクローズするつもりはあります。
(それ以前に、わいひらさんのご判断で・・・ということもありだと思いますけれど)


   
kobat reacted
(@kobat)
Trusted Member Registered
結合: 2年前
投稿: 37
トピックスターター  

ご返事したつもりになっていました。色々助かりました。今後も十宜しくお願い足します。


   
mk2 reacted
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 4年前
投稿: 8106
 

kobatさん

お返事ありがとうございます。
「解決済」にしていただきまましたので、クローズさせていただきますね。

お手数お掛けしました。


   
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

タイトルとURLをコピーしました