welcartに時間で変わる発送日目安を表示させる。

webの作業は主に夜やる事にしたので、今日も触ってみました。
店舗管理用プラグインを作るより、まずは見える所を終わらせるつもりで前々からやりたかった発送日目安の表示。
単にwelcartの編集画面の発送目安を表示させるのでは無く、集荷時間、休業日で分岐させる表示をやりたかったワケです。

広告

発送目安の分岐

やりたい事は

1、当日発送出来るものは『当日発送』の表示。
2、集荷締め切り時間の少し前に『翌日発送』に切り替え。
3、休業日も自動で切り替え。
4、可能な範囲は日付で表示。
5、配達日数目安のテーブルも作り、配送方法によってテーブルの内容切り替え。

この5点が目標だったので、面倒で今まで手付かずでしたが、重い腰を上げました。

主にphpで書いて、phpだけでは厳しい部分をjQueryで細くしました。

phpで時間で判定して表示切替

まずは、当日発送と翌日発送の切り替え。
コレはphpで可能だからphpのみの切り替えです。

    <?php
    date_default_timezone_set('Asia/Tokyo'); 
    if (date("H") >= 0 && date("H") <= 15) {
        $hassoubi = '本日中';
    } else {
        $hassoubi =  date('n/j', strtotime('+1 day'));
    }?>

5時で集荷受付の終了が主なので、15時いっぱいまでを当日発送に。
分単位までやっても良かったけど1分の為にコード書くのもアレなので、時間のみで分岐する。

コレで15時59分までは『本日中』が変数に入る。
それ以降は明日の日付が○/○で入る。

date_default_timezone_setを入れないとローカルで東京時間にならなかったので保険的に入れている。

あとは出力したい場所に変数を書き出せば良い。
定休日が決まっていればそれも分岐させて良いと思うけど、ココでは休みの分岐はjQueryに全て委ねる事に。

休業日はjQueryで取得する

問題は休業日でした。

前にwelacrtの仕様を読んだ時に、休業日カレンダーはwpのカレンダーを使っているとあった気がする。
もしかするとデータベースから日付は取れないのでは?と思っています。
調べて無いけど・・・

で、調べるのも時間がかかるのでココはjQueryで取得する。

カレンダーを表示していれば、そこからjQueryで取得可能。

簡単に書くと、welcartカレンダーで休業日になっている部分を取得。
それを配列にして、当時の日付と照らして分岐させれば良い。

分岐の条件は、
1、休業日
2、翌日が休業日
3、僕が分かるコード上、月を跨いだ時の分岐。

    var tody = new Date(); //今日を取得
    var lastdy = new Date(tody.getFullYear(),(tody.getMonth() + 1),0); //月末を取得
    var asu = (tody.getDate() + 1); //明日
    var raigetu = $('#wp-calendar-2 .businessday:first').text(); //翌月の最初の休業日。デフォルトでは#wp-calendar-2では取れなかったかも?IDが違う気がした
    var kyugyou = [];
    $('#wp-calendar .businessday ').each(function(i){
        btext = $(this).text();
        kyugyou.push(btext);
    }); //今月の休業日を配列にする

        if( -1 < $.inArray((tody.getDate()+''), kyugyou)){ //休業日の分岐
            if( -1 == $.inArray((asu+''), kyugyou) && tody.getDate() != lastdy.getDate() ){
                var mmdd = (tody.getMonth() + 1) + '/' + asu;
                $('#hassoubi').text(mmdd);
            }else if( -1 == $.inArray((asu+''), kyugyou) && tody.getDate() == lastdy.getDate() && '1' != raigetu ){
                var mmdd = (tody.getMonth() + 2) + '/1';
                $('#hassoubi').text(mmdd);
            }else{
                $('#hassoubi').text('翌営業日');
            }
        }else if( tody.getHours() > 15 && tody.getDate() != lastdy.getDate() && -1 < $.inArray((asu+''), kyugyou) ){ //集荷締め切り時の分岐
                $('#hassoubi').text('翌営業日');
        }else if( tody.getHours() > 15 && tody.getDate() == lastdy.getDate() && '1' == raigetu ){ //月末の分岐
                $('#hassoubi').text('翌営業日');
        }

