WordPressのカスタマイズ方法やプラグインレビューを中心に、パソコン/動物/植物のことなどを紹介するホームページです
[WordPress] How to update posts, fixed pages, and custom post types without changing the "update date"

【WordPress】「更新日」を変更しないで投稿や固定ページ、カスタム投稿タイプの更新を行う方法

公開日:2016年8月22日 使い方など

WordPressでは、コンテンツを作成したときや過去のコンテンツを修正するとき、「更新日」という項目が今の日時に変更され、いつ更新されたかが分かるようになっています。古いコンテンツでも更新されていることが解るので必要かつ便利な機能なのですが、更新されてしまうと都合の悪いことありませんか?例えば

  1. ちょっと文章を修正したいとき
  2. 使わなくなったショートコードを入れ替えるだけのとき
  3. 古い広告コードを貼り替えるだけのとき
  4. 時事ネタなので更新日を変更せずにコンテンツに詳しい情報だけを追加したいとき
  5. アイキャッチ画像だけを変更や追加したいとき
  6. 公開した翌日などに「あ!しまった!」を修正するとき

など、特にたくさんのコンテンツを修正する場合には更新日はそのままにしておきたいときもあるもの。

また、最近では更新日に関する情報はGoogleなどの検索エンジンからも読み取られ、更新された情報として反映されると不都合なこともあるかもしれません。

かくいう私も同じジャンルの情報は同じような文章の流れでコンテンツを作りたいので、「この方がいい感じ」と思うと過去のものへ遡って全部修正するということがありますから、以前から「更新日を更新しない方法ないかなぁ」と思っていました。

もっと言えば私の作るサイトのトップページにある更新一覧は更新日を基準に表示していますから、なおさら「ちょっと修正」したものが更新として表示されることを避けたいことと、最終更新から一定期間経ったコンテンツには「古い記事や投稿ですよ~」とお知らせするようにしていますから、なおさら避けたいところです。

プラグインでいろいろ探してみましたが見当たらず、半ば仕方ないとあきらめていましたが、インターネット、特にWordPress関連の情報というのは実にすごいもの、きちんと対応方法が紹介されていましたので、自分なりの解釈とおまけ情報を含めて紹介します。

参考にさせていただいた情報

私はプログラマーではありませんのでこんなコードを書くのは到底無理。以下のサイトを参考にさせていただきました

記事を修正した時に更新日時(modified_time)を変更せずに保存する方法

のフォーラムで取り上げられている内容を基に

更新日時(modified_time)を変更せずにWordPressの記事を修正する方法

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

などを参考にしました。基本コードはそのままですが、文末に固定ページやカスタム投稿タイプでも使えるようにする方法を追加しています。

更新日を変更するかどうかを選択して投稿を更新する方法

以下のコードをテーマのfunctions.phpへそのまま追加するだけで、投稿編集画面右上に新しく「更新日のアップデート」という窓が追加され、

  1. 「更新する」を選択して「更新」ボタンをクリックした場合は更新日をアップデート(現在の日付と時刻に)する
  2. 「更新しない」を選択して「更新」ボタンをクリックした場合は更新日をアップデートしない
/*更新日をアップデートする/しないを選択して更新を実行*/
/*①管理画面が開いたときに実行*/
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', 'low' );
}

/* ④投稿画面に表示するフォームの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;
}

固定ページやカスタム投稿タイプも含めて機能させる方法

この一連のコードはカスタムフィールドを作って、そこに一旦更新日を格納するかしないかを選択、その後更新ボタンが押されたときに上書きするしないという動作をします。

要するにカスタムフィールドが追加されていればどんな投稿タイプでも使えるということになりそうなのでテストしてみたところ上手く動きましたので、おまけ情報として紹介します。

③カスタムフィールドを投稿画面に追加の部分を修正

一連のコードではこの段階でカスタムフィールドを作る動作をしているので、ここのコードをちょっと改造します。
元のコードは

/* ③カスタムフィールドを投稿画面に追加 */
function add_update_level_custom_box() {
//ページ編集画面にカスタムメタボックスを追加
add_meta_box( 'update_level', '更新レベル', 'html_update_level_custom_box', 'post', 'side', 'high' );
}

この中の‘post’という記述を○○を含めるという形に変更します。変更するコードは
array(‘post’,’追加するポストタイプ’)
です。これを

  1. ‘post’の部分へ上書きします
  2. 「追加するポストタイプの部分」へ固定ページやカスタム投稿タイプ名を追加します(複数の場合は「,(コンマ)」で区切る)

例えば固定ページ(page)とtestというカスタム投稿タイプを追加する場合は
array(‘post’,’page’,’test’)
というふうにします。これで追加したポストタイプで同様の動作をするようになります。

functions.phpへコードを追加する前に

ちょっとまった!!この情報を見て「ふんふん、このコードをコピペすればいいのね!」と安易にfunctions.phpへコード追加してはいけません。functions.phpというのはとても大事なファイルで、編集に失敗すると画面が真っ白になってサイトの表示どころか管理画面すら入れなくなりますから細心の注意を払ってくださいね。

安全にコードを追加する方法や万が一の際の対象方法などは以下のページを参考になさってください

テーマのfunctions.phpへ挿入するコードを管理するプラグイン「Code Snippets」

【WordPress】テーマのfunctions.php編集に失敗して画面が真っ白になったときの対応

【WordPress】テーマのfunctions.phpを編集したらログインやサイト表示などができなくなったときは

おまけ② ping送信やプッシュ通知の対応/最終更新日が古いコンテンツに表示するメッセージ

この方法でデータベース上に格納されている更新日を更新(ややこしいなぁ)しないように設定することはできました。あと懸念されるのが、その際に更新通知であるping送信やpush通知はどうなるんだろうということ。前述した通り私はプログラマーではないので詳しいことは言えないのですが、恐らく制御していないので通常通り送られてしまうと思います。そこでたくさんのコンテンツを一気に編集するときは、

【WordPress】投稿の公開情報を通知するプラグイン「WordPress Ping Optimizer」の本当の使い方

で紹介しているようにping送信を制限し、Push通知に使っている「Push Press」プラグインを停止して、無駄に通知を行ってスパムと認識されたりサーバーに負荷をかけないよう工夫しています。

それから文頭でさらっと書いた古いコンテンツに「この情報は古いですよ~」とお知らせする機能ですが、今回同様functions.phpへ追記するだけで機能させることができますので併せて紹介しておきますね。

【WordPress】最終更新日から一定期間経過している投稿に「古い情報」であることを自動で表示するコード

いろいろとカスタマイズできるWordPressですが、これでますます便利に使えるのでは?と願っております。

WordPressのカスタマイズ・不具合対応などご相談ください

Wordpressのカスタマイズ、不具合解消のご相談はすべてココナラのダイレクトメッセージからお受けしております。まずはこちらのバナーからお気軽にお問い合わせください。