WordPressに公開承認フローを導入

商用CMSと呼ばれるものには「公開承認フロー」という機能が付いているものが結構あります。

この「公開承認フロー」というのは、大まかに言うと、「公開権限のないライターが記事を投稿し、その旨を公開権者にメールなどで連絡して、公開権者が記事を確認して公開する」というものです。

WordPress でも Movable Type でも、「こんな機能が欲しいな」と思ったとき、とりあえず検索してみるとたいてい目的を実現してくれるプラグインが見つかるものです。この「公開承認フロー」を実現するプラグインも探せば存在するのかもしれませんが、今回はすぐには見つからなかったので、このフローに似たものを自分で WordPress に導入してみました。

はじめに

【前提条件】

  • プログラミングの専門知識がなくても導入できる
  • 公開されているライブラリやプラグインを使う
  • テンプレートに直接導入する(記事タイトルなどを引用したいし、投稿者が実際の画面を確認してからが良いと思うので)

【使用するもの】

【目指す公開承認フローと登場人物】

  1. 記事を作成することまではできて公開する権限のないユーザー(投稿者:Contributor氏)が記事を作成
  2. 投稿者(Contributor氏)が、記事を作成したことを公開権限のあるユーザー(今回は管理者:admin氏)へ連絡
  3. 公開権者(admin氏)が記事を確認して公開

通常、公開権者は「編集者」などが考えられますが、今回はユーザーを増やす手間を省いて「管理者」を公開権者とします。

WordPressでユーザーを作成

まず初めに、「記事を投稿することだけできる」投稿者を作成します。

今回はContributor氏を作成しました。公開権者は管理者のadmin氏をそのまま使います。

  • ユーザー名:Contributor
  • 権限:投稿者

記事を投稿

次に、Contributor氏に記事を投稿してもらいます。

今回は、Fantasista eco.というフットサルチームの練習試合の日程を投稿してもらいました。投稿した内容は次のとおり。

public-flow01.jpg

なお、公開権限のない「投稿者」が記事を作成した場合、「公開」というボタンがなく、代わりに「レビュー待ちとして送信」というボタンになりますので、それをクリックしましょう。

public-flow02.jpg

カスタムフィールドを設定する

はじめに Custom Field GUI Utility をダウンロード、インストールしてください。

次に、カスタムフィールドで「公開承認依頼」というチェックボックスを作るために、Custom Field GUI Utility の conf-post.ini に次の内容を入力します。

[public_offer]
fieldname = 公開承認依頼
type = checkbox
sample = 公開承認依頼フォームを表示させる場合はチェックしてください

すると、記事投稿画面に次のような項目が現れます。

public-flow03.jpg

これで管理画面側は準備OKです。

公開承認依頼フォームを作成する

さて、次に公開承認依頼を送るフォームを設置します。

AjaxMail:Ajaxを活用したフリーPHPメールフォームの画面中ほどより、「UTF-8 版」をダウンロードして解凍します。

public-flow04.jpg

解凍したフォルダに ajaxmail というフォルダがあります。その中の sendmail.php をテキストエディタで開き、ソースの約 10 行目から 36 行目の内容を適宜変更します。

// このファイルの名前
$script ="sendmail.php";
// メールを送信するアドレス(複数指定する場合は「,」で区切る)
$to = "○○○@○○○.com";
// 送信されるメールのタイトル
$sbj = "公開承認依頼";
// 送信確認画面の表示(する=1, しない=0)
$chmail = 1;
// 送信後に自動的にジャンプする(する=1, しない=0)
// 0にすると、送信終了画面が表示されます。
$jpage = 0;
// 送信後にジャンプするページ(送信後にジャンプする場合)
$next = "http://www.tinybeans.net/fantasista/";
$from_add = 0;
// 必須入力項目を設定する(する=1, しない=0)
// 原則としてここはしない=0にしておいてください。
$esse = 0;
// 必須入力項目(入力フォームで指定したname)
$eles = array('お名前','内容');

次に、111 行目から 125 行目あたりを、公開承認依頼になるように修正します。

