PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > 更新が滞っているウェブサイトをダッシュボードに表示する

2018年01月18日

更新が滞っているウェブサイトをダッシュボードに表示する

お世話になっております。アルファサード・サポートです。最近頂いたお問い合わせをモデルに、更新されていないウェブサイトの探し方をご紹介します。今回のお問い合わせは、更新が滞っているウェブサイトをメール通知でリストアップしたい、というテーマでした。残念ながら現状ではそういった情報をメールで通知できる機能はございませんので、有償でのカスタマイズが必要です。

しかしメール通知以外の部分については、既存の機能で実現できます。

ダッシュボードのスクリーンショット.PNG

方法

以下のことを利用して、更新が滞っているウェブサイトを探します。

  • テンプレートタグで、更新から何秒経ったか?という情報を得ることができます。
  • またテンプレートタグは、カスタムダッシュボードでも使用できます。

定義

今回は以下の条件に当てはまるウェブサイトは更新が滞っているものとします。

  • 公開されている記事かウェブページのうち
  • 最後に更新された記事かウェブページの
  • 更新日時(MTEntryModifiedDate)が
  • ダッシュボードを開いた時点(MTDate)よりも
  • 14日以上前

注意点

今回は更新が滞っている「ウェブサイト」を探します。同様の「ブログ」探すには MTBlogs も使う必要があります。

実装

まず以下のようにUNIXエポック以降の年・月・日・時・分・秒を渡すとUNIXエポックからの経過秒数を返すモジュールを用意します。(ほかに相応の基準時刻があれば、UNIXエポックでなくてもよいと思います)

<mt:Ignore>calc_utc_seconds (システム > デザイン > テンプレート > テンプレートモジュール)</mt:Ignore>
<mt:Ignore>Require: args_year, args_month, args_day, args_hour, args_minute, args_second</mt:Ignore>

<mt:Ignore>変数宣言(可読性)</mt:Ignore>
<mt:SetVar name="timestamp_from_module" value="0">
<mt:SetVar name="leap_year_count" value="0">  <mt:Ignore>うるう年の回数</mt:Ignore>
<mt:SetVar name="is_leap_year" value="0">  <mt:Ignore>現在がうるう年</mt:Ignore>
<mt:SetVar name="month_days[0]" value="0">
<mt:SetVar name="month_days[1]" value="31">
<mt:SetVar name="month_days[2]" value="59">
<mt:SetVar name="month_days[3]" value="90">
<mt:SetVar name="month_days[4]" value="120">
<mt:SetVar name="month_days[5]" value="151">
<mt:SetVar name="month_days[6]" value="181">
<mt:SetVar name="month_days[7]" value="212">
<mt:SetVar name="month_days[8]" value="243">
<mt:SetVar name="month_days[9]" value="273">
<mt:SetVar name="month_days[10]" value="304">
<mt:SetVar name="month_days[11]" value="334">

<mt:SetVar name="register" value="$args_year"> <mt:Ignore>計算用の値のためのレジスタ</mt:Ignore>
<mt:SetVar name="register" op="-" value="1970"> <mt:Ignore>UNIXエポック, 1970/01/01 00:00:00</mt:Ignore>

<mt:SetVar name="elapsed_year" value="$register">
<mt:SetVar name="amari" op="%" value="4">
<mt:If name="amari" eq="0">
    <mt:SetVar name="is_leap_year" value="1">
</mt:If>

<mt:SetVar name="lyc" value="$register">
<mt:SetVar name="lyc" op="+" value="2">  <mt:Ignore>UNIXエポック1970, 最初のうるう年1972</mt:Ignore>
<mt:SetVar name="lyc" op="/" value="4">
<mt:Var name="lyc" regex_replace="/(\d*)\.(\d*)/","$1" setvar="lyc">
<mt:SetVar name="leap_year_count" op="+" value="$lyc">
<mt:If name="is_leap_year" eq="1">
    <mt:SetVar name="leap_year_count" op="-" value="1">
</mt:If>
<mt:For var="i" from="2000" to="10000" step="100">  <mt:Ignore>うるう年の例外を西暦1万年まで考慮</mt:Ignore>
    <mt:If name="i" le="$args_year">
        <mt:Var name="i" op="%" value="400" setvar="x">
        <mt:If name="x" ne="0">
        <mt:SetVar name="leap_year_count" op="-" value="1">  <mt:Ignore>100の倍数年のうち400で割り切れない年は、うるう年ではない</mt:Ignore>
        </mt:If>
    </mt:If>
</mt:For>

<mt:SetVar name="register" op="*" value="31536000"> <mt:Ignore>一年間の秒数31536000 = 60 * 60 * 24 * 365</mt:Ignore>
<mt:SetVar name="timestamp_from_module" op="+" value="$register">

<mt:SetVar name="register" value="$args_month">
<mt:SetVar name="register" op="-" value="1">
<mt:Var name="month_days[$register]" setvar="register">
<mt:SetVar name="register" op="*" value="86400">
<mt:SetVar name="timestamp_from_module" op="+" value="$register">

<mt:SetVar name="register" value="$args_day">
<mt:SetVar name="register" op="-" value="1">
<mt:Setvar name="lyc_offset" value="0">
<mt:If name="is_leap_year" eq="1">
    <mt:If name="args_month" ge="3">
        <mt:Setvar name="lyc_offset" value="1">
    </mt:If>
