作成者別アーカイブ: 後藤 祐一

後藤 祐一 について

フリーランスとしてWebプログラミングを行っています。 宜しくお願いします。

Javascript Dateで日付比較

最近Javascriptで土日祝日を飛ばして出荷日を自動表示する依頼があったのでまとめ

$(document).ready(function(){
    var dt = new Date();
    var y = dt.getFullYear();
    var m = dt.getMonth() + 1;
    var d = noonDecision(dt);
    var w = dt.getDay();
    var wd = ['日', '月', '火', '水', '木', '金', '土'];
    var holidayDates = ['2019/3/21','2019/4/29','2019/4/30','2019/5/1','2019/5/2','2019/5/3','2019/5/4','2019/5/5','2019/5/6','2019/7/15','2019/8/11','2019/8/12','2019/9/16','2019/9/23','2019/10/14','2019/10/22','2019/11/3','2019/11/4','2019/11/23'];
    var startWork = '2020/01/01';
    var endWork = '2019/12/31';

    if (new Date(y,m-1,d).getTime() >= new Date(endWork).getTime()) {
        var insStart = new Date(startWork);
        y = insStart.getFullYear();
        m = insStart.getMonth() + 1;
        d = insStart.getDate();
    }
    else {
        // 祝日判定
        d = holidayDecision(y, m, d, holidayDates);
        // 末日判定
        var insObj = overLastDay(y, m, d);
        m = insObj.m;
        d = insObj.d;

        // 土日判定
        var insDate = new Date(y, m-1, d);
        d = satSunDecision(wd[insDate.getDay()], d);
        // 末日判定
        insObj = overLastDay(y, m, d);
        m = insObj.m;
        d = insObj.d;

        // GWの場合ずれるため再度祝日判定
        d = holidayDecision(y, m, d, holidayDates);
        // 土日判定
        insDate = new Date(y, m-1, d);
        d = satSunDecision(wd[insDate.getDay()], d);
    }

    var wdObj = new Date(y, m-1, d);
    w = wdObj.getDay();
    $('body').html('<center>' + m + '月' + d + '日 (' + wd[w] + ')</center>');

    // 祝日判定
    function holidayDecision(y, m, d, holidayDates) {
        for (var i = 0; i < holidayDates.length; i++) {
            if (new Date(y, m-1, d).getTime() == new Date(holidayDates[i]).getTime()) {
                d++;
            }
        }
        return d;
    }

    // 土日判定
    function satSunDecision(wd, d) {
        if (wd == '土') {
            return d + 2;
        }
        else if (wd == '日') {
            return d + 1;
        }
        else {
            return d;
        }
    }

    // 末日判定
    function overLastDay(y, m, d) {
        var lastDay = new Date(y, m, 0).getDate();
        if (d > lastDay) {
            m++;
            d = 1;
        }
        return {m:m, d:d};
    }

    // 正午判定
    function noonDecision(dt) {
        var d = dt.getDate();
        var toDay = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), dt.getHours(), dt.getMinutes(), 0);
        var noon = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), 12, 0, 0);
        if (toDay >= noon) {
            return ++d;
        }
        else {
            return d;
        }
    }
});

まとめ

ややこしかったところ

月を取得するとき1月ならgetMonth()で0が取れてくるところ
(n – 1)なので+1をする。

1月を指定してDateオブジェクトを生成する場合は0を指定する必要があるので-1をする。

曜日はgetDay()で数値が取れてくるだけなので別に文字列で曜日配列を作成する必要がある。
日曜日なら0,月曜日なら1・・・土曜日なら6

祝日は自分で定義する必要がある。

日付オブジェクトを作成するとき文字列を渡す場合YYYY/MM/DDかYYYY/M/D形式にするとよい。
(スラッシュ区切り)

末日を取得するときはdに0を指定すると指定した月の末日が取れてくる。
new Date(2019, 2, 0).getDate()と渡すと28が取得できる。
そしてなぜかここは2月と指定するとちゃんと2月として扱ってくれる。
(n – 1)をしなくてもいい。

