自作のプラグインやテーマで独自の設定項目を追加する時に使われる「カスタムフィールド」。
割と簡単に導入できるんですが、しっかりと対策をしておかないと設定した値が消えてしまうことがあります。
例えば、予約投稿なんかもそうで、対策しないと記事が公開された途端に設定値が消えてしまいます。
対策
この問題を防ぐためにできることはいくつかあると思いますが、要は、投稿ステータスが「公開済み」になった時に削除処理をしなければいいわけです。
こちらがそのコード。
function transition_post_status_4536($new_status, $old_status, $post) {
if (($old_status == 'auto-draft'
|| $old_status == 'draft'
|| $old_status == 'pending'
|| $old_status == 'future')
&& $new_status == 'publish') {
return $post; //処理停止
} else {
//カスタムフィールドの値の処理
}
}
add_action('transition_post_status', 'transition_post_status_4536', 10, 3);
投稿ステータスが「予約済み」や「下書き」などの状態から「公開済み」になった時は処理をせずに、それ以外の場合だけカスタムフィールドの値を更新したり削除するというコードです。
ちなみに、下書き保存を一切せずに公開しても問題なくカスタムフィールドの値が保存されます。
delete_post_meta関数は必要
「そもそも、get_post_meta関数でカスタムフィールドの値を削除しなければいいのでは?」と思う方もいると思いますが、効果的な対策とは言えません。
- 入力ボックスを空欄になる
- チェックボックスを空にする
といった処理ができなくなるからです。
カスタムフィールドを使って何の処理をするかにもよりますが、削除処理の関数は使ってくださいね。
サンプルコード
こちらがサンプルコードです。
function save_custom_fields( $post_id ) {
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
if(isset($_POST['action']) && $_POST['action'] == 'inline-save') return $post_id;
if(!empty($_POST['lalala']))
update_post_meta($post_id, 'lalala', $_POST['lalala'] );
else delete_post_meta($post_id, 'lalala');
}
function transition_post_status_4536($new_status, $old_status, $post) {
if (($old_status == 'auto-draft'
|| $old_status == 'draft'
|| $old_status == 'pending'
|| $old_status == 'future')
&& $new_status == 'publish') {
return $post;
} else {
add_action('save_post', 'save_custom_fields');
}
}
add_action('transition_post_status', 'transition_post_status_4536', 10, 3);
まとめ
予約投稿から公開済みになるとカスタムフィールドの値が消える仕組みはよくわかっていませんが、対策としては効果的かと思います。
同様の問題で悩んでいる方にぜひ参考にしていただければ嬉しいです:)