</mt:If>
<mt:SetVar name="register" op="+" value="$lyc_offset">
<mt:SetVar name="register" op="*" value="86400">
<mt:SetVar name="timestamp_from_module" op="+" value="$register">

<mt:SetVar name="register" value="$args_hour">
<mt:SetVar name="register" op="*" value="3600">
<mt:SetVar name="timestamp_from_module" op="+" value="$register">

<mt:SetVar name="register" value="$args_minute">
<mt:SetVar name="register" op="*" value="60">
<mt:SetVar name="timestamp_from_module" op="+" value="$register">

<mt:SetVar name="timestamp_from_module" op="+" value="$args_second">

そして以下のように配信が滞っているかどうか調べてウェブサイト名を表示するモジュールを用意します。

<mt:Ignore>dashboard_stagnate_website (システム > デザイン > テンプレート > テンプレートモジュール)</mt:Ignore>
<mt:Ignore>Require: args_period_days</mt:Ignore>

<mt:SetVar name="given_period" value="86400">
<mt:SetVar name="given_period" op="*" value="$args_period_days">
<mt:SetVar name="href_base" value="http://url/to/your/powercms?__mode=dashboard&blog_id=##blog_id##">

<mt:Date format="%Y" setvar="year">
<mt:Date format="%m" setvar="month">
<mt:Date format="%d" setvar="day">
<mt:Date format="%H" setvar="hour">
<mt:Date format="%M" setvar="minute">
<mt:Date format="%S" setvar="second">
<mt:Include module="calc_utc_seconds" global="1" args_year="$year" args_month="$month" args_day="$day" args_hour="$hour" args_minute="$minute" args_second="$second">
<mt:Var name="timestamp_from_module" setvar="timestamp_now">

<mt:SetVar name="stagnate_count" value="0">
<mt:Websites site_ids="all">
    <mt:SetVar name="entry_modified_latest" value="0">
    <mt:SetVar name="page_modified_latest" value="0">
    <mt:SetVar name="modified_latest" value="0">

    <mt:Entries sort_by="modified_on" sort_order="descend" limit="1">
        <mt:EntryModifiedDate format="%Y" setvar="year">
        <mt:EntryModifiedDate format="%m" setvar="month">
        <mt:EntryModifiedDate format="%d" setvar="day">
        <mt:EntryModifiedDate format="%H" setvar="hour">
        <mt:EntryModifiedDate format="%M" setvar="minute">
        <mt:EntryModifiedDate format="%S" setvar="second">
        <mt:Include module="calc_utc_seconds" global="1" args_year="$year" args_month="$month" args_day="$day" args_hour="$hour" args_minute="$minute" args_second="$second">
        <mt:Var name="timestamp_from_module" setvar="entry_modified_latest">
    </mt:Entries>

    <mt:Pages sort_by="modified_on" sort_order="descend" limit="1">
        <mt:PageModifiedDate format="%Y" setvar="year">
        <mt:PageModifiedDate format="%m" setvar="month">
        <mt:PageModifiedDate format="%d" setvar="day">
        <mt:PageModifiedDate format="%H" setvar="hour">
        <mt:PageModifiedDate format="%M" setvar="minute">
        <mt:PageModifiedDate format="%S" setvar="second">
        <mt:Include module="calc_utc_seconds" global="1" args_year="$year" args_month="$month" args_day="$day" args_hour="$hour" args_minute="$minute" args_second="$second">
        <mt:Var name="timestamp_from_module" setvar="page_modified_latest">
    </mt:Pages>

    <mt:SetVar name="register" value="entry_modified_latest">
    <mt:SetVar name="register" op="+" value="$page_modified_latest">

    <mt:If name="register" ne="0">
        <mt:If name="entry_modified_latest" ge="$page_modified_latest">
            <mt:SetVar name="modified_latest" value="$entry_modified_latest">
        <mt:Else>
            <mt:SetVar name="modified_latest" value="$page_modified_latest">
        </mt:If>
        <mt:SetVar name="register" value="$timestamp_now">
        <mt:SetVar name="register" op="-" value="$modified_latest">
        <mt:If name="register" gt="$given_period">
            <mt:WebsiteID setvar="website_id">
            <mt:WebsiteName setvar="website_name">
            <mt:SetVar name="link_tag" value="<a href='##href##'>##website_name##</a>">
            <mt:Var name="link_tag" replace="##website_name##","$website_name" setvar="link_tag">

            <mt:SetVar name="href" value="$href_base">
            <mt:Var name="href" replace="##blog_id##","$website_id" setvar="href">
            <mt:Var name="link_tag" replace="##href##","$href" setvar="link_tag">

            <mt:SetVar name="stagnate_websites[$stagnate_count]" value="$link_tag">
            <mt:SetVar name="stagnate_count" op="++">
        </mt:If>
    </mt:If>
</mt:Websites>

<mt:If name="stagnate_count" gt="0">
    以下のウェブサイトは<mt:Var name="args_period_days">日以上、更新が滞っています:<br>
    <mt:Loop name="stagnate_websites">
        <mt:Var name="__value__" /><mt:If name="__last__"><mt:Else>・</mt:If>
    </mt:Loop>
    <br>
</mt:If>

そしてカスタムダッシュボードに上記をインクルードします。

<mt:Include module="dashboard_stagnate_website" global="1" args_period_days="14">

更新が滞っているウェブサイトがダッシュボードに表示されたでしょうか?

それでは今日もまたお問い合わせを頂いておりますので、このあたりでそろそろ失礼します。


Recent Entries