• 2018.07.12
  • WordPress

【WP】更新日を変更するか選択できるようにしたい

【WP】更新日を変更するか選択できるようにしたいのイメージ画像

以前【WordPress】記事を更新日順に表示させたいで紹介しましたが、記事を更新日順で表示させるようにカスタマイズしました。

しかし最近、ちょっとカテゴリーを変更したり文章の語尾を編集しただけでも最新の記事みたいに扱ってしまうことに、違和感を感じるようになってきました。

更新の内容によって、更新日を変更するかしないのか選択できるようにしたい、と思います。

function.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() {
    $post = isset($_GET['post']) ? $_GET['post'] :null;
  $update_level = get_post_meta( $post, 'update_level' );
 
  $level = $update_level ? $update_level[0] : null;
  echo '<div style="padding-top: 3px; overflow: hidden;">';
  echo '<div style=" float: left;"><input name="update_level" type="radio" value="high" ';
  echo ' />更新する</div><div><input name="update_level" type="radio" value="low" ';
  echo ' checked="checked"';
  echo '/>更新しない<br /></div>';
  echo '<p class="howto" style="margin-top:1em;">更新日時を変更するかどうかを設定です。変更したい時は「更新する」にチェックを入れて下さい。</p>';
  echo '</div>';
}
 
//設定したカスタムフィールドの値をDBに書き込む記述
function save_custom_field_postdata( $post_id ) {
  $mydata = isset($_POST['update_level']) ? $_POST['update_level'] : null;
  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 = isset($_POST['update_level']) ? $_POST['update_level'] : null;
    if( $mydata == "low" ){
        unset( $data["post_modified"] );
        unset( $data["post_modified_gmt"] );
    }
    return $data;
}

ちなみに私は修正が多いので、デフォルトを「更新しない」にしてます。
公開するときに、忘れず「更新する」にしないといけませんが。。。
上記もその設定なので、違うパターンはまた後日記載しますね。