16時24分40秒 [ソフト開発]
WordPressで新規投稿や更新のタイミングに合わせて静的ファイルを出力する方法
WordPressはPHPで構成されているので、多くのデータが動的に生成されます。
でも、中には静的なファイルとして生成した方が負荷を掛けずに済んで望ましいデータもあります。
そんなときには、WordPressで「記事が新規に投稿されたタイミング」や「記事が更新されたタイミング」で、特定のデータを静的なファイルに書き出す仕組みを用意できると望ましいです。
WordPressでは、そのような新規投稿や更新時に何らかのファイルを出力させることも、とても簡単に実現できました。
調べてみて、ずいぶん簡単だったので驚きました。(^_^;)
以下はその話と解説です。メモみたいなもんですが。
目的:新規記事の投稿や既存記事の更新時に、最近の投稿5本のリンクリストを静的ファイルに出力したい
1つのWordPressでウェブサイト全体を構築している場合は関係ありませんが、1つのWordPressがウェブサイト内の1コーナーだけを作っている場合もあります。私のサイトがそうです。そんなとき、WordPressの影響外の部分に「最新の投稿5件へのリンクリスト」などのデータを表示させたい場合があります。
テーマ内に1つ新規のテンプレートを作って「最新の投稿5件へのリンク」だけを出力するようなPHPを書いても良いのですが、更新されるまでの間は一切内容が変化しないデータを、わざわざPHPで動的に生成するのはサーバリソースの無駄遣いのように感じてしまいます。
負荷軽減のためには、そのような「次の更新までは変化しないデータ」をWordPressの外から参照したい場合には、静的ファイルに出力しておいてそのファイルを参照する方が望ましそうに思います。
準備1:WordPressで最近の投稿5本のデータを得る方法
まず、「最近の投稿5本へのリンク」のデータを得る方法ですが、これは簡単で、wp_get_archives関数を使って以下のような1行を書けば良いだけです。
wp_get_archives( array( 'type' => 'postbypost', 'limit' => 5, 'format' => 'html', 'echo' => 0 ) );
wp_get_archives関数の使い方は、WordPress Codex日本語版などにあるテンプレートタグ/wp get archivesをご参照下さい。
上記の1行の意味は、
- 「
'type' => 'postbypost'
」 : 投稿を公開日時の順に - 「
'limit' => 5
」 : 5件を - 「
'format' => 'html'
」 : HTMLのリスト(li要素)でマークアップされた形で - 「
'echo' => 0
」 : 値として得る
という意味です。値として得るのではなく、そのまま画面に表示したい場合は「'echo' => 1
」と記述するか、echoの記述自体を省略します。
データは上記で用意できましたから、次にこのデータを記事投稿や更新のタイミングで静的なファイルとして保存できれば目的が達成できます。
準備2:WordPressの記事投稿や更新のタイミングで、任意の処理(関数)を実行させる方法
さて、WordPressで何らかの処理を実行するには、テーマ内に含まれている functions.php の中にコードを追加します。
で、ブログ記事の新規投稿や既存ブログ記事の更新時のタイミングで何らかの処理を実行させたい場合には、特定のアクションに関数をフックできるadd_action関数を使って、以下のように記述します。
function 何らかの関数名() { // 何らかの処理 } add_action( 'publish_post', '何らかの関数名');
add_action関数の第1引数(フック名)に「publish_post」を指定し、第2引数(フックする関数名)に自分で作った関数名を書くだけです。こうすると、自分の作った関数が、記事の新規投稿や更新のタイミングで自動実行されます。
便利ですねえ……。
準備3:PHPで、任意のファイル名でデータを保存(出力)する方法
何らかのデータを指定したファイル名で保存するには、PHPのファイルシステム関数の1つであるfile_put_contents関数を使えば簡単です。
これはWordPressとは無関係で、PHPの仕様に含まれている関数です。
以下のように、たった1行を書くだけでファイルを作成できます。
file_put_contents( 出力ファイル名, 出力データ );
ファイルを取り扱いたい際によくあるオープン(fopen)~クローズ(fclose)の処理をわざわざ書く必要がないので楽ちんです。
なお、この方法だと、出力ファイル名に指定したファイルが存在しない場合は新たに作成され(※)、存在する場合には問答無用で上書きされます。詳しくはPHPマニュアルのfile_put_contents項目を参照して下さい。
※ただし、ウェブサーバ上で実行する場合は特に、出力しようとしているディレクトリのパーミッションによってはファイルの作成に失敗する点に注意が必要かも知れません。同名のダミーファイルをあらかじめアップロードしておいて書き込み権限を付与しておくのが確実でしょう。
完成ソースコード:「最新投稿5件へのリンクリスト」を、記事投稿や更新のタイミングで、任意のファイル名で書き出す方法
さて、上記の準備1~3を合体させれば、WordPress内の「最新投稿5件へのリンクリスト」を、記事投稿や更新のタイミングで、任意のファイル名で静的なファイルに出力することができます。
完成したソースコードは以下の通り。これを、WordPressのテーマ内の functions.php 内のどこかに書けば完了です。
function writeout_lastpost5() { /* ▼最近の投稿5本のリンクリストをファイルに出力 */ $outputfilename = get_template_directory() . '/lastpost5.txt'; file_put_contents( $outputfilename, wp_get_archives( array( 'type' => 'postbypost', 'limit' => 5, 'format' => 'html', 'echo' => 0 ) ) ); return; } // 投稿と更新時に実行 add_action( 'publish_post', 'writeout_lastpost5');
上記では、まず、指定データを指定ファイルに保存する処理を記述した writeout_lastpost5関数を自作しています。その後でadd_action関数を呼び、今作った関数が「WordPressでの投稿・更新時」に実行されるよう指定しています。
出力するファイル名は、変数$outputfilenameに入っています。
get_template_directory() は、WordPressで今適用されているテーマのファイルが入っているディレクトリパスを得ています。
この関数で得られるパスの最後にはスラッシュ記号がないので、その後に「/lastpost5.txt」という文字列を加えることで、テンプレートディレクトリ内に lastpost5.txt というファイル名で出力しようとしています。
※出力場所としてここが望ましいかどうかはよく分かりませんが……。でも、テーマが切り替えられる可能性を考えると、テーマに関係するファイルはすべてテーマのディレクトリ内に含めておく方がいいのかな……とも思いまして。
※なお、お使いのサーバによっては、PHPから新規のファイルを作成できない場合もあります。その場合は、生成予定のファイル名であらかじめダミーのファイルをアップロードしておいて、書き込み権限(パーミッション)を加えておきましょう。
あとは、この方法で出力されたデータファイルを適宜読み込めば、WordPressの外から「最新の投稿5件へのリンクリスト」のデータが(WordPressを動かすことなく)得られます。
(私の場合は、単にSSIで合成しているだけです。)
以上、WordPressで新規投稿や更新のタイミングに合わせて静的ファイルを出力する方法でした!
もしかしたら、他にもっと良い方法があるかも知れませんけどもね。(^_^;)