簡単に書こうと思ったんだけど、あまり綺麗に出来なかった・・・。

内容的には

1、javascriptで今日を取得。
2、そこから明日、月末日を取得。
3、カレンダーから来月の最初の休業日を取得。
4、今月の休みを配列で取得。
5、if文で配列と各条件を付けて、発送予定日を書き換える。

こんな感じ。
月末を条件に加えているのは、明日の日付の取得が**.getDate() + 1になってるから。
この場合、今日が31日の時は明日の日付が32日になってしまう。
そして、月を跨ぐ時は来月のカレンダーと照らす必要があるので月末の分岐が必要になるって感じ。

上では何となく日付のみで分岐させちゃったけど、月/日で分岐させても良かったかも知れない。

もう考えるのが面倒だからやらないけど・・・。
あと上のままじゃIDとか違うだろうから、そのままのコピペは動きません。

配送日数テーブルを配送方法に合わせて出力

コレは無くても良かったかもだけど、配達日数の目安もあると良いと思うので、対応してる配送方法によってテーブルの内容を変えて出力させる。

        <table id="meyasutb">
            <tr>
                <th colspan="2">宅急便</th>
            </tr>
            <tr>
                <td>1日(翌日)</td><td class="txleft">南東北 関東 北陸 中部 関西</td>
            </tr>
            <tr>
                <td>2日</td><td class="txleft">北海道 北東北 中国 四国 九州 沖縄</td>
            </tr>
    <?php 
        $delivmeta = get_post_meta($post->ID, '_itemDeliveryMethod', true);
        $dflg1 = '1';
        $dflg2 = '2';
        $ratap = in_array($dflg1, $delivmeta);
        $dmbin = in_array($dflg2, $delivmeta);
        if ($ratap){
            echo '<tr><th colspan="2">レターパック</th></tr><tr><td colspan="2">2~3日</td></tr>';
        }
        if ($dmbin){
            echo '<tr><th colspan="2">DM便</th></tr><tr><td colspan="2">2~3日</td></tr>';
        }
    ?>
        </table>

上はウチの場合だけど、宅急便は常時使うので分岐させず常に表示。
DM便はまだ使ってないけど、使えない事も無いので条件に入れている。

配送方法の判定はデータベースから取得できる。_itemDeliveryMethodがそれ。
配列で取得出来るので、in_arrayを使って中に入っている時に分岐させれば良い。

配列の順番は0から始まるので、どの順番から入っていて、何が何番か見ればOK。
配送方法の上から0、1、2の順番みたいだけど。

おまけ

おまけ的な事で、在庫の無い商品で『本日発送』とか書いてあると何か微妙です。
あまりにも中途半端に機械的。
なので、在庫の無い時は出力しない為に

<?php if ( usces_have_zaiko_anyone() ) : ?>  

<!-- ここに書く -->

<?php endif; ?>

usces_have_zaiko_anyone関数を使って分岐させてあげる。
コレで全ての在庫無しの時は出力しないで済む。

まとめ

コレをhtmlと合わせて全部組み合わせれば完成。
カレンダーを更新すれば、細かいメンテナンスの必要無し。

もっと細かくやれば全て日付で出力出来るけど、面倒なので中一日入る場合は『翌営業日』という表現にして逃げてしまっていますw
ある意味こっちのほうが簡略化出来るから賢い選択だと思いたいトコロですww

ウチのwebショップで実装しているので見たい方はどうぞ。

https://www.u-hg.com/

半年間、日中はweb系の職場に在籍したわりにPHPやjQueryの知識ある人が皆無で、特にPHPはホボ書く機会が無かったから随分忘れていましたね。
プラグイン作る前に良い予行練習になりました。

ではでは


おすすめのコンテンツ

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です