コラム(WEB制作のポイント)

WEB制作のポイント 2015年7月25日

WordPressの記事を、一定期間で非公開にする方法

WordPressの記事を、一定期間で非公開にする方法

WordPressには、投稿記事を予約公開する機能は実装されているが、自動的に非公開する機能は実装されていない。
WordPressを純粋にブログとして利用する場合は、特に投稿を非公開にすることは考えなくていいが、企業サイトのIR情報やトピックスなどのCMSとして利用する場合は、一定期間を経過した古い情報を非表示にしたいとの要望が発生することがある。

プラグインとしては、一定期間経過後に自動的に非公開にすることが可能な「Post Expirator」などが存在する。しかし、個々の投稿にそれぞれ非公開日時を設定する必要があり、オペレーションが面倒だし、設定し忘れることも十分に考えられる。大切な内容であるだけに、ミスは許されないものなのだ。

当社クライアントの要望としては、公開日からある一定期間、例えば3年が経過した投稿記事を一律に非公開にするというもの。プラグインではなく、独自ツールを開発してシステムに組み込むことにした。

WordPressデフォルトの機能で非公開にする方法

独自ツールを開発する以外で、不特定多数の訪問者に対して記事を「見えない状態にする」にはいくつかの方法がある。
この記事の目的は自動で公開終了してくれる独自ツールを作ることなのだが、もしかするとデフォルトの機能で間に合うことがあるかもしれない。念のため、デフォルトの機能で公開を終了する方法をおさらいしておこう。

下書きで保存し、非公開にする

これは本来、執筆途中の記事を一時的に保管しておく場合に利用する方法だ。
新規に作成した記事であれば「下書きとして保存する」ボタンをクリックすれば下書き保存してくれる。もちろん「非公開」で保存される。

ユーザーの権限が寄稿者であれば必然的に「下書き」状態でしか保存できないため、投稿者以上の権限を持つユーザーが公開することになる。ユーザーの権限と「レビュー待ち」とを組み合わせれば、簡易ワークフロー的に記事の公開も可能だ。
すでに公開中の記事であっても、「ステータス」を「下書き」に変更して更新すれば下書き保存し「非公開」にすることが可能である。

下書きで保存し、非公開にする

「非公開」で保存する

そもそも記事を「非公開にする」とは、この操作のことである。
執筆した記事を保存する場合に、公開状態を「非公開」にして保存すればよい。ただし、保存ボタンのラベルはなぜか「公開」である。「非公開の記事を公開する」ということなのだろう。

「非公開」で保存する

「ゴミ箱」へ送り、非公開にする

すでに公開済みの記事を何らかの理由で非公開にする場合、「ゴミ箱」へ送ることでも非公開にできる。将来完全に削除してしまうまでの一時保管的な意味合いがある。
記事一覧上で対象となる記事の上にマウスオーバーするといくつか操作コマンドが表示される。その中に「ゴミ箱」があるのでクリックすればよい。

「ゴミ箱」へ送り、非公開にする

「パスワード」を設定し、限定公開にする

「パスワード」を設定し、限定公開にする

パスワードを知っている人以外には「非公開」と言う意味で説明に加える。
公開状態で「パスワード保護」を選択し、パスワード文字列と共に保存すればパスワードで保護された記事が公開可能だ。

ただし、この機能には、個人的にいただけない部分がある。それは、記事のタイトルは一般に公開されてしまう点だ。

筆者としてはこの記事の存在すらもパスワードを知っている人以外には知られたくない場合に使いたい機能であるが、標準仕様としてはそうではないようだ。もちろんテーマファイルをカスタマイズすれば、パスワード付きの記事のタイトルを表示しないことは可能だが・・・。

公開日時を指定して公開する(公開予約)

自動公開日時までは「非公開」と言う意味合いで説明に加える。
記事を公開する際、「公開日時」に未来日時を設定し公開(更新)すれば、設定した日時までは非公開となる。

