Standing on the Shoulder of Linus

Home / 2014 / 8月 / 24 / CMSにリマインダー機能を追加: もうすぐ公開されるウェブページをメールなどで通知 Novius OS

CMSにリマインダー機能を追加: もうすぐ公開されるウェブページをメールなどで通知 Novius OS

もうすぐ公開されるウェブページをメールなどで通知するタスクを作成しました。Novius OS は FuelPHP ベースの CMS なので、FuelPHP のタスク機能を使います。

FuelPHP のタスク

まず、FuelPHP のタスクについて紹介します。通常のウェブアプリケーションは、ブラウザから実行することが多いです。しかし、処理によっては、ブラウザではなく、コマンドラインから実行したいケースもあると思います。典型的には、バックアップやログローテーションなどのメンテナンス作業です。こういった処理を、タスクとして作成すると、コマンドラインから起動する、cronで定期実行する、といったことが容易に行えます。

予約投稿

Novius OS では、ページの予約公開機能が標準実装されています。このため、ページの公開開始日時と公開終了日時を指定することができます。(いずれか一方を指定しても、両方を指定してもOK)ページ編集画面の左上のボタンで設定を行います。

sheduled_post

sheduled_post_setting

公開直前に通知するリマインダー機能

予約公開にしておくと、公開開始日時以降にアクセスされた場合、ページが表示されます。コンテンツについては、事前に用意しておけばよいですね。しかし、公開の直前にもう一度確認したい、という場合があるかもしれません。そういった場合、今回作ったタスクを有効にしておけば、もうすぐ公開されるページをメール通知してくれます。また、こうしておけば、公開日時を設定ミスしていた場合でも、事前に気づける可能性が高くなります。

<?php
/**
 * Notice for Pages that will be Published in a few Days
 * Author: Fumito MIZUNO
 * License: AGPL ver 3.0 or later
 */
namespace Fuel\Tasks;

class Noticeschedule
{
    protected $email = 'novius-os@php-web.net';
    protected $mes = <<<'EOD'
Usage
noticeschedule $start $days
$start: startdate, which filters the scheduled page. Default is 0 (today)
$days: Determines the duration days to search. This value must be a positive value.  Default is 7 (1 week)

Sample Usage
noticeschedule 1 1
-- Searches the pages which wiil be published tomorrow. (from tomorrow and 1 day)

noticeschedule 0 2
-- Searches the page which will be published either today or tomorrow. (from today and 2 days)

EOD;
    protected $nodata = 'No Scheduled Posts from %s to %s';

    public function run($start = 0, $days = 7)
    {
        if( !is_numeric($start) || !is_numeric($days) || $days <= 0)
        {
            echo $this->mes;
            exit;
        }
        $startday = sprintf('P%dD', $start);
        $endday = sprintf('P%dD', $days);
        $date_criteria = new \DateTime("now",new \DateTimeZone(\Fuel::$timezone));
        $date_criteria->add(new \DateInterval($startday));
        $date_start = $date_criteria->format('Y-m-d H:i:s');
        $date_criteria->add(new \DateInterval($endday));
        $date_end = $date_criteria->format('Y-m-d H:i:s');

        // Find scheduled pages which will be published in $date_start - $date_end;
        $data = \Nos\Page\Model_Page::find('all', array(
            'where' => array(
                array('page_publication_start', '>=', $date_start),
                array('page_publication_start', '<=', $date_end),
            ),
        ));

        // Check whether user-defined event exists.
        if (\Event::has_events('ounziw_noticeschedule')) 
        {
            \Event::trigger('ounziw_noticeschedule', $data);
        }
        else // Do default
        {
            $output = '';
            if ($data)
            {
                foreach ($data as $arr)
                {
                    $output .= "\n";
                    $output .= "Title: ";
                    $output .= $arr->page_title;
                    $output .= "\n";
                    $output .= "Publication Date: ";
                    $output .= $arr->page_publication_start;
                    $output .= "\n";
                }
            }
            else
            {
                $output .= sprintf($this->nodata,$date_start, $date_end);
            }

            // Send Mail
            $mail = \Email::forge();
            $mail->to($this->email);
            $mail->subject('Recent Publication');
            $mail->body($output);

            try {
                $mail->send();
            } catch (\Exception $e) {
                $error = $e->getMessage();
                logger(\Fuel::L_ERROR, 'The Notice Schedule task cannot send emails - '.$error);
            }

        }
    }
}

上記のコードではメール通知ですが、イベントフックを設けています。このため、メール以外にも、チャットワークなどに通知することもできます。詳細はNovius OSを題材に、FuelPHPでチャットワークAPIを使ってみよう #PHP #FuelPHPをごらんください。

コマンドラインからの実行

以下のコマンドを実行します。

oil refine noticeschedule 開始日 期間

今日(実行から24時間以内)に公開される予定のページの場合は、次のように指定します。

oil refine noticeschedule 0 1

明日から三日間以内(実行から24時間~96時間後)に公開される予定のページの場合は、次のように指定します。

oil refine noticeschedule 1 3

引数を省略した場合は、今日から一週間以内、がデフォルトになっています。

oil refine noticeschedule 0 7

なお、「予約投稿が無い」場合、「予約投稿はありません」を通知するようにしています。

関連

Posted in cms | Tagged fuelphp, コマンドライン
← WordPressセキュリティを考える会 第6回を開催します。 Novius OS の権限設定を調べてみた →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 6年使ったイーモバイル(Y!mobile)を解約手続。店頭でSIM返却
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.