WordPress 記事の更新日時を自由に変更する:改造版
2015/02/04 追記: ブログ書く際にソースがメチャ重複してました。修正しました orz
2016/04/27 追記: WpTHK に搭載してるものと(ほぼ)同じ内容に変更(全く同じではない)
2016/10/18 追記: WpTHK の翻訳が残ってて、表示が英語になっちゃってたので修正
WordPress で記事を書いてると、
結構、頻繁に誤字を修正したいとか、日本語の言い回しを変えたい
ってことがある。
でも、記事に「公開日時」の他に「更新日時」も表示してる場合、
内容は変わらない程度の、軽い修正のたびに更新日時が変更されるって、どーなのよ?
と思い。
更新日時を変更せずに記事の修正ができないかな?(できればプラグイン使わず)
と Google さんで探してみた。
(元ネタ)更新日時を変更せずにWordPressの記事を修正するバージョン
まぁ、WordPress ネタであれば、たくさん見つかるだろう
と思ってたんだけど。
意外となかった。とりあえず、2件見つかったw
しかも、ネタ的には同じものだったw
両方の記事を拝見したところ、
元ネタは、Wordpress のフォーラムだったみたい。
http://ja.forums.wordpress.org/topic/57495
で、おいらも同じように実装してみた。(ソースは元ネタ参照)
おおー
素晴らしいじゃないですか! (゜Д゜)
「通常更新」は、その名の通り、通常の更新。
「修正のみ」を選択すれば、更新日時を変更せずに記事修正ができる仕組み。
スバラです! (`・ω・´)b
(改造版)更新日時を自由に変更できちゃうバージョン
こういうのを見ると、なぜか改造したくなるw
もともとWordpressのデフォルト機能で
「公開日時」は自由に変更できる。
なら、「更新日時」も自由に変更できたっていいじゃないw
なんてことを思ったわけですよ。
で、元ネタのソースをベースにして
半日くらいかけて、ちょこちょこ作ってみた改良バージョンが
↓ コレ
ボタン選択の上2つ
「通常更新」と「修正のみ」は、
もともとの機能と同じ。
- 更新日時消去(公開日時と同じにする)
- 更新日時変更
の2つを機能として追加した。
「更新日時消去(公開日時と同じにする)」は、その名の通り、
更新日時と公開日時を同じにするだけです。
Wordpress のテーマにもよるけど、更新日時と公開日時が同じ場合は
更新日時を表示しないパターンがあるので、「更新日時消去」って名前にしてます。
「更新日時変更」は下にある日付入力で
自由な更新時間に変更できる機能です。
ただ・・・
自由とは言っても、2038年問題があるので
サーバーが32bit環境の場合、
1970年1月1日~2038年1月19日の範囲内しか更新できません。
ソース
ソースです。
くっそ長いですw
元ネタのソースが49行だったのに、
100行超えました・・・orz
それと、念のため・・・
もし、使ってやろうという方がいらっしゃっても、
自己責任でお願いします。
不具合が発生しても、責任は負いかねます。
それと、これ以上ソースを長くしたくなかったので、
Wordpress の「公開日時」のような厳しい日付チェックしてないです。
間違って、あり得ない数字(32日とか)や数字以外を入力しちゃうと
1970年1月1日で更新されます。
その場合、「通常更新」や「更新日時消去(公開日時と同じにする)」で
修正してください。
以下、functions.php に追加。
<?php
//---------------------------------------------------------------------------
// 記事投稿(編集)画面に更新レベルのボックス追加
//---------------------------------------------------------------------------
/* ボックス追加 */
if( function_exists( 'thk_post_update_level' ) === false ):
function thk_post_update_level() {
add_meta_box( 'update_level', '更新方法', 'post_update_level_box', 'post', 'side', 'default' );
add_meta_box( 'update_level', '更新方法', 'post_update_level_box', 'page', 'side', 'default' );
}
add_action( 'admin_menu', 'thk_post_update_level' );
endif;
/* メインフォーム */
if( function_exists( 'post_update_level_box' ) === false ):
function post_update_level_box() {
global $post;
?>
<div style="padding-top: 5px; overflow: hidden;">
<div style="padding:5px 0"><input name="update_level" type="radio" value="high" checked="checked" />通常更新</div>
<div style="padding: 5px 0"><input name="update_level" type="radio" value="low" />修正のみ(更新日時を変更せず記事更新)</div>
<div style="padding: 5px 0"><input name="update_level" type="radio" value="del" />更新日時消去(公開日時と同じにする)</div>
<div style="padding: 5px 0; margin-bottom: 10px"><input id="update_level_edit" name="update_level" type="radio" value="edit" />更新日時を手動で変更</div>
<?php
if( get_the_modified_date( 'c' ) ) {
$stamp = '更新日時: <span style="font-weight:bold">' . get_the_modified_date( __( 'M j, Y @ H:i' ) ) . '</span>';
}
else {
$stamp = '更新日時: <span style="font-weight:bold">未更新</span>';
}
$date = date_i18n( get_option('date_format') . ' @ ' . get_option('time_format'), strtotime( $post->post_modified ) );
?>
<style>
.modtime { padding: 2px 0 1px 0; display: inline !important; height: auto !important; }
.modtime:before { font: normal 20px/1 'dashicons'; content: '\f145'; color: #888; padding: 0 5px 0 0; top: -1px; left: -1px; position: relative; vertical-align: top; }
#timestamp_mod_div { padding-top: 5px; line-height: 23px; }
#timestamp_mod_div p { margin: 8px 0 6px; }
#timestamp_mod_div input { border-width: 1px; border-style: solid; }
#timestamp_mod_div select { height: 21px; line-height: 14px; padding: 0; vertical-align: top;font-size: 12px; }
#aa_mod, #jj_mod, #hh_mod, #mn_mod { padding: 1px; font-size: 12px; }
#jj_mod, #hh_mod, #mn_mod { width: 2em; }
#aa_mod { width: 3.4em; }
</style>
<span class="modtime"><?php printf( $stamp, $date ); ?></span>
<div id="timestamp_mod_div" onkeydown="document.getElementById('update_level_edit').checked=true" onclick="document.getElementById('update_level_edit').checked=true">
<?php thk_time_mod_form(); ?>
</div>
</div>
<?php
}
endif;
/* 更新日時変更の入力フォーム */
if( function_exists( 'thk_time_mod_form' ) === false ):
function thk_time_mod_form() {
global $wp_locale, $post;
$tab_index = 0;
$tab_index_attribute = '';
if ( (int) $tab_index > 0 ) {
$tab_index_attribute = ' tabindex="' . $tab_index . '"';
}
$jj_mod = mysql2date( 'd', $post->post_modified, false );
$mm_mod = mysql2date( 'm', $post->post_modified, false );
$aa_mod = mysql2date( 'Y', $post->post_modified, false );
$hh_mod = mysql2date( 'H', $post->post_modified, false );
$mn_mod = mysql2date( 'i', $post->post_modified, false );
$ss_mod = mysql2date( 's', $post->post_modified, false );
$year = '<label for="aa_mod" class="screen-reader-text">年' .
'</label><input type="text" id="aa_mod" name="aa_mod" value="' .
$aa_mod . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" />年';
$month = '<label for="mm_mod" class="screen-reader-text">月' .
'</label><select id="mm_mod" name="mm_mod"' . $tab_index_attribute . ">\n";
for( $i = 1; $i < 13; $i = $i +1 ) {
$monthnum = zeroise($i, 2);
$month .= "\t\t\t" . '<option value="' . $monthnum . '" ' . selected( $monthnum, $mm_mod, false ) . '>';
$month .= $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) );
$month .= "</option>\n";
}
$month .= '</select>';
$day = '<label for="jj_mod" class="screen-reader-text">日' .
'</label><input type="text" id="jj_mod" name="jj_mod" value="' .
$jj_mod . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />日';
$hour = '<label for="hh_mod" class="screen-reader-text">時' .
'</label><input type="text" id="hh_mod" name="hh_mod" value="' . $hh_mod .
'" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
$minute = '<label for="mn_mod" class="screen-reader-text">分' .
'</label><input type="text" id="mn_mod" name="mn_mod" value="' . $mn_mod .
'" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
printf( '%1$s %2$s %3$s @ %4$s : %5$s', $year, $month, $day, $hour, $minute );
echo '<input type="hidden" id="ss_mod" name="ss_mod" value="' . $ss_mod . '" />';
}
endif;
/* 「修正のみ」は更新しない。それ以外は、それぞれの更新日時に変更する */
if( function_exists( 'thk_insert_post_data' ) === false ):
function thk_insert_post_data( $data, $postarr ){
$mydata = isset( $_POST['update_level'] ) ? $_POST['update_level'] : null;
if( $mydata === 'low' ){
unset( $data['post_modified'] );
unset( $data['post_modified_gmt'] );
}
elseif( $mydata === 'edit' ) {
$aa_mod = $_POST['aa_mod'] <= 0 ? date('Y') : $_POST['aa_mod'];
$mm_mod = $_POST['mm_mod'] <= 0 ? date('n') : $_POST['mm_mod'];
$jj_mod = $_POST['jj_mod'] > 31 ? 31 : $_POST['jj_mod'];
$jj_mod = $jj_mod <= 0 ? date('j') : $jj_mod;
$hh_mod = $_POST['hh_mod'] > 23 ? $_POST['hh_mod'] -24 : $_POST['hh_mod'];
$mn_mod = $_POST['mn_mod'] > 59 ? $_POST['mn_mod'] -60 : $_POST['mn_mod'];
$ss_mod = $_POST['ss_mod'] > 59 ? $_POST['ss_mod'] -60 : $_POST['ss_mod'];
$modified_date = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $aa_mod, $mm_mod, $jj_mod, $hh_mod, $mn_mod, $ss_mod );
if ( ! wp_checkdate( $mm_mod, $jj_mod, $aa_mod, $modified_date ) ) {
unset( $data['post_modified'] );
unset( $data['post_modified_gmt'] );
return $data;
}
$data['post_modified'] = $modified_date;
$data['post_modified_gmt'] = get_gmt_from_date( $modified_date );
}
elseif( $mydata === 'del' ) {
$data['post_modified'] = $data['post_date'];
}
return $data;
}
add_filter( 'wp_insert_post_data', 'thk_insert_post_data', 10, 2 );
endif;
ディスカッション
コメント一覧
こんにちは。
更新日時編集用コード使わせていただきました。ありがとうございます。
ところで機能的には問題なさそうですが、メニューが英語表記になってしまうんです。特に問題はないんですが簡単に日本語に直す方法などありますでしょうか。適用したテーマはmicata2の子テーマです。
kalingon さん。
ごめんw
WpTHK 内蔵版に書き換えた時に、
WpTHK の翻訳ファイルが必要な部分を書き換えるの忘れて申した。
英語の部分を日本語に書き換えましたので、
もう一度コピペしてみてください。
Whoooh!
日本語になりました!
感謝、感謝です!
おかげさまでサイトもでき、満足しています。
ありがとうございます。
ご回答ありがとうございます。
プランが固まれば、お見積り等をお願いしたいと思います。
ありがとうございました。
アッシュさん
もともと企業を対象にしたフリーエンジニアなので、
他の仕事との兼ね合いもありますが、
内容次第で見積もりは出せます。
お問い合せページから、お問い合せいただけますでしょうか。
上手くできました!ありがとうございます。
そこで一つお願いと言うか質問なのですが、有料で今回のようなコードをお願いすることは可能でしょうか?
お金だすから教えろ!的な意味では有りませんので、不愉快に思われたなら削除お願いします。
実現したい事がまだあるので、お手伝い頂ければ嬉しいです。
ありがとうございます!!
出来ました!!感謝です。
更新だけ必要なので、投稿日の下記部分は削除しました。
$my_data[‘post_date’] = $comment_data->comment_date;
$my_data[‘post_date_gmt’] = $comment_data->comment_date_gmt;
問題ないと思うのですが、素人判断だったかも?
MTからWPへ移行中なのですが、WPは慣れていないだけかも?ですが難しいですね。
本当にありがとうございました。
また、お邪魔させて頂きます。
コメントが投稿されたら、そのコメントに紐付けられた記事の投稿日時と更新日時を
コメントされた日時に更新したい。
という解釈でよいでしょうか?
であれば、
以下、functions.php に追加
のような感じでどうでしょ?
とりあえず、やっつけで書いたコードなので、
もっと良い方法があるかもしれませんが・・・
るな様
返信ありがとうございます。
何もわからないままWPに挑戦しているので、基本がわかっていないですね。(すみません)
今回私がしたいのは、コメントの更新ではなくて、コメントされたページの更新です。
プラグインを使わず掲示板を作成中ですが
「get_comments」では、同じ投稿ページが出てくるので無理と考えて更新順で並べる方法を考えました。
しかし、コメント投稿では更新日は変更されないようなので、困っています。
コメント投稿で更新日を変更する方法
もしくは
その他で実現できる方法がありましたら、ご教授お願いしたいです。
イメージは、このページです。
http://www.ashh.net/bbs/
アッシュさん
コメントありがとうございます。
コメント投稿の更新日時を変更したいとのことですが、
そもそも、Wordppress では、コメントテーブルに「更新日時」のフィールドがないです。
→ テーブル: wp_comments
なので、更新日時を表示・変更するには、
まず、コメントテーブルにフィールドを追加する必要があるため、
少々、面倒かと思います・・・
有益な記事をありがとうございます。
私は記事とは逆にコメント投稿でも自動で更新日を変更したいと考えています。
(掲示板ページのみ)
方法について良いアイデア等をお気付きであれば、ご教授願いたいです。
よろしくお願い致します。
ピンバック & トラックバック一覧
[…] WordPress 記事の更新日時を自由に変更する:改造版 […]