//--- メールのレイアウトの編集 --- 開始 ------------------->
$body="「".$sbj."」から以下のページの公開承認依頼がありました。\n管理画面にアクセスして公開してください。\n\n";
$body.="-------------------------------------------------\n\n";
foreach($_POST as $key=>$var) {
  $key = strtr($key, $string_from, $string_to);
  if(get_magic_quotes_gpc()) $var = stripslashes($var);
  if($var == "eweb_submit") ;
  else $body.="[".$key."] ".$var."\n";
}
$body.="\n-------------------------------------------------\n\n";
$body.="送信日時:".date( "Y/m/d (D) H:i:s", time() )."\n";
$body.="ホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n\n";
//--- 終了 --->

また、196 行目から 206 行目の間に、送信後にトップページへ戻るリンクを張っておきます。

<!--- 送信終了画面のレイアウトの編集 --- 開始 ------------->
ありがとうございました。<BR>
送信は無事に終了しました。<BR><BR>
<!-- 著作権表示                                                            -->
<!-- 消しても構いませんが、その際は当サイトにリンクをお貼りください。-->
<FONT size="-1"><a href="http://www.ajaxmail.jp" target="_blank">Powered by AjaxMail</a></FONT><BR>
<a href="http://www.tinybeans.net/fantasista/">トップページへ戻る</a>
<!--- 終了 --->

修正したら UTF-8 で保存して、WordPress で使用中のテーマディレクトリ(wp-content/themes 内の使用中のテーマディレクトリ)にアップロードします。

続いて、使用中のテーマの single.php の 次の場所に以下のソースを挿入します。

<?php comments_template(); ?>
    【ここに挿入】
<?php endwhile; else: ?>
<form method="POST" action="<?php bloginfo('template_directory'); ?>/sendmail.php">
<fieldset>
<legend>公開承認依頼送信フォーム</legend>
<dl>
    <dt><label for="お名前">お名前</label></dt>
    <dd><input type="text" size="40" name="お名前" id="お名前" value="<?php the_author(); ?> "></dd>
    <dt><label for="E-mail">E-mail</label></dt>
    <dd><input type="text" size="40" name="E-mail" id="E-mail" value="<?php the_author_email(); ?>"></dd>
    <dt><label for="ページタイトル">ページタイトル</label></dt>
    <dd><input type="text" size="40" name="ページタイトル" id="ページタイトル" value="<?php the_title(); ?>"></dd>
    <dt><label for="url">url</label></dt>
    <dd><input type="text" size="40" name="url" id="url" value="<?php the_permalink(); ?>"></dd>
    <dt><label for="内容">内容</label></dt>
    <dd>
        <textarea cols="50" rows="10" name="内容" id="内容"><?php the_excerpt(); ?></textarea></dd>
    <dt>送信</dt>
    <dd>
        <p><input type="submit" value="送信する"></p>
        <p><input type="reset" value="リセット"></p>
    </dd>
</dl>
</fieldset>
</form>
<p style="text-align:center;"><a href="http://www.ajaxmail.jp" target="_blank">Powered by AjaxMail</a></p>

テンプレートタグをいくつか説明しておきます。

<?php bloginfo('template_directory'); ?>
現在使用中のテーマディレクトリの URL を出力します。
<?php the_author(); ?>
投稿記事の投稿者名を出力します。
<?php the_author_email(); ?>
投稿記事の投稿者の URL を出力します。
<?php the_title(); ?>
投稿記事のタイトルです。
<?php the_permalink(); ?>
投稿記事のパーマリンクを出力します。
<?php the_excerpt(); ?>
コンテンツの内容を出力します。本来は概要を出力するテンプレートタグですが、日本語環境では全文が表示されてしまうようです。

こういったテンプレートタグをフォームの初期値(value 属性など)に設定しておくことで、公開承認を依頼する投稿者は送信ボタンをクリックするだけで済みます。

さて、ここで問題です。このままだと、投稿者のみならず、一般ユーザーにも公開承認フォームが表示されてしまうというシャレにならないことになってしまいます。また、関係者にとってもこのフォームはうっとうしいでしょう。

したがって、ログインしているユーザーだけ、もっと言えば「投稿者本人がログインし、かつ公開承認依頼のチェックボックスにチェックしているときだけ」表示されればよいので、上記のフォームを次の php で囲み条件分岐します。

