更新日時を変更せずにWordPressの記事を修正する方法 【post_modified】

  • 投稿 : 2014-10-06
※Wordpress 4.0で動作確認しました

はじめに

記事に、更新日付を表示するようになってから、ちょっとした修正時には更新日付を変更しなくないなぁと思っていたのですが、WPでどう実現したらよいのかわからず保留にしてたのですが、今回見つかったので紹介しておきます。

情報源

WordPress › フォーラム » 記事を修正した時に更新日時(modified_time)を変更せずに保存する方法はな
更新日時(modified_time)を変更せずにWordPressの記事を修正する方法 *Ateitexe

1つ目のリンクのフォーラムのほうが1次情報だと思います。

補足

更新日付は、wp_postsテーブルの「post_modified」と「post_modified_gmt」というフィールドです。
動作確認するときは、上記の値を確認してみてください。
post_modified_gmtは、日本のサーバーだと9時間前(昔)の時間が設定されるかと思います。

方法

導入イメージ


投稿画面に、「通常更新」「更新のみ」が選択できる画面が追加されます。
そこで、「更新のみ」を選択すると「更新日時」が以前のままになります。

導入方法

テーマーの「functions.php」に以下を追加するだけです。
functions.phpがない場合は、そのファイルも作成する。

/**
 * 更新時に、更新日付を変更しない
 *
 */

// 管理画面が開いたときに実行 
add_action( 'admin_menu', 'add_update_level_custom_box' );
// 更新ボタンが押されたときに実行 
add_action( 'save_post', 'save_custom_field_postdata' );
 
// カスタムフィールドを投稿画面に追加 
function add_update_level_custom_box() {
    //ページ編集画面にカスタムメタボックスを追加
    add_meta_box( 'update_level', '更新レベル', 'html_update_level_custom_box', 'post', 'side', 'high' );
}
 
// 投稿画面に表示するフォームのHTMLソース 
function html_update_level_custom_box() {
    $update_level = get_post_meta( $_GET['post'], 'update_level' );
 
    echo '<div style="padding-top: 3px; overflow: hidden;">';
    echo '<div style="width: 100px; float: left;"><input name="update_level" type="radio" value="high" ';
    if( $update_level[0]=="" || $update_level[0]=="high" ) echo ' checked="checked"';
    echo ' />通常更新</div><div style="width: 100px; float: left;"><input name="update_level" type="radio" value="low" ';
    if( $update_level[0]=="low" ) echo ' checked="checked"';
    echo '/>修正のみ<br /></div>';
    echo '</div>';
}
 
// 設定したカスタムフィールドの値をDBに書き込む記述 
function save_custom_field_postdata( $post_id ) {
    $mydata = $_POST['update_level'];
    if( "" == get_post_meta( $post_id, 'update_level' )) {
        /* update_levelというキーでデータが保存されていなかった場合、新しく保存 */
        add_post_meta( $post_id, 'update_level', $mydata, true ) ;
    } elseif( $mydata != get_post_meta( $post_id, 'update_level' )) {
        /* update_levelというキーのデータと、現在のデータが不一致の場合、更新 */
        update_post_meta( $post_id, 'update_level', $mydata ) ;
    } elseif( "" == $mydata ) {
        /* 現在のデータが無い場合、update_levelというキーの値を削除 */
        delete_post_meta( $post_id, 'update_level' ) ;
    }
}
 
// 「更新」以外は更新日時を変更しない 
add_filter( 'wp_insert_post_data', 'my_insert_post_data', 10, 2 );
function my_insert_post_data( $data, $postarr ){
    $mydata = $_POST['update_level'];
    if( $mydata == "low" ){
        unset( $data["post_modified"] );
        unset( $data["post_modified_gmt"] );
    }
    return $data;
}
※ソースは、情報源と全く同じです。

ソースの補足


カスタムフィールドとして「update_level」が使用されています。

SELECT * FROM `wp_postmeta` WHERE `meta_key` LIKE 'update_level'
wp_postmetaというテーブルに、おそらく記事ID分だけ追加されていくかと思います。

スポンサーリンク