2020-08-24/2023-05-23

【WordPress】もっと見るボタン+都度読み込み

【WordPress】もっと見るボタン+都度読み込み

ブログから企業サイトなどいろいろなところで見られる「もっと見る」ボタンですが、基本手的にはあらかじめ要素を用意しておきその部分を表示する形です。

用意しておく項目が多い場合や同じページに複数ある場合には最初表示する項目だけ読み込みたいということがあるかもしれません。

そこで今回はWordpressでエンドポイントを追加することで都度読み込みのもっと見るボタンを作成したいと思います。

デモサイト

デモサイトを見たらわかるように記事一覧を「カテゴリー」「日付」「タイトル」で表示しています。

HTMLには入れ物だけ用意してあるだけです。

javascriptでエンドポイントへ接続を行い、投稿の情報を取得し、表示しています。

作成は大きく二つに分かれます。

  • エンドポイントの追加
  • エンドポイントからデータの取得

それでは作成していきます。

エンドポイントの追加

まずはエンドポイントの登録です。

「rest_api_init」にアクションフックを使用します。

登録には「register_rest_route」を使用します。

register_rest_route( $namespace, $route, $args, $override )

$namespace

名前空間を指定します。

$route

ベースURL名を指定します。

$args

GETやPOSTなどメソッドの指定やコールバック関数の指定を行います。

$override

すでに同じ名前のエンドポイントがあった場合に上書きするか指定します。

GETで取得する際の例が以下のようです。

add_action( 'rest_api_init', function() {
register_rest_route(
//ネームスペース
'sample',
//ベースURL
'/post-data',
//オプション
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'fetch_post_data'
)
);
} );
function fetch_post_data( $param ) {
return rest_response( 'fetch-post-data', $param );
}
function rest_response( $file_name, $param = null ) {
$api_file = locate_template( "api/${file_name}.php" );
$res = !empty( $api_file ) ? include_once $api_file : [];
$response = new WP_REST_Response( $res );
$response->set_status( 200 );
return $response;
}

コードみたらわかるようにapi内のファイルの読み込みを行っています。

読み込むファイルにはエンドポイントで取得したい情報をセットし、配列で返します。

今回は投稿一覧を新しい順に「タイトル」「カテゴリー」「日付」取得できるようにしてみました。

$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'orderby' => 'date',
'order' => 'DESC'
];
$info = [];
$query = new WP_Query( $args );
if( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
global $post;
$title = esc_html(get_the_title());
$category = get_the_category();
$date = get_the_date();
$result = [
'title' => $title,
'category' => $category[0]->name,
'date' => $date
];
$info[] = $result;
}
}
wp_reset_postdata();
return $info;

今回はエンドポイントの作成がメインのため、wordpress関数の説明は割愛します。

ここまでの内容で実際にURLを入力することでjsonデータで表示されているのが確認できると思います。

https://kumatech-lab.com/wp-json/sample/post-data

次は取得する方を処理を見ていきます。

エンドポイントからデータの取得

取得はJavascriptで行っているためHTML部は簡素です。

<section class="con">
<div class="back-title">
<h1><span class="h1-border">投稿一覧</span></h1>
</div>
<div id="resXhronready">
<table>
<tbody id="list-parent">
</tbody>
</table>
</div>
<div class="btn-wrap">
<input type="button" class="btn" value="もっと見る" onclick="xhrJsonOnReady();">
</div>
</section>

取得するにはXMLHttpRequestを使用して取得します。

jqueryを使用するならば「.getJSON」「.ajax」での取得可能です。

今回のはjquery使用せずに作成しました。

function xhrJsonOnReady() {
const url = 'https://kumatech-lab.com/wp-json/sample/post-data'
const request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
if(request.status === 200){
let result = request.response;
let parElem = document.getElementById("list-parent");
let try_num =document.getElementById('list-parent').childElementCount;
let loopCount = result.length - try_num ;
if( loopCount >= 0 ) {
if( loopCount > 5 ) loopCount = 5;
}
for( let i = try_num ; i < try_num + loopCount ; i++ ) {
//要素作成
}
}
}
};
request.open("GET" , url);
request.responseType = "json";
request.send();
}

取得URLに先ほど作成したエンドポイントを入れるだけ簡単に取得できます。

上記の例だとボタンを押すたびに5件ずつ投稿データが画面上に追加されていきます。

実際に使用する際は毎回josn取得を行わず1回目の取得の際に配列に格納しておくなどしておくと再利用でき、早いと思います。

活用する際はcssなどでデータが増えるときになめらかなアニメーションなどつけるときれいにみえると思います。

また、使用方法によっては認証を使用してください。

nonceによる認証、Basic認証、OAuthによる認証を行うことができます。

デモサイト

2020 KumaTechLab.