公開日時を指定して公開する(公開予約)

WordPress用に、自動で公開終了してくれる独自ツールを作る

自動的にコンテンツを非公開にする「独自ツールを開発する」といっても、さほど難しいものではない。

処理的には、

  • 全投稿を取得し、ループする。
  • 投稿日時と現在日時-3年を比較する。
  • 投稿日時の方が過去であれば、ゴミ箱に送る。

以上である。

ソースの一例を以下に挙げておくが、WordPressがインストールされているフォルダーなどは、あなたの環境に合わせてほしい。

require('./wp-load.php');
require('./wp-config.php');

$delete_day = strtotime('-3 year');
$my_posts = get_posts("posts_per_page=-1");

foreach($my_posts as $post): setup_postdata($post);
	$post_date = strtotime(get_the_date('Y/n/d'));
	if ($delete_day > $post_date):
		wp_trash_post();
	endif;
endforeach;
wp_reset_postdata();

独自ツールを実行する

独自ツールの実行には、いくつかの方法がある。

1.サーバーのOSがUNIX系の場合、定時実行のcronを利用する

先ほどのソースを「delete_news.php」などのファイル名で任意の場所に保存し、crontabコマンドでcronを実行するように設定する。

例えば、毎日朝方6時に実行する場合は以下のような記述内容だ。

0 6 * * * /usr/bin/php /home/wp/delete_news.php

2.独自ツールを公開領域に格納し、外部から手動実行する

公開領域に格納し、外部から手動実行

次に、ブラウザから実行する方法。
他者から実行できないように、HTTPの基本認証をかけるなどのセキュリティに対策は施しておくべきだ。

先ほどのソースを「delete_news.php」などのファイル名で外部からブラウザでアクセス可能な領域に保存し、ブラウザのアドレスバーに直接URLを入力し実行する。

3.サイトトップページの表示に連動し、実行する

サーバーで稼働しているWEBサーバーがApacheの場合、SSIを利用してトップページの表示時に組み込み実行する方法。ただし、サイトのトップページが表示される度に実行されるので、投稿の件数が多いサイトだと、トップページの表示に時間がかかる可能性がある。

先ほどのソースを「delete_news.php」などのファイル名で任意の領域に保存し、サイトのトップページのHTMLに以下のようなSSIの記述を追記する。

<!--#include virtual="/delete_news.php "-- >

4.WordPressで表示されるページに連動させて、実行する

最後は、WordPressのテーマファイルを構成するfunctions.phpに、直接ロジックを記述する方法だ。ただし、WordPressのページを表示したり管理画面を操作すると、常に実行されることになってしまう。

テーマファイルの中にあるfunctions.phpをテキストエディタで開き、ファイルの最後に先ほどのソースの先頭のrequire宣言を除いた部分をそのまま貼り付ければいい。

WordPressは、機能追加も豊富な関数群が開発をサポート

機能追加も豊富な関数群が開発をサポート

WordPressの標準機能ですべてが満足できることもあれば、できないこともある。
WordPressには、豊富なプラグインが存在するが、残念ながらしっくりこない場合もある。
その場合は、自力でのプラグインやアドオンツール(独自ツール)の開発に迫られるが、WordPressの設計者はそのあたりもよく心得ていて、そんな我々のために豊富な関数群を準備していてくれるのだ。

今回のケースは、まさにそのパターンで独自ツールを開発した事例。
今回は利用していないが、WordPressの処理のタイミングに自ら開発した独自ツールの実行を割り込ませることができる、フックやフィルターと呼ばれるインターフェイスも準備されている。
WordPressは、これらの関数群やフック、フィルターを駆使することで、自由度の高いCMSとして利用することが可能である。腕に覚えのある読者は、トライされてみてはいかがだろうか。

シェアする
  • line

別のコラムにもヒントがあるかも・・・

このコラムに興味があったなら、
こんなコラムも

執筆:福永 忠夫

フレイバーズに、ご相談されませんか?