WordPressのカスタム投稿タイプ・カスタムフィールドを使った出勤表 3ヶ月版 : WordPress

Pocket

顧客で定休日・個人休を管理できる出勤表のメモ。エラー処理・セキュリティ等の細部は詰めてない。

1ヶ月版は下記に記載。
» WordPressのカスタム投稿タイプ・カスタムフィールドを使った出勤表 : WordPress

仕様

  • カレンダーはカスタムポストとして投稿する。
  • 入力フォームはカスタムフィールドを利用する。
  • 月初めの曜日・末日・日曜日はプログラムで自動的に判別する。
  • 店の定休日(close)・個人休(holiday)はセレクトボックスで選択する。
  • 定休日は背景が灰色。個人休は赤。日曜日はピンク。
  • 優先順位は定休日 > 個人休 > 日曜日

カスタム投稿ポスト(function.php)

/**
 * Custom Post Type  schedule3(Schedule Of 3 Month)
 */
add_action('init', 'create_schedule3_sequence');
function create_schedule3_sequence(){
    $labels = array(
        'name' => '出勤表 3ヶ月版',
        'singular_name' => '出勤表 3ヶ月版',
        'add_new' => '出勤表 3ヶ月版を追加',
        'add_new_item' => '新しい出勤表を追加',
        'edit_item' => '出勤表を編集',
        'new_item' => '新しい出勤表',
        'view_item' => '出勤表を編集',
        'search_items' => '出勤表を探す',
        'not_found' => '出勤表はありません',
        'not_found_in_trash' => 'ゴミ箱に出勤表はありません',
        'parent_item_colon' => ''
    );  
    $args = array(
        'labels' => $labels,
        'public' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'supports' => array(
            'title'
        ),
        'register_meta_box_cb' => 'schedule3_meta_box'     /* カスタムフィールド */
    );
    register_post_type('schedule3', $args);
    /**
     * カスタムフィールド
     */
    function schedule3_meta_box($post){
        add_meta_box('schedule3_meta', '出勤表入力域', 'schedule3_meta_func', 'schedule3', 'normal', 'high');
    }
    function schedule3_meta_func($post, $box){
        /**
         * カスタムフィールドの値を取得
         */
        // 出勤表1
        $year1  =  intval(get_post_meta($post->ID, 'year1', true));
        $month1 =  intval(get_post_meta($post->ID, 'month1', true));
        $days1 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day1-' . $i;
            $value1 = get_post_meta($post->ID, $key, true);
            if (($value1 == 'present') || ($value1 == 'holiday') || ($value1 == 'close')) {
                $days1[$i] = $value1;
            } else {
                // エラー処理
            }
        }
        // 出勤表2
        $year2  =  intval(get_post_meta($post->ID, 'year2', true));
        $month2 =  intval(get_post_meta($post->ID, 'month2', true));
        $days2 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day2-' . $i;
            $value2 = get_post_meta($post->ID, $key, true);
            if (($value2 == 'present') || ($value2 == 'holiday') || ($value2 == 'close')) {
                $days2[$i] = $value2;
            } else {
                // エラー処理
            }
        }
        // 出勤表3
        $year3  =  intval(get_post_meta($post->ID, 'year3', true));
        $month3 =  intval(get_post_meta($post->ID, 'month3', true));
        $days3 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day3-' . $i;
            $value3 = get_post_meta($post->ID, $key, true);
            if (($value3 == 'present') || ($value3 == 'holiday') || ($value3 == 'close')) {
                $days3[$i] = $value3;
            } else {
                // エラー処理
            }
        }
        /* nonce セキュリティで必要 */
        echo wp_nonce_field('schedule3_meta', 'my_meta_nonce');
        /*
         * カスタムフィールド用のフォームを表示
         */
        /* 出勤表1 */
        // 年
        echo '<p>年 : <select name="year1"><option value="-">--</option>';
        for ($y=2011; $y<2020; $y++){
            if ($y == $year1) {
                echo '<option value="' . $year1 . '" selected="selected">' . $year1. '</option>';
            } else {
                echo '<option value="' . $y . '">' . $y . '</option>';
            }
        }
        echo '</select>&emsp;';
        // 月
        echo '月 : <select name="month1"><option value="-">--</option>';
        for ($m=1; $m<13; $m++){
            if ($m == $month1) {
                echo '<option value="' . $month1 . '" selected = "selected">' . $month1. '</option>';
            } else {
                echo '<option value="' . $m . '">' . $m . '</option>';
            }
        }
        echo '</select></p>';
        // 日付
        echo '<p>';
        for ($i=1, $j=1; $i<=31; $i++) {
            ($i <= 9) ? $date = '0' . $i : $date = $i;
            if ($days1&#91;$i&#93; == 'close') {
                echo  $date . '日' .
                '<select name="day1-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close" selected="selected">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            } else if($days1[$i] == 'holiday') {
                echo  $date . '日' .
                '<select name="day1-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday" selected="selected">休日</option>' .
                '</select> &emsp;';
            } else {
                echo  $date . '日' .
                '<select name="day1-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            }
            if ($j == 5) {
                echo '<br />';
                $j = 1;
           } else {
               $j++;
           }
        }
        echo '</p>';
        /* 出勤表2 */
        // 年
        echo '<p>年 : <select name="year2"><option value="-">--</option>';
        for ($y=2011; $y<2020; $y++){           
            if ($y == $year2) {
                echo '<option value="' . $year2 . '" selected="selected">' . $year2. '</option>';
            } else {
                echo '<option value="' . $y . '">' . $y . '</option>';
            }
        }
        echo '</select>&emsp;';
        // 月
        echo '月 : <select name="month2"><option value="-">--</option>';
        for ($m=1; $m<13; $m++){
            if ($m == $month2) {
                echo '<option value="' . $month2 . '" selected = "selected">' . $month2. '</option>';
            } else {
                echo '<option value="' . $m . '">' . $m . '</option>';
            }
        }
        echo '</select></p>';
        // 日付
        echo '<p>';
        for ($i=1, $j=1; $i<=31; $i++) {
            ($i <= 9) ? $date2 = '0' . $i : $date2 = $i;
             if ($days2&#91;$i&#93; == 'close') {
                echo  $date2 . '日' .
                '<select name="day2-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close" selected="selected">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            } else if($days2[$i] == 'holiday') {
                echo  $date2 . '日' .
                '<select name="day2-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday" selected="selected">休日</option>' .
                '</select> &emsp;';
            } else {
                echo  $date2 . '日' .
                '<select name="day2-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            }
            if ($j == 5) {
                echo '<br />';
                $j = 1;
           } else {
               $j++;
           }
        }
        echo '</p>';
        /* 出勤表3 */
        // 年
        echo '<p>年 : <select name="year3"><option value="-">--</option>';
        for ($y=2011; $y<2020; $y++){
            if ($y == $year3) {
                echo '<option value="' . $year3 . '" selected="selected">' . $year3. '</option>';
            } else {
                echo '<option value="' . $y . '">' . $y . '</option>';
            }
        }
        echo '</select>&emsp;';
        // 月
        echo '月 : <select name="month3"><option value="-">--</option>';
        for ($m=1; $m<13; $m++){
            if ($m == $month3) {
                echo '<option value="' . $month3 . '" selected = "selected">' . $month3. '</option>';
            } else {
                echo '<option value="' . $m . '">' . $m . '</option>';
            }
        }
        echo '</select></p>';
        // 日付
        echo '<p>';
        for ($i=1, $j=1; $i<=31; $i++) {
            ($i <= 9) ? $date = '0' . $i : $date = $i;
            if ($days3&#91;$i&#93; == 'close') {
                echo  $date . '日' .
                '<select name="day3-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close" selected="selected">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            } else if ($days3[$i] == 'holiday') {
                echo  $date . '日' .
                '<select name="day3-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday" selected="selected">休日</option>' .
                '</select> &emsp;';
            } else {
                echo  $date . '日' .
                '<select name="day3-' . $i. '" />' . 
                '<option value="present">--</option>' .
                '<option value="close">定休</option>' .
                '<option value="holiday">休日</option>' .
                '</select> &emsp;';
            }
            if ($j == 5) {
                echo '<br />';
                $j = 1;
           } else {
               $j++;
           }
        }
        echo '</p>';
    }
    // 保存処理
    add_action('save_post', 'schedule3_meta_update');
    function schedule3_meta_update($post_id){
        if (!wp_verify_nonce( $_POST['my_meta_nonce'], 'schedule3_meta')) {
            return $post_id;
        }
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return $post_id;
        }
        if ('schedule3' == $_POST['post_type']) {
            if(!current_user_can('edit_post', $post_id)) {
                return $post_id;
            }
        } else {
            return $post_id;
        }
        /* 値の取得 */
        // 出勤表1
        $year1 = $_POST['year1'];
        $month1 = $_POST['month1'];
        $days1 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day1-' . $i;
            $days1&#91;$i&#93; = $_POST&#91;$key&#93;;
        }
        // 出勤表2
        $year2 = $_POST&#91;'year2'&#93;;
        $month2 = $_POST&#91;'month2'&#93;;
        $days2 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day2-' . $i;
            $days2&#91;$i&#93; = $_POST&#91;$key&#93;;
        }
        // 出勤表3
        $year3 = $_POST&#91;'year3'&#93;;
        $month3 = $_POST&#91;'month3'&#93;;
        $days3 = array();
        for ($i=1; $i<=31; $i++) {
            $key = 'day3-' . $i;
            $days3&#91;$i&#93; = $_POST&#91;$key&#93;;
        }
        if($year1 == '') {
            delete_post_meta($post_id, 'year1');
        }
        else {
            update_post_meta($post_id, 'year1', $year1);
        }
        if($month1 == '') {
            delete_post_meta($post_id, 'month1');
        }
        else {
            update_post_meta($post_id, 'month1', $month1);
        }
        for ($i=1; $i<=31; $i++) {
            $key = 'day1-' . $i;
            if ($days1&#91;$i&#93; == '') {
                delete_post_meta($post_id, $key);
            } else {
                update_post_meta($post_id, $key, $days1&#91;$i&#93;);
            }
        }
        if($year2 == '') {
            delete_post_meta($post_id, 'year2');
        }
        else {
            update_post_meta($post_id, 'year2', $year2);
        }
        if($month2 == '') {
            delete_post_meta($post_id, 'month2');
        }
        else {
            update_post_meta($post_id, 'month2', $month2);
        }
        for ($i=1; $i<=31; $i++) {
            $key = 'day2-' . $i;
            if ($days2&#91;$i&#93; == '') {
                delete_post_meta($post_id, $key);
            } else {
                update_post_meta($post_id, $key, $days2&#91;$i&#93;);
            }
        }
        if($year3 == '') {
            delete_post_meta($post_id, 'year3');
        }
        else {
            update_post_meta($post_id, 'year3', $year3);
        }
        if($month3 == '') {
            delete_post_meta($post_id, 'month3');
        }
        else {
            update_post_meta($post_id, 'month3', $month3);
        }
        for ($i=1; $i<=31; $i++) {
            $key = 'day3-' . $i;
            if ($days3&#91;$i&#93; == '') {
                delete_post_meta($post_id, $key);
            } else {
                update_post_meta($post_id, $key, $days3&#91;$i&#93;);
            }
        }
    }
}
&#91;/php&#93;


<h2>カレンダー出力関数</h2>
<p>カスタム投稿ポストの単一ページsingle-schedule3.phpから呼び出す。</p>
[php]
/*
 * カレンダー出力関数
 * @param $id 投稿ID
 * @param $y 年 数字4桁
 * @param $m 月 数字1~13
 * @param $days 日付 配列 添え字[1~31] 値[空, close, holiday]
 */
function drawSchedule ($id, $y, $m, $days) {
    // $y 年 $m 月
    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME
    $w = date('w', $t); //1日の曜日(0:日~6:土)
    $n = date('t', $t); //$y年$m月の日数
    if ($m<10) {
        $m = "0" . $m;
    }
print <<<HTML
    <table class="schedule">
    <caption>{$y}年{$m}月</caption>
    <tr>
        <th class="textRed">日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th class="textBlue">土</th>
    </tr>
HTML;
    for($i=1-$w; $i<= $n+7; $i++){
        if ((($i + $w) % 7) == 1) {
            print "<tr>n";
        }
        // 日付が有効な場合の処理
        if ((0 < $i) && ($i <= $n)) {
            $value = $days&#91;$i&#93;;
            $html = "<td";
            // 曜日の取得
            $hizuke = mktime(0, 0, 0, $m, $i, $y); //$y年$m月$i日のUNIXTIME
            $youbi = date('w', $hizuke); //1日の曜日(0:日~6:土)
            // 定休日
            if ($value == 'close') { // 定休日
                $html .= ' class="close"';
            } else if ($value == 'holiday') { // 休日
                $html .= ' class="holiday"';
            } else if ($youbi == 0) { // 日曜
                $html .= ' class="sun"';
            }
            $html .= '>' . $i . '</td>';
            print($html);
        } else {
            print "<td>&nbsp;</td>n";
        }
        if ((($i + $w ) % 7 ) == 0 ) {
            print "</tr>n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>n";
}

カスタム投稿タイプ用単一ページ(single-schedule3.php)

    <?php if(have_posts()):while(have_posts()):the_post() ?>
     <h3 style="clear: both">出勤表</h3>
     <?php
        // カレンダー1
        $year1  = get_post_meta($post->ID, 'year1' , true);
        $month1 = get_post_meta($post->ID, 'month1', true);
        for ($i=1; $i<=31; $i++) {
           $key = 'day1-' . $i;
           $days1&#91;$i&#93; = get_post_meta($post->ID, $key, true);
        }
        $year2  = get_post_meta($post->ID, 'year2' , true);
        $month2 = get_post_meta($post->ID, 'month2', true);
        for ($i=1; $i<=31; $i++) {
           $key = 'day2-' . $i;
           $days2&#91;$i&#93; = get_post_meta($post->ID, $key, true);
        }
        $year3  = get_post_meta($post->ID, 'year3' , true);
        $month3 = get_post_meta($post->ID, 'month3', true);
        for ($i=1; $i<=31; $i++) {
           $key = 'day3-' . $i;
           $days3&#91;$i&#93; = get_post_meta($post->ID, $key, true);
        }
        if (!intVal($year1) || !intVal($month1)) {
            $timestamp1 = 0;
        } else {
            $timestamp1 = mktime(1, $month1, $year1);
        }
        if (!intVal($year2) || !intVal($month2)) {
            $timestamp2 = 0;
        } else {
            $timestamp2 = mktime(1, $month2, $year2);
        }
        if (!intVal($year3) || !intVal($month3)) {
            $timestamp3 = 0;
        } else {
            $timestamp3 = mktime(1, $month3, $year3);
        }
        $schedule = array(
            0 => array(
                'timestamp' => $timestamp1,
                'year'      => $year1,
                'month'     => $month1,
                'days'      => $days1
            ),
            1 => array(
                'timestamp' => $timestamp2,
                'year'      => $year2,
                'month'     => $month2,
                'days'      => $days2
            ),
            2 => array(
                'timestamp' => $timestamp3,
                'year'      => $year3,
                'month'     => $month3,
                'days'      => $days3
            )
        );
        foreach ($schedule as $key => $row) {
            $data[$key] = $row["timestamp"];
        }
        array_multisort($data,SORT_ASC,$schedule); 
        if ($data[2] != 0) {
        for ($i = 0; $i<3; $i++) {
           if($data&#91;$i&#93; > 0) {
               drawSchedule($post->ID, $schedule[$i]['year'],$schedule[$i]['month'], $schedule[$i]['days']);
           }
        }
        } else {
            echo '申し訳ごぜません。ただいまスタッフ別の出勤表を準備しております。';
        }
    ?>
    <?php endwhile;endif; ?>

スタイル

table.schedule {
    float: left;
    margin-right: 10px;
}
td.close {
    background: #ccc;
}
td.sun {
    background: #ffc0cb;
}
td.holiday {
    background: #ff0000;
}

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。