<?php global $current_user;if (($current_user->ID == $post->post_author)) { ?>
    <?php if(get_post_meta($post->ID,'public_offer',TRUE)):?>
    【公開承認依頼フォーム】
    <?php endif;?>
<?php } ?>

1 行目でログインしているユーザー ID と投稿者のユーザー ID を照合し、2 行目で先に設定したカスタムフィールドのチェックボックスがチェックされているか照合します。

したがって、single.php に挿入するソースは以下のようになります。

<?php global $current_user;if (($current_user->ID == $post->post_author)) { ?>
    <?php if(get_post_meta($post->ID,'public_offer',TRUE)):?>
    <form method="POST" action="<?php bloginfo('template_directory'); ?>/sendmail.php">
    <fieldset>
    <legend>公開承認依頼送信フォーム</legend>
    <dl>
        <dt><label for="お名前">お名前</label></dt>
        <dd><input type="text" size="40" name="お名前" id="お名前" value="<?php the_author(); ?> "></dd>
        <dt><label for="E-mail">E-mail</label></dt>
        <dd><input type="text" size="40" name="E-mail" id="E-mail" value="<?php the_author_email(); ?>"></dd>
        <dt><label for="ページタイトル">ページタイトル</label></dt>
        <dd><input type="text" size="40" name="ページタイトル" id="ページタイトル" value="<?php the_title(); ?>"></dd>
        <dt><label for="url">url</label></dt>
        <dd><input type="text" size="40" name="url" id="url" value="<?php the_permalink(); ?>"></dd>
        <dt><label for="内容">内容</label></dt>
        <dd>
            <textarea cols="50" rows="10" name="内容" id="内容"><?php the_excerpt(); ?></textarea></dd>
        <dt>送信</dt>
        <dd>
            <p><input type="submit" value="送信する"></p>
            <p><input type="reset" value="リセット"></p>
        </dd>
    </dl>
    </fieldset>
    </form>
    <p style="text-align:center;"><a href="http://www.ajaxmail.jp" target="_blank">Powered by AjaxMail</a></p>
    <?php endif;?>
<?php } ?>

これでフォームは完成です。

公開承認フロー

さて、実際に公開承認フローを画像ベースで確認していきましょう。

投稿者が記事の管理画面にログイン

今回はすでに記事は投稿してあるので投稿の編集画面にアクセスします。そして、カスタムフィールドの公開承認依頼にチェックを入れます。

public-flow05.jpg

「レビュー待ちとして送信」をクリック

public-flow06.jpg

「投稿の管理」画面に戻るので、今の投稿記事の「レビュー待ち」をクリックして投稿を表示

public-flow07.jpg

公開承認依頼フォームで送信

表示された投稿のページ下部の公開承認依頼送信フォームの内容を確認し、「送信する」をクリック(フォームのスタイルは、CSS で適宜修正してください)

public-flow08.jpg

確認画面で確認し、「送信する」をクリック

public-flow09.jpg

public-flow10.jpg

公開権者がメールを確認して公開

公開権者がメールを確認し、管理画面にログイン後、再度メールの「URL」をクリック

public-flow11.jpg

この投稿記事の編集画面にアクセス

public-flow12.jpg

最後に公開ステータスを「公開済み」にし「公開」をクリックしてこの投稿記事が公開されます。

public-flow13.jpg

public-flow14.jpg

以上です。

まとめ

これで簡易的ではありますが、公開認証フローを実現することができました。

今回は、AjaxMail:Ajaxを活用したフリーPHPメールフォームの便利な機能は全く使いませんでしたが、JavaScript ライブラリを読み込みフォームのテンプレートをカスタマイズすれば、かなり便利に使えます。

例えば、カスタムフィールドの情報をすべて承認フォームのデフォルト値にしておき、AjaxMail にセットされている Adobe Spry のチェック機能を使えば、情報の掲載漏れを事前に防ぐことができるでしょう。

また、サッカーチームなどでは、公開承認フォームとしてではなく、「練習予定を更新したよ」的な使い方もできるでしょう。

こういった感じで応用できるのがテンプレートいじりの醍醐味だったりしますね。

  • このエントリーをはてなブックマークに追加
Just a second...