カスタムフィールドを使って、使いやすくはしてみたものの、「プレビューに反映されないんですけど!?」と言われてお嘆きの貴方に。
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)