顧客で定休日を管理できる出勤表のメモ。エラー処理・セキュリティ等の細部は詰めてない[1]。
@charset "UTF-8"; /* セレクタ ---------------------------------------------------- */ * { margin: 0; padding: 0; } body { text-align: center; /* for IE6 */ } p { margin: 15px 0; } div#calender { width: 640px; margin: 40px auto 0; text-align: left; font-size: 10px; } #calender h1 { width: 640px; height: 40px; margin: 0 0 20px;; padding: 0 0 0 26px; color: #BC857D; background: url(./images/calender/calender.gif) no-repeat; font-size: 1.5em; line-height: 40px; } #calender h3 { margin: 15px 0; font-size: 1.2em; } #calender h3 a { color: #BC857D; font-size: 1.2em; } #calender p { font-size: 1.2em; } #calender table { width: 630px; margin: 0 0 0 5px; border-collapse: collapse; border: 1px solid #DDDDDD; font-size: 1.2em; line-height: 18px; } #calender th { border: 1px solid #DDDDDD; background: #F9F9F9; } #calender td { width: 76px; height: 78px; padding: 6px; border: 1px solid #DDDDDD; vertical-align: top; }
/** * Custom Post Type Calenderコンテンツ * cpt_calender * cpt : Custom Post Type */ add_action('init', 'create_cpt_calender_sequence'); function create_cpt_calender_sequence(){ /** * カスタム投稿タイプ */ // http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type $labels = array( 'name' => '出勤表', 'singular_name' => '出勤表一覧', 'add_new' => '出勤表を追加', '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, 'rewrite' => true, 'supports' => array( 'title', ), 'register_meta_box_cb' => 'cpt_calender_meta_box' ); register_post_type('cpt_calender', $args); /** * カスタムタクソノミー */ // 店舗 register_taxonomy( 'ct_calender_shop', 'cpt_calender', array( 'hierarchical' => true, // カテゴリー形式 'update_count_callback' => '_update_post_term_count', 'label' => '店舗による分類', 'singular_label' => '店舗による分類', 'public' => true, ) ); /** * カスタムフィールド */ function cpt_calender_meta_box($post){ add_meta_box('cpt_calender_meta', 'Calender', 'cpt_calender_meta_func', 'cpt_calender', 'normal', 'high'); } // カスタムフィールドを作成・表示 function cpt_calender_meta_func($post, $box){ // nonceはセキュリティの処理 echo wp_nonce_field('cpt_calender_meta', 'my_meta_nonce'); // カスタムフィールドの値を取得・フォーム要素を表示 $year = get_post_meta($post->ID, 'year', true); echo '<p>年 : <select name="year">'; for ($y=2011; $y<2020; $y++){ if ($y == $year) { echo "<option value='$y' selected>" . $y. "</option>"; } else { echo "<option value='$y'>" . $y . "</option>"; } } echo '</select></p>'; $month = get_post_meta($post->ID, 'month', true); echo '<p>月 : <select name="month">'; for ($m=1; $m<13; $m++){ if ($m == $month) { echo "<option value='$m' selected>" . $m. "</option>"; } else { echo "<option value='$m'>" . $m . "</option>"; } } echo '</select></p>'; $close = get_post_meta($post->ID, 'close', true); echo '<p>定休日 : <input type="text" name="close" value="' . esc_html($close) . '" size="40" /></p>'; $holiday = get_post_meta($post->ID, 'holiday', true); echo '<p>祝日 : <input type="text" name="holiday" value="' . esc_html($holiday) . '" size="40" /></p>'; // 各日付のカスタムフィールドの値を取得・フォーム要素を表示 for ($i=1; $i<=31; $i++) { $key = 'day' . $i; $day[$i] = get_post_meta($post->ID, $key, true); echo '<p>' . $i . '日' . ' : <input type="text" name="' . $key . '" value="' . $day[$i] . '" size="40" /></p>'; } } // カスタムフィールドを保存 add_action('save_post', 'cpt_calender_meta_update'); function cpt_calender_meta_update($post_id){ // セキュリティの処理 // if (!wp_verify_nonce( $_POST['my_meta_nonce'], 'cpt_calender_meta')) { // return $post_id; // } // PHP Notice: Undefined index:が出るので下記に変更 2011.08.24 $my_meta_nonce = isset($_POST['my_meta_nonce']) ? $_POST['my_meta_nonce'] : null; if (!wp_verify_nonce( $my_meta_nonce, 'cpt_calender_meta')) { return $post_id; } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } // 投稿タイプの確認 if ($_POST['post_type'] == 'cpt_calender') { if(!current_user_can('edit_post', $post_id)) { return $post_id; } } else { return $post_id; } // カスタムフィールドの取得・更新 $year = $_POST['year']; if($year == '') { delete_post_meta($post_id, 'year'); } else { update_post_meta($post_id, 'year', $year); } $month = $_POST['month']; if($month == '') { delete_post_meta($post_id, 'month'); } else { update_post_meta($post_id, 'month', $month); } $close = $_POST['close']; if($close == '') { delete_post_meta($post_id, 'close'); } else { update_post_meta($post_id, 'close', $close); } $holiday = $_POST['holiday']; if($holiday == '') { delete_post_meta($post_id, 'holiday'); } else { update_post_meta($post_id, 'holiday', $holiday); } $day = array(); for ($i=1; $i<32; $i++) { $key = 'day' . $i; $day[$i] = $_POST[$key]; if($day[$i] == '') { delete_post_meta($post_id, $key); } else { update_post_meta($post_id, $key, $day[$i]); } } } } /* * カレンダー出力関数 */ function drawCalender () { $id = get_the_ID(); $post = get_post($id); $year = get_post_meta($post->ID, 'year', true); // カスタムフィールド 年 $month= get_post_meta($post->ID, 'month', true); // カスタムフィールド 月 $close = get_post_meta($post->ID, 'close', true); // カスタムフィールド 定休日(カンマ区切) $closes = explode(",",$close); // 定休日を配列へ展開 $holiday = get_post_meta($post->ID, 'holiday', true); // カスタムフィールド 祝日(カンマ区切) $holidays = explode(",",$holiday); // 祝日を配列へ展開 // $y 年 $m 月 $t = mktime(0, 0, 0, $month, 1, $year); //$y年$m月1日のUNIXTIME $w = date('w', $t); //$y年$m月の1日目の曜日(0:日~6:土) $n = date('t', $t); //$y年$m月の日数 print "<h1>{$year}年{$month}月</h1>n"; print '<table>'."n"; print <<<DAY_TITLE <tr> <th class="textRed">日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th class="textBlue">土</th> </tr> DAY_TITLE; // ループ処理開始 for ($i=1-$w; $i<=$n + 7; $i++) { // 週をごとの処理 if ((($i + $w ) % 7) == 1) { print "<tr>n"; } // 日付が有効な場合の処理 if ((0 < $i) && ($i <= $n)) { $key = "day" . $i; // 表示値の取得(カンマ区切) $value = get_post_meta($id, $key, true); $values = explode(",",$value); $html = "<td"; // 曜日の取得 $hizuke = mktime(0, 0, 0, $month, $i, $year); //$year年$month月1日のUNIXTIME $youbi = date('w', $hizuke); //1日の曜日(0:日~6:土) // 定休日 if (in_array($i, $closes, FALSE)) { $html .= ' class="close"'; } // 祝日 else if ( in_array($i, $holidays, FALSE)) { $html .= ' class="holiday"'; } // 日曜 else if ($youbi == 0) { $html .= ' class="sun"'; } $html .= ">{$i}"; for ($j=0; $j<count($values); $j++) { if ($values[$j]) { $html .= "<br />"; $html .= $values[$j]; } else { $html .= " "; } } $html .= "</td>n"; print($html); } else { print "<td> </td>n"; } if ( ( ( $i + $w ) % 7 ) == 0 ) { print "</tr>n"; if ( $i >= $n ) { break; } } } print "</table>n"; }
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。