WordPress ショートコードでPHPファイルをインクルード

ショートコードを使ってPHPファイルをインクルードする方法についてechoするPHPファイルを読み込みたいとき表示がずれたので公式ドキュメントを調べました。

公式より抜粋
echo ではなく return を使うようにしてください。
echo されたものはすべてブラウザへ出力されますが、ページの適切な箇所に表示されません。

ob_get_cleanをリターンすればいいとのことでさっそく作成

function my_shortcode() {
    ob_start();
    include('phpfile.php');
    return ob_get_clean();
}
add_shortcode('shortcode', 'my_shortcode');

phpfile.phpがecho するファイルでも【shortcode】で呼び出したとき正しく表示されるようになります。

WordPress 新しいエディタ 使いにくい Gutenberg

gutenberg

WordPressを更新したら新しいエディタになっていました。
Gutenbergと言うらしいのですが筆者はVim使いなのでテキストしか使わないのですよね。
画像の通り①、②と2回クリックしてテキストモードに切り替えるのが面倒でビジュアルエディタを前のバージョンに戻しました。

classiceditor

Classic Editorと言うプラグインを追加するだけで前のバージョンのエディタに変更できるので助かりました。

WordPress コメント 画像認証 セキリティ強化 SiteGuard WP Plugin

SiteGuard-WP-Plugin

SI CAPTCHA Anti-Spamで画像認証をしていたのですが配布終了とのことでSiteGuard WP Pluginに切り替えました。

設定できる項目は画像の通り。

ログインするURLが変わってしまうのでブックマークを再度登録し直しましょう。
ログインするURLは自分で決めれるのでログインURLが漏出することはありません。

ログインするたびにメールが着たりするのでログインアラートはOFFにしてあります。

コメントやログインの画像認証はひらがな/英数字/無効とどれかひとつ選択するだけです。

WordPress PHP7にバージョンアップしたらエラー

HTTP500エラー

久しぶりにWPのダッシュボードにログインしたらPHP5.6は危険とのことでPHP7.1にバージョンアップしたらHTTP 500エラーで真っ白になり予期せぬ時間をとられてしまったので解決方法をまとめておきます。

デバッグモードに切り替えてエラー内容を確認する

wp-config.php

/**
 * 開発者へ: WordPress デバッグモード
 *
 * この値を true にすると、開発中に注意 (notice) を表示します。
 * テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
 */
define('WP_DEBUG', false); // trueに変更

Exec-PHPプラグインのエラーみたいです。
調べるとExec-PHPはもう使えないみたいでダウンロードもできません。
なのでとりあえずPHPのバージョンをPHP5.6に戻してダッシュボードにログインしExec-PHPを停止、削除を実行。

Exec-PHPを削除したことにより全ての記事内のPHPタグが仕様不可に!!

画像やURL等はドメインが変わっても動くようにSITE_URLと言う自分で定義した定数を使っていました。これがすべて使えなくなり、リンクは飛べなくなり画像は表示されない事態になりました。

更に調べてみるとショートコードを使うのが一般的との事でショートコードをJavaっぽく作成
functions.php

function getSiteURL() {
    return SITE_URL;
}
add_shortcode('SITE_URL', 'getSiteURL');

※SITE_URLはconst.phpという別ファイルを自分で作ってindex.phpでrequire_onceしています。SITE_URLの中身はhttps://office-goto.info/

これで記事内で[ SITE_URL]と記載するとPHP変数が使えます。
(SITE_URLの前に半角スペースを空けないとURLが展開されるため半角スペースを空けています。)
ただ記事数が多いものでデータベースをエクスポートして一括でPHPタグを[ SITE_URL]に書き換えてインポートし直しました。

PHP7.1にバージョンアップし動作確認後特に問題なく画像やリンクが機能しているため問題解決。