補完エンジン
SearchWPでは、それぞれ個別の設定を持つ任意の数のエンジンをセットアップできます。このセグメンテーションにより、サイト全体で検索を複数カスタマイズして実装することが容易になります。
デフォルトエンジンの唯一の制限は、そのソースがWP_Postオブジェクトに基づいている必要があることです。これは、WordPressコアが検索結果をループに適合すると想定しており、ループはWP_Postで構成されているためです。WP_Postオブジェクトは、投稿、ページ、メディア、カスタム投稿タイプに使用されます。これでかなりの部分をカバーできます!
SearchWPはカスタムソースの検索も容易にしますが、その利点を最大限に活用するには、補足エンジンのセットアップと実装が必要です。
セットアップ
補足エンジンのセットアップは、デフォルトのエンジンと同じプロセスに従いますが、この場合、WP_Postに基づいたものだけでなく、すべてのソースが利用可能になります。
SearchWP設定画面の「エンジン」タブにある「新規追加」ボタンをクリックして、新しい補足エンジンを作成します。
新しいエンジンが追加されたら、ソース、属性、およびルールをお好みに合わせてカスタマイズできます。
エンジンを保存した後、SearchWPはインデックスの再構築が必要かどうかを評価し、必要な場合は通知を表示します。
最後のセットアップステップは、エンジン名をメモすることです。これはラベルとは異なります。名はエンジンのラベルの横に等幅フォントで表示されます。名は、後でコードでエンジンを参照する方法です。
フォーム
補足エンジンの検索フォームのセットアップには、sとは異なる名を持つ<input>を作成することが含まれます。なぜなら、その名はネイティブ WordPress検索をトリガーするからです。
まず、このようなものが機能します。
| <form role="search" method="get" class="search-form" | |
| action="<?php echo site_url( 'search-results/' ); ?>"> | |
| <label> | |
| <span class="screen-reader-text"> | |
| <?php echo _x( 'Search for:', 'label' ) ?> | |
| </span> | |
| <input type="search" class="search-field" | |
| name="searchwp" | |
| placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>" | |
| value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>" | |
| title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" /> | |
| </label> | |
| <input type="submit" class="search-submit" | |
| value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" /> | |
| </form> |
このスニペットについて注意すべき点は2つあります。
- 使用されている
<input>名はsearchwpです formactionはsite_url( 'search-results/' )を指しています。これは、サイトURLがexample.comの場合、送信時にこのフォームはexample.com/search-results/にリダイレクトされることを意味します。このガイドでは、URLが補足エンジンの結果を表示する目的で作成したページを指していることを前提としています。
以上です!このスターターフォームは、WordPressのget_search_form()のデフォルト出力と密接に連携しており、おそらくお使いのテーマでもサポートされています。サポートされていない場合は、サイトの他のformと同様にスタイルを設定できます。
結果
検索formを作成する際、結果を表示するページとして指定されたURLを指すactionがあります。SearchWPから結果を取得するには、まずカスタムページテンプレートを作成します。
ここでは、作業できるスターターテンプレートを紹介します。
| <?php | |
| /* Template Name: SearchWP Results */ | |
| global $post; | |
| // Retrieve applicable query parameters. | |
| $search_query = isset( $_GET['searchwp'] ) ? sanitize_text_field( $_GET['searchwp'] ) : null; | |
| $search_page = isset( $_GET['swppg'] ) ? absint( $_GET['swppg'] ) : 1; | |
| // Perform the search. | |
| $search_results = []; | |
| $search_pagination = ''; | |
| if ( ! empty( $search_query ) && class_exists( '\\SearchWP\\Query' ) ) { | |
| $searchwp_query = new \SearchWP\Query( $search_query, [ | |
| 'engine' => 'supplemental', // The Engine name. | |
| 'fields' => 'all', // Load proper native objects of each result. | |
| 'page' => $search_page, | |
| ] ); | |
| $search_results = $searchwp_query->get_results(); | |
| $search_pagination = paginate_links( array( | |
| 'format' => '?swppg=%#%', | |
| 'current' => $search_page, | |
| 'total' => $searchwp_query->max_num_pages, | |
| ) ); | |
| } | |
| get_header(); ?> | |
| <div id="primary" class="content-area"> | |
| <main id="main" class="site-main" role="main"> | |
| <header class="page-header"> | |
| <h1 class="page-title"> | |
| <?php if ( ! empty( $search_query ) ) : ?> | |
| <?php printf( __( 'Search Results for: %s' ), esc_html( $search_query ) ); ?> | |
| <?php else : ?> | |
| SearchWP Supplemental Search | |
| <?php endif; ?> | |
| </h1> | |
| <!-- BEGIN Supplemental Engine Search form --> | |
| <form role="search" method="get" class="search-form" | |
| action="<?php echo site_url( 'search-results/' ); ?>"> | |
| <label> | |
| <span class="screen-reader-text"> | |
| <?php echo _x( 'Search for:', 'label' ) ?> | |
| </span> | |
| <input type="search" class="search-field" | |
| name="searchwp" | |
| placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>" | |
| value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>" | |
| title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" /> | |
| </label> | |
| <input type="submit" class="search-submit" | |
| value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" /> | |
| </form> | |
| <!-- END Supplemental Engine Search form --> | |
| </header> | |
| <?php if ( ! empty( $search_query ) && ! empty( $search_results ) ) : ?> | |
| <?php foreach ( $search_results as $search_result ) : ?> | |
| <article class="page hentry search-result"> | |
| <?php | |
| switch( get_class( $search_result ) ) { | |
| case 'WP_Post': | |
| $post = $search_result; | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a> | |
| </h2></header> | |
| <div class="entry-summary"><?php the_excerpt(); ?></div> | |
| <?php | |
| wp_reset_postdata(); | |
| break; | |
| case 'WP_User': | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_author_posts_url( $search_result->data->ID ); ?>"> | |
| <?php echo esc_html( $search_result->data->display_name ); ?> | |
| </a> | |
| </h2></header> | |
| <div class="entry-summary"> | |
| <?php echo wp_kses_post( get_the_author_meta( 'description', | |
| $search_result->data->ID ) ); ?> | |
| </div> | |
| <?php | |
| break; | |
| case 'WP_Term': | |
| ?> | |
| <header class="entry-header"> | |
| <h2 class="entry-title"> | |
| <a href="<?php echo get_term_link( $search_result->term_id, $search_result->taxonomy ); ?>"> | |
| <?php echo esc_html( $search_result->name ); ?> | |
| </a> | |
| </h2> | |
| <div class="entry-summary"> | |
| <?php echo esc_html( $search_result->description ); ?> | |
| </div> | |
| </header> | |
| <?php | |
| break; | |
| } | |
| ?> | |
| </article> | |
| <?php endforeach; ?> | |
| <?php if ( $searchwp_query->max_num_pages > 1 ) : ?> | |
| <div class="navigation pagination" role="navigation"> | |
| <h2 class="screen-reader-text">Results navigation</h2> | |
| <div class="nav-links"><?php echo wp_kses_post( $search_pagination ); ?></div> | |
| </div> | |
| <?php endif; ?> | |
| <?php elseif ( ! empty( $search_query ) ) : ?> | |
| <p>No results found, please search again.</p> | |
| <?php endif; ?> | |
| </main> <!-- .site-main --> | |
| </div> <!-- .content-area --> | |
| <?php get_footer(); ?> |
このスターターテンプレートを4つのセクションに分けましょう:
- 検索の実行
- 検索フォームの出力(再度)
- 結果の表示
- ページネーションの表示
7〜28行目は、検索クエリの取得、検索の実行、および結果配列の入力に責任があります。
44〜60行目は、上記で作成した検索フォームを出力します。
64〜94行目は、検索結果の出力に責任があります。
15行目では、\SearchWP\Queryに'all'を取得するように指示しました。これにより、\SearchWP\Sourceで設定されているように、結果が元のオブジェクトタイプ(例:WP_Post)として返されることが保証されます。
注意:デフォルトでは、\SearchWP\Queryは、各結果のid、source、site、およびrelevanceを含むオブジェクトを返します。fields引数を'all'に設定すると、\SearchWP\Queryはその結果をソース自体のネイティブオブジェクトに置き換えるように指示します。あるいは、fields引数を'entries'に設定すると、\SearchWP\Entryオブジェクトの配列が返されます。
つまり、投稿、ページ、カスタム投稿タイプ、メディアは、元のWP_Postオブジェクトとして返されます。ユーザーはWP_Userオブジェクトとして返されます。追加のソースもネイティブオブジェクトを返します。
ループで作業する場合とは異なり、補足エンジンで作業する場合、データを一切出力する前に、結果のタイプを判断する必要があります。
この例ではswitchを使用しています。このデモエンジンには投稿、ページ、ユーザーのみがソースとして含まれているため、これはうまく機能します。
注意:検索結果で返される最小限のデータのみが必要な場合は、fields引数を完全に省略できます。その場合、結果を表示するために必要なデータを取得するには、結果のオブジェクトプロパティを使用する必要があります。


