WP REST API で非同期キーワード検索を実装する方法

WordPressのWP REST APIを活用すると、キーワード検索を非同期で行い、検索結果をリアルタイムで表示することができます。これにより、ユーザーはページをリロードすることなくスムーズに検索結果を確認できるようになります。今回は、非同期検索の実装方法についてまとめていきたいと思います。

WP REST API を使うメリット

WP REST API を活用した非同期検索には、以下のメリットがあります。

  • ページのリロードが不要 → ユーザーの操作がスムーズになる。
  • 検索の速度向上 → すべての検索結果を事前にロードする必要がない。
  • カスタマイズが容易 → カテゴリ別検索や投稿タイプの指定が可能。

どのような状況で活用できるか?

WP REST API を使った非同期検索は、以下のようなケースで有効です。

  • リアルタイムで投稿を検索したい場合 → ユーザーが検索フィールドに入力すると即座に結果を表示します。
  • Ajax を活用した検索機能を追加したい場合 → 検索ボタンを押すのではなく、文字を入力するだけで結果を取得できます。
  • カスタム投稿タイプ(例: 商品・レビュー)の検索に対応したい場合 → 投稿タイプやカテゴリを指定した高度な検索が可能です。

非同期検索の実装

WordPress のエンドポイントを確認

WP REST API のデフォルトの検索エンドポイントは以下のとおりです。

JavaScript
https://example.com/wp-json/wp/v2/posts?search=キーワード

このエンドポイントを JavaScript のfetch()を使って呼び出し、検索結果を取得します。

JavaScript(Ajax)で非同期検索を実装

JavaScript
document.getElementById('search-input').addEventListener('input', async function() {
    const query = this.value.trim();
    if (query.length < 2) return; // 2文字以上で検索実行

    const response = await fetch(`/wp-json/wp/v2/posts?search=${encodeURIComponent(query)}`);
    const posts = await response.json();

    const resultsContainer = document.getElementById('search-results');
    resultsContainer.innerHTML = ''; // 前の検索結果をクリア

    if (posts.length === 0) {
        resultsContainer.innerHTML = '<li>該当する記事がありません。</li>';
        return;
    }

    posts.forEach(post => {
        const li = document.createElement('li');
        li.innerHTML = `<a href="${post.link}">${post.title.rendered}</a>`;
        resultsContainer.appendChild(li);
    });
});
HTML
<input type="text" id="search-input" placeholder="検索..."> <!-- 検索フォーム -->
<ul id="search-results"></ul>

ユーザーが inputフィールドに文字を入力すると、入力が 2 文字以上のときに REST API へリクエストを送信します。取得した投稿の一覧を<ul>内に表示し、該当する記事がない場合は「該当する記事がありません」と表示されます。

カスタム投稿タイプの検索を実装

特定の投稿タイプ(例: product)を検索したい場合は、以下のように API のエンドポイントを変更します。

JavaScript
const response = await fetch(`/wp-json/wp/v2/product?search=${encodeURIComponent(query)}`);
  • product → 商品データを検索
  • event → イベント情報を検索

使用時の注意点

過剰なリクエストを防ぐ

  • ユーザーが1 文字入力するたびにリクエストを送ると負荷が高いため、 2文字以上で検索を実行しましょう。
  • debounce を使用し、入力後一定時間経過してから検索を実行するのもおすすめです。
HTML
let timer;
document.getElementById('search-input').addEventListener('input', function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
        searchFunction(this.value);
    }, 300); // 300ms 待機
});

API の認証が必要な場合

  • 公開ページの検索なら認証不要
  • 非公開データを検索する場合はJWTOAuthで認証が必要
JavaScript
const response = await fetch(`/wp-json/wp/v2/posts?search=${query}`, {
    headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' }
});

CORS設定を確認

他のドメインから API を呼び出す場合はCORS を許可する必要あります。

PHP
function allow_cors() {
    header("Access-Control-Allow-Origin: *");
}
add_action('rest_api_init', 'allow_cors');

コメントを残す

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