WordPress開発時の悩み
静的ファイルとWordPressを共存させるサイトを作ることが最近多いです。
その時に、
WordPress管理外のファイルからWordPressの記事一覧を表示させたい
ということが頻繁に起こります。
- トップページのみ特定のカスタム投稿の最新5件を表示させたい
- あるページにだけ特定のカテゴリを表示させたい
という場合にどう対応すべきか検討した結果を記載します。
①WP_Filesystemのput_contentsを使用して静的ファイルを吐き出す
実装方法
「記事ステータスが変更された際に静的ファイルを吐き出して、SSIでインクルードファイルを生成しようぜ!」
というノリです。
WordPressのファイル操作用オブジェクトであるWP_FileSystemを使用して行います。
記事ステータスが変わるのを検知するフックはwp_after_insert_post(WordPress5.6に実装されたフック)を使用します。
以下のフックだと、アイキャッチ画像やタグが読み込まれないです。
『pre_post_update』 『edit_post』 『post_updated』 『save_post』 『wp_insert_post』
メリット
- 記事投稿で静的ファイルを好きな場所に生成できる
デメリット
- 予約投稿では起動しない(代替cron なら可能)
※代替 cron だとリダイレクトの仕組みを使用しているため、アナリティクスで変な数値が出てしまう。(WordPressの公式も本番では使わないようとのこと。)
②file_put_contents(php の機能)を使用して静的ファイルを吐き出す
実装方法
WP_Filesystemを使用せずfile_put_contentsを使用するだけなのでほぼ記述は①と同じ
メリット
- ① と同じ
デメリット
- ① と同じ+WordPress から非推奨とされる
③ サーバーの cron を使用する
実装方法
すいません、、、これはわからなかったので書けません。。。
メリット
- 定期的に処理ができるので漏れが少ない
デメリット
- 障害が起きたときに対応しずらく、管理ができない可能性(サーバーに関する知識があれば別)
- ローカルのファイルで管理することができない
④WordPress エンジンを起動させる
実装方法
以下のコードを使用したいファイルに記述する
// /hoge/wp-load.php←/hoge/はWordPressがインストールされている場所
require_once($_SERVER['DOCUMENT_ROOT'] . '/hoge/wp-load.php');
上記の記述をすることで、WordPressのエンジンが起動するので、WordPressで定義した変数だったりショートコードなども自由に使用することができます。
※.htaccess
でhtmlでもphpを動かせるようにしておくと便利です。
WP-optimizeというプラグインのキャッシュ機能を使うと、謎の大量エラーを吐きます。キャッシュ機能がうまく動かなくなるせいです。
キャッシュ機能のみ停止するか、キャッシュ対象から外すようにしてください。
require_once
の記述は、<!DOCTYPE html>
宣言の前に書いてください。
初回読み込み時にエラーが起こるのを防ぐためです。
メリット
- 仕組みが単純なので実装が簡単
- ローカルのファイルだけで対応できるので、管理がしやすい
デメリット
- 静的ファイルと比べて0.9秒程度表示速度が遅くなる(WordPress 管理下のページと同じくらい)
⑤WP REST API を使用する。
実装方法
メリット
- 他サイトの REST API を呼び込むことができるのでカスタム性が高い
デメリット
- スライダーなどの JS を使用するとなるとREST APIの通信を待ってから起動させる必要があるため、なにも対応しないとJavaScriptエラーがおこる
- 表示速度が遅い(通信している間はコンテンツが空になる)
- 表示されなかったときや通信中のローディングアイコンなどの設定をする必要がある。
どれがおすすめか
④のWordPressエンジンを起動させるが一番簡単で、かつ速度もあまり遅くなりません。
また、REST APIを使用しないため、JavaScriptの修正などをしなくて済むので一番おすすめです。
予約投稿を使わないのであれば①WP_Filesystemのput_contentsを使用して静的ファイルを吐き出すが表示速度も遅くならないで管理もしやすいためこちらもおすすめです。