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

シェアする

  • このエントリーをはてなブックマークに追加
  • 1
サイトURL変更しました。ブックマーク登録やリンク等はこちらのアドレスへお願いします(旧サイトへアクセスされた場合リダイレクトされます)

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

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

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

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

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

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

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

スポンサーリンク

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

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

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

ただの誤字修正や言い回しの変更で更新日時を変更したくない、というときに便利な方法です。
※Wordpress 4.0で動作確認しましたはじめに記事に、更新日付を表示するようになってから、ちょっとした修正時には更新日付を変更しなくないなぁと思っていたのですが、WPでどう実現した

で分かりやすく解説されていました。基本コードはそのままですが、文末に固定ページやカスタム投稿タイプでも使えるようにする方法を追加しています。

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

以下のコードをテーマの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というのはとても大事なファイルで、編集に失敗すると画面が真っ白になってサイトの表示どころか管理画面すら入れなくなりますから細心の注意を払ってくださいね。

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

Wordpressでいろいろとカスタマイズしようと思うと必ず出てくるのが「テーマのfunctions.phpにこのコードを挿入して・・・」という文言。一度でもやったことのある方や使い慣れている方にとっては何の問題もない作業ですが、初めての方だとすごく戸惑いますよね?今回はより安全にfunctions.phpの記述を変更...

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

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

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

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

これから紹介するコードは、こうしたトラブルを避けるための手法として、最終更新日から一定期間経過した投稿へアクセスして表示したときに「古い情報かもしれない」ことを自動で表示するためのものです。これによってすべての問題がクリアされるわけではありませんが、より親切なサイトを作るためには必要なことだと思います。

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

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加
Howdy,
Buy PRO version at http://wpclever.net to add more powerful tools to this place.