【WordPress】ページネーションをAjaxで非同期読み込みにする方法

【WordPress】ページネーションをAjaxで非同期読み込みにする方法 WordPress

WordPressで投稿一覧などを表示する際、通常のページネーションはページの再読み込みが発生します。しかし、ユーザー体験を向上させたい場合、Ajaxを使って非同期で次ページの投稿を読み込む方法が効果的です。本記事では、Ajaxによるページネーションの実装手順を詳しく解説します。

スポンサーリンク

Ajaxページネーションの概要とメリット

Ajaxページネーションとは、ユーザーが「次へ」などのページリンクをクリックしたときに、画面全体を再読み込みするのではなく、一部だけ(投稿一覧など)を非同期で読み込む仕組みです。

これにより、

  • ページ遷移がスムーズになる
  • サイト全体の読み込み負荷を軽減できる
  • UIがモダンに感じられる

基本的なページネーションの実装方法自体は、プラグインなしでページネーションを実装する方法で解説しています。本記事はその上に非同期読み込みを追加する内容です。

HTML構造と初期ループの準備

まず、投稿一覧とページネーションを含む基本構造を作成します。

投稿一覧とページネーションの出力
<div id="ajax-post-list">
<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
  'post_type' => 'post',
  'paged' => $paged,
  'posts_per_page' => 5,
);
$query = new WP_Query($args);

if ($query->have_posts()) :
  while ($query->have_posts()) : $query->the_post();
    echo '<article><h2>' . get_the_title() . '</h2></article>';
  endwhile;

  echo '<div class="pagination">';
  echo paginate_links(array(
    'total' => $query->max_num_pages,
    'current' => $paged,
    'format' => '?paged=%#%',
    'prev_text' => '« 前へ',
    'next_text' => '次へ »',
  ));
  echo '</div>';
endif;
wp_reset_postdata();
?>
</div>

JavaScriptによるAjax処理の追加

次に、クリックイベントをフックしてAjax通信を行うJavaScriptを設置します。同一ページのURL(?paged=2など)をそのまま取得し、レスポンスHTMLから#ajax-post-list部分だけを抜き出して差し替える方式です。

ページネーションクリックをAjax化
jQuery(document).ready(function ($) {
  $(document).on('click', '.pagination a', function (e) {
    e.preventDefault();
    const link = $(this).attr('href');

    $('#ajax-post-list').append('<div class="loading">読み込み中...</div>');

    $.ajax({
      url: link,
      type: 'GET',
      success: function (res) {
        const newPosts = $(res).find('#ajax-post-list').html();
        $('#ajax-post-list').html(newPosts);
      },
    });
  });
});

$(document).on('click', '.pagination a', ...)のようにイベントデリゲーションを使っているため、Ajaxで新しく挿入されたページネーションリンクに対しても、再度イベントを登録し直すことなくクリックが機能します。

functions.phpでAjax用のスクリプトを読み込む

先ほどのJavaScriptは、テーマのfunctions.phpで読み込むように設定します。

functions.php:スクリプトの読み込み
function enqueue_ajax_pagination_scripts() {
  wp_enqueue_script('ajax-pagination', get_stylesheet_directory_uri() . '/js/ajax-pagination.js', array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'enqueue_ajax_pagination_scripts');
get_template_directory_uri() は親テーマのURLを返す
get_template_directory_uri()親テーマのディレクトリURLを返す関数です。子テーマ環境でJSファイルを子テーマ側に置くと、URLが親テーマを指してしまい404になります。子テーマのURLを正しく取得するにはget_stylesheet_directory_uri()を使ってください。

注意点:URLの履歴とSEO

Ajaxによるページ切り替えはURLが変わらないため、ブラウザの戻るボタンで操作できなかったり、Googleにクロールされない可能性があります。これを解決するには、

  • history.pushState()でURLを書き換える
  • <noscript>タグで通常のページネーションも設置しておく

などの工夫が必要です。

よくある質問(FAQ)

QページネーションをAjaxで実装する基本的な流れは?
A「次のページ」リンクのクリックをJavaScriptでインターセプトし、Ajaxリクエストを送信します。本記事のように同一ページURLをそのまま取得してHTMLの一部を差し替える方式のほか、wp.ajax.post()でadmin-ajax.php経由のPHPハンドラーからWP_Queryのpagedパラメーターに応じた記事一覧HTMLを返す方式もあります。
QAjax読み込み中のローディングスピナーを表示するには?
AAjaxリクエスト前にスピナー要素を表示し(.spinner.show())、完了コールバックで非表示にします(.spinner.hide())。WordPressの管理画面用スピナーCSSクラス(.spinner)はフロントでも使えます。
QAjax非同期ページネーションでURLとブラウザ履歴を更新するには?
Ahistory.pushState()でURLを書き換え、popstateイベントでブラウザの戻る/進むに対応します。URLにページ番号(?paged=2等)を含めることで直接URLアクセスでも正しいページが表示されます。

まとめ

Ajaxによる非同期ページネーションは、WordPressサイトのUXを向上させる手段として非常に有効です。本記事で紹介した方法は、比較的シンプルな構成で実現可能なので、ぜひ導入を検討してみてください。

ご希望があれば、カスタム投稿タイプ対応やURL書き換え対応など、より高度な実装も紹介できます。