カスタムフィールドを使って、使いやすくはしてみたものの、「プレビューに反映されないんですけど!?」と言われてお嘆きの貴方に。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | function get_preview_id( $post_id ) { global $post ; $preview_id = 0; if ( $post ->ID == $post_id && is_preview() && $preview = wp_get_post_autosave( $post ->ID ) ) { $preview_id = $preview ->ID; } return $preview_id ; } function get_preview_postmeta( $return , $post_id , $meta_key , $single ) { if ( $preview_id = get_preview_id( $post_id ) ) { if ( $post_id != $preview_id ) { $return = get_post_meta( $preview_id , $meta_key , $single ); } } return $return ; } add_filter( 'get_post_metadata' , 'get_preview_postmeta' , 10, 4 ); function save_preview_postmeta( $post_ID ) { global $wpdb ; if ( wp_is_post_revision( $post_ID ) ) { $wpdb ->query( "DELETE FROM $wpdb->postmeta WHERE post_id = $post_ID" ); $post_metas = apply_filters( 'preview_post_meta_keys' , array ( 'meta' ) ); foreach ( $post_metas as $post_meta ) { foreach ( $_POST [ $post_meta ] as $meta_id => $meta_arr ) { add_metadata( 'post' , $post_ID , $meta_arr [ 'key' ], $meta_arr [ 'value' ] ); } } do_action( 'save_preview_postmeta' , $post_ID ); } } add_action( 'wp_insert_post' , 'save_preview_postmeta' ); |
デフォルトのUIに対応させただけのものなので、Custom Field Template や Editor Templates、Advanced Custom Fields での入力値に対応させたい場合は、save_preview_postmeta フックで、それぞれのプラグインの送信形式に合わせて、add_metadata(add_post_meta だと、公開中のデータを上書きしちゃうので注意)を実行するようにしてください。
※ 画像表示に影響が出るため、コードを一部修正しました。(2013/1/8)
get_preview_postmeta() のとこで、$key の値が “_wp_page_template” の時は $return をそのまんま返してあげないと、固定ページでデフォルト以外のテンプレートを選択したときに期待通りに動作しなかったです。おらおらー。