wordpress:記事の更新日時を変更できるようにする
wordpressで「更新日時」を出力している人も多いかと思いますが、更新日時は変更できない仕様になっています。
ですのでその部分を変更できるようにしてみましたのでよろしければ御覧ください。
最初はカスタムフィールドでやろうかと思ってたのですが、せっかくなので記事データの「更新日時」を変更できるようにしてみました。
更新日時を出力
更新日時を出力する場合は下記のように書いてみて下さい。
echo '<div>公開:' . get_the_date() . '</div>'; if( get_the_date() != get_the_modified_date() ) { echo '<div>更新:' . get_the_modified_date() . '</div>'; } //出力結果 公開:2016年3月7日 更新:2016年8月2日
ifの部分は公開日と更新日を比較し、違えば「更新日」を出力します。
使い方
今回作成したものの使い方です。
「更新日時」で表示されている日時は現在のものです。
記事を更新し更新日時が変更されるとこの日時も変わりますので、変更した際はここで確認してください。
- 「更新時の日時」(wordpress標準)
通常の処理を行います。 - 「変更しない」
更新日時を変更しません。 - 「指定」
下のinput,selectで指定した日時に更新日時を書き換えます。
日付欄にはデートピッカーを採用しました。
PHPスクリプト
下記コードをfunctions.phpに追加して下さい。
// jQuery UI Script add_action( 'admin_print_scripts', 'custom_enqueue_script', 1000 ); function custom_enqueue_script() { wp_enqueue_script('jquery-ui-datepicker'); } // jQuery UI Style add_action( 'admin_print_styles', 'custom_enqueue_style', 1000 ); function custom_enqueue_style() { wp_register_style('jquery-ui', '//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css'); wp_enqueue_style( 'jquery-ui' ); } // Meta Box add_action('admin_menu', 'add_modified_date'); // add_modified_date function add_modified_date() { add_meta_box('custom_modified_date', '更新日時', 'custom_modified_date', 'post', 'side', 'high'); } // custom_modified_date function custom_modified_date() { global $post; //現在の更新日時 echo '<div>更新日時:<strong>' . get_the_modified_time( 'Y年n月j日 H:i' ) . '</strong></div>'; //日付と時間に分離 $modified = explode( ' ', get_the_modified_time( 'Y-m-d H:i' ) ); //時間と分に分離 $modified_time = explode( ':', $modified[1] ); //時間のSELECT $hour = '<select name="modified_hour">'; for( $i = 0; $i < 24; ++$i ) { $selected = ( $i == $modified_time[0] ) ? ' selected' : null; $hour .= '<option value="'.sprintf( '%02d', $i ).'"' . $selected . '>'.sprintf( '%02d', $i ).'</option>'; } $hour .= '</select>'; //分のSELECT $minute = '<select name="modified_minute">'; for( $i = 0; $i < 60; ++$i ) { $selected = ( $i == $modified_time[1] ) ? ' selected' : null; $minute .= '<option value="'.sprintf( '%02d', $i ).'"' . $selected . '>'.sprintf( '%02d', $i ).'</option>'; } $minute .= '</select>'; // Meta Box のHTML echo <<<EOF <ul> <li><label><input type="radio" name="modified_type" value="1" checked>更新時の日時(wordpress標準)</label></li> <li><label><input type="radio" name="modified_type" value="2">変更しない</label></li> <li><label><input type="radio" name="modified_type" value="3">指定</label><li> <li class="modified_select"><input type="text" name="modified_date" class="datepicker">{$hour}時{$minute}分</li> </ul> <script> jQuery(document).ready(function($){ $('.datepicker').datepicker(); $('.datepicker').datepicker('option', 'dateFormat', 'yy-mm-dd'); $('.datepicker').datepicker('setDate', '{$modified[0]}'); }); </script> <style> .modified_select input, .modified_select select { max-width:7em; line-height:100%; height:auto; vertical-align:middle; } .modified_select select { margin:0 5px; } </style> EOF; } // Set Save Post add_filter( 'wp_insert_post_data', 'set_modified_date' , '99', 2 ); // set_modified_date function set_modified_date( $data, $postarr ) { // Radioのチェックなし or [更新時の日時(wordpress標準)] if( !isset( $_POST['modified_type'] ) || $_POST['modified_type'] == 1 ) return $data; // Radioのチェックが[3]かつ日付がセットされてる場合は変更 それ以外は変更しない if( $_POST['modified_type'] == 3 && isset( $_POST['modified_date'] ) && $_POST['modified_date'] ) { $modified = $_POST['modified_date'] . ' ' . $_POST['modified_hour'] . ':' . $_POST['modified_minute'] . ':00'; $modified_gmt = get_gmt_from_date( $modified ); } else { $modified = get_the_modified_time( 'Y-m-d H:i:s' ); $modified_gmt = get_post_modified_time( 'Y-m-d H:i:s', true); } // Postデータの書き換え $data['post_modified'] = $modified; $data['post_modified_gmt'] = $modified_gmt; return $data; }
ScriptとStyle
「jQuery UI Script」「jQuery UI Style」でデートピッカー用のスクリプトとスタイルを読み込ませます。
デートピッカーはwordpressにあるものを使用していますがスタイルはないのでcode.jquery.comにホストされているものを読み込ませています。
メタボックス①
// Meta Box add_action('admin_menu', 'add_modified_date'); // add_modified_date function add_modified_date() { add_meta_box('custom_modified_date', '更新日時', 'custom_modified_date', 'post', 'side', 'high'); }
この部分で投稿画面にメタボックスを表示させています。
このコードでは「投稿」のみですが、add_meta_boxの「post」の部分を変更させることによって固定ページやカスタム投稿などでも表示させることが可能です。
この部分は配列でも指定できましたので複数ある場合はそれで指定して下さい。
// 複数ある場合 add_meta_box('custom_modified_date', '更新日時', 'custom_modified_date', array( 'post', 'page', 'カスタム投稿スラッグ' ) 'side', 'high');
メタボックス②
メタボックス内のソースは「custom_modified_date」で設定しています。
コメントを読んでいただければだいたいわかると思いますが少し補足を。
- 公開日時が分までしか変更できない仕様になってましたのでそれに合わせました。
「指定」で変更すると秒は「00」になる仕様です。 - デフォルトで「更新時の日時(wordpress標準)」にチェックが入るようにしています。
scriptはデートピッカー用なのですが
$('.datepicker').datepicker('setDate', '{$modified[0]}');
ここでデフォルトに日付(現在の更新日付)をセットしています。
inputのvalueではデフォルト値をセット出来ませんのでご注意を。
更新処理
// Set Save Post add_filter( 'wp_insert_post_data', 'set_modified_date' , '99', 2 );
カスタムフィールドを更新する際は「save_post」を使うと思うのですが、ここでは記事データそのものを変更しますので「wp_insert_post_data」を使用し、記事を更新する前にデータの書き換えを行います。
// Radioのチェックなし or [更新時の日時(wordpress標準)] if( !isset( $_POST['modified_type'] ) || $_POST['modified_type'] == 1 ) return $data;
チェックが入ってない場合や「更新時の日時(wordpress標準)」を選択している場合はデータをそのまま返しwordpress通常の処理を行います。
// Radioのチェックが[3]かつ日付がセットされてる場合は変更 それ以外は変更しない if( $_POST['modified_type'] == 3 && isset( $_POST['modified_date'] ) && $_POST['modified_date'] ) { $modified = $_POST['modified_date'] . ' ' . $_POST['modified_hour'] . ':' . $_POST['modified_minute'] . ':00'; $modified_gmt = get_gmt_from_date( $modified ); } else { $modified = get_the_modified_time( 'Y-m-d H:i:s' ); $modified_gmt = get_post_modified_time( 'Y-m-d H:i:s', true); }
(if)チェックが「指定」かつ日付がセットしている場合は変更処理を行います。
- $modified = ~
入力した日付と時間・分を結合し、更新日時データを変数にセットします。
形式は「Y-m-d H:i:s」です。 - $modified_gmt = ~
GMT用の更新時間を作成します。先程作成した更新時間を日本時間としてGMTを取得し変数にセットします。
(else)上記の処理以外は更新時間を変更しません。
現在登録されている更新時間を取得し変数にセットしておきます。
最後に返り値の変更を行います。
// Postデータの書き換え $data['post_modified'] = $modified; $data['post_modified_gmt'] = $modified_gmt;
誤字脱字の変更程度でも更新日時が変わるのもどうかなぁと思って作ってみました。
基本は標準の処理で必要なときだけ任意で指定する使い方がいいかなと思って上記のような形になりました。
自分で何度がテストしましたが、もし何かありましたらコメント欄にてご報告くださるとありがたいです。