だれかのなにかに役立てるウェブ制作者YoTaの趣味ブログ

wordpress 予約投稿時にカスタムフィールドの値が消えるエラーの対処法

wordpress

最近、wordpressのカスタムフィールドで自作設定をしてみたところ、通常公開では問題なく動作していたのですが、そのカスタムフィールドの値が、予約投稿した時に消えるエラーが起きていました。

原因を追究したところ、単純にロジックミスでした。もしプラグインに頼らず、カスタム投稿でカスタムフィールドを自作した時に、予約投稿でうまくいかないって方がいましたら参考にしてみてください。

wordpressで予約投稿した時にカスタムフィールドの値が消えてしまうエラーが起きた時の対処法

原因はアクションフック「add_action」の「save_post」のソース部分でした

通常公開ではうまく機能しているということで、疑ったのは記録・保存の部分「save_post」でした。使っていたソースは、http://www.paka3.net/wpplugin28/のサイト様で公開されていたものを利用させて頂いて、下記のようなソースを使っていました。

add_action('save_post', 'customfield_value_save');

function customfield_value_save($post_id){
  $value_data = isset($_POST['value_data']) ? $_POST['value_data']: null;
  $value_data_ex = get_post_meta($post_id, 'value_data', true);

  if($value_data){
    update_post_meta($post_id, 'value_data',$value_data);
  }else{
    delete_post_meta($post_id, 'value_data',$value_data_ex);
  }
}

こちらは、ページが保存される際、「入力された値」と、「保存してある値」を取得し、「入力された値」があれば、update_post_metaで更新処理を行い、「入力された値」がなければ、delete_post_metaで削除処理を行うというものです。

しかし、どうも予約投稿をすると、「入力された値」が存在しても、削除処理が実施されてしまうようです。

そういうわけで、ものすごく乱暴に解決しようとすると、下記の具合です。

add_action('save_post', 'customfield_value_save');

function customfield_value_save($post_id){
  if($_POST['post_type'] == 'post'){
    update_post_meta($post->ID, 'value_data', $_POST['value_data']);
  }
}

要するに、削除処理のソースを入れないだけです。単純なカスタムフィールドであれば、ただupdate_post_metaを更新するだけでOKだと思います。

あとはnonce処理、自動保存ルーチンの時は処理しない、ユーザー権限の処理などを加えて、下記のソースにすると良さそうです。

add_action('save_post', 'customfield_value_save');
function customfield_value_save($post_id){
  global $post;
  $my_nonce = isset($_POST['my_nonce']) ? $_POST['my_nonce'] : null;
  if(!wp_verify_nonce($my_nonce, wp_create_nonce(__FILE__))) {
    return $post_id;
  }
  if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; }
  if(!current_user_can('edit_post', $post->ID)) { return $post_id; }
  if($_POST['post_type'] == 'post'){
    update_post_meta($post->ID, 'value_data', $_POST['value_data']);
  }
}

改良ソースには下記サイト様の内容を引用させて頂きました。

同じトラブルに遭った人もいたようですが、こちらの方は自己完結していました。記述してあるように、やはりロジックに問題があるとダメなようですね。

[解決済み] 予約投稿時にカスタムフィールドの値がクリアされてしまう。

まとめ

wordpressで予約投稿した時にカスタムフィールドの値が消えてしまうエラーが起きた時は、もし通常公開で問題がないなら、まずはロジックを疑ってみましょう。

ページ上部に戻る