【WordPress】IvorySearchプラグインー検索結果表示ページの実装

以下、作業用メモです。

Ivory Searchプラグインでは、「search」ボタンクリック後の遷移先URLを直接カスタマイズすることはできないーカスタマイズしたいならカスタム検索を実装する

Ivory Searchプラグインでは、検索ワードを入力して「search」ボタンをクリックした後の遷移先URLを直接カスタマイズすることはできません。そのようなカスタマイズが必要な場合は、独自のJavaScriptコードを使用してフォームの動作を変更する必要があります。

カスタム投稿タイプ用に search-blog.php のようなテンプレートファイルを作成して使用することは可能です。ただし、通常のWordPress検索機能ではカスタム投稿タイプ用の検索結果ページを独自に作成することは難しいです。代わりに、以下の手順でカスタム検索を実装することができます。

  1. カスタム投稿タイプ用の検索フォームを作成します。これは通常のWordPress検索フォームとは異なり、カスタム検索用のフォームです。
  2. カスタム検索フォームの送信先を、カスタム検索結果を表示するページに設定します。このページは search-blog.php のような名前のテンプレートファイルである必要があります。
  3. search-blog.php テンプレートファイルに、カスタム検索の結果を表示するためのコードを追加します。

以下は、カスタム検索フォームの例です。

<form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( '/blog-search/' ) ); ?>">
    <div>
        <label for="s">Search for:</label>
        <input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" />
        <input type="hidden" name="post_type" value="blog" /> <!-- カスタム投稿タイプを指定 -->
        <input type="submit" id="searchsubmit" value="Search" />
    </div>
</form>

この例では、カスタム投稿タイプ blog 用の検索フォームを作成しています。検索結果は blog-search というURLに表示されます。そして、search-blog.php テンプレートファイルを作成して、その中でカスタム投稿タイプ blog 用の検索結果を表示します。

しかし、カスタム検索を実装するとSearch Meterプラグインとの互換性がなくなるおそれがある

カスタム検索を実装する場合、通常のWordPress検索機能とは異なるため、SearchMeterプラグインとの互換性が失われる可能性があります。SearchMeterプラグインがWP_Query()を使用した通常のWordPress検索機能と互換性がある場合、カスタム検索を実装することでそれらの機能が機能しなくなる可能性があります。

参考:検索履歴の集計機能をカスタム投稿タイプに実装するヒント

検索履歴の集計機能をカスタム投稿タイプに実装するには、いくつかの方法が考えられます。以下はその一例です。

  1. データベースにログを記録する: 検索が行われるたびに、検索ワードと検索日時をデータベースにログとして記録します。このログを使用して、検索履歴の集計を行います。WordPressの wpdb クラスを使用して、データベースへのログ記録を実装します。
  2. カスタムフィールドを使用する: カスタム投稿タイプに、検索ワードを保存するカスタムフィールドを追加します。検索が行われるたびに、検索ワードをこのカスタムフィールドに保存します。その後、保存された検索ワードを取得し、集計処理を行います。
  3. プラグインを使用する: WordPressのプラグインを使用して検索履歴の集計機能を実装します。SearchMeterプラグインなどがこの目的に使用できるかもしれません。これらのプラグインは、検索ログを記録し、検索履歴を集計する機能を提供します。

いずれの方法を選択するにしても、実装の際にはデータの正確性とプライバシーに配慮する必要があります。また、データベースへのアクセスやパフォーマンスへの影響も考慮する必要があります。

WordPressが検索クエリをGETパラメータとして受け取り、それに基づいて検索結果を表示している

Ivory Searchプラグインを使用して検索を行った後、検索結果ページにドメインにパラメータが付加されるのは、通常のWordPressの挙動です。これは、WordPressがクエリパラメータを使用して検索結果を表示するために行うものです。

たとえば、検索後に表示されるURLが次のような形式になります。

http://example.com/?s=search+term

これは、WordPressが検索クエリをGETパラメータとして受け取り、それに基づいて検索結果を表示しているためです。

WordPressのカスタム投稿タイプや個別ページを使用している場合でも、検索後のURLは基本的に同じ形式を取ります。カスタム投稿タイプや個別ページを使用している場合でも、WordPressは検索結果を表示するためにクエリパラメータを使用します。

この挙動を変更するためには、カスタムなリダイレクトやURL操作の処理を実装する必要があります。これは、WordPressのループやリダイレクトのフィルターを使用して行うことができますが、複雑な処理が必要になる場合もありますので、慎重に対処する必要があります。

デフォルトの仕様でsearch.phpしか使用できないのなら、そのファイル内で条件分岐する

search.phpファイルを使用して、カスタム投稿タイプや個別ページによって異なるheaderfooterを表示することは可能です。また、条件分岐の中でget_header()関数を使用してカスタムヘッダーを読み込むことができます。

以下は、このような条件分岐をsearch.phpに実装する方法の例です。

<?php
// search.php内の適切な場所に以下のコードを追加します

if ( is_post_type_archive('blog') ) {
    get_header('blog'); // カスタムヘッダーを読み込みます
} else {
    get_header(); // デフォルトのヘッダーを読み込みます
}

// 検索結果の表示を行うコードを追加します

get_footer(); // フッターを読み込みます
?>

このように、is_post_type_archive('blog')関数を使用して、カスタム投稿タイプがblogの場合に特定のヘッダーを読み込むようにします。これにより、検索結果のページがblogカスタム投稿タイプのアーカイブページである場合に、異なるヘッダーが表示されるようになります。

search.phpのサンプルコード

<?php get_header(); ?>

<div id="primary" class="content-area">
    <main id="main" class="site-main">
        <header class="page-header">
            <h1 class="page-title"><?php printf( esc_html__( 'Search Results for: %s', 'text-domain' ), get_search_query() ); ?></h1>
        </header><!-- .page-header -->

        <?php if ( have_posts() ) : ?>
            <?php while ( have_posts() ) : the_post(); ?>
                <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <header class="entry-header">
                        <?php the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); ?>
                    </header><!-- .entry-header -->

                    <div class="entry-summary">
                        <?php the_excerpt(); ?>
                    </div><!-- .entry-summary -->
                </article><!-- #post-<?php the_ID(); ?> -->
            <?php endwhile; ?>

            <?php the_posts_navigation(); ?>

        <?php else : ?>
            <p><?php esc_html_e( 'No results found.', 'text-domain' ); ?></p>
        <?php endif; ?>
    </main><!-- #main -->
</div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

ちなみに、少しでも検索ワードを拾って検索結果を表示させたいなら、Ivory Searchプラグインの設定に注意

いくらタイトルのキーワードを叩いても検索結果が表示されなかったため、設定を見直し。

設定画面の左サイドにある「Options」から「Fuzzy Matching」のプルダウン項目を選択して、「AnyWhere」を選択すること。

確かデフォルトではこの設定になかっていなかったと思う。。。

この記事を書いた人