プレビュー
プレビューに次のような問題点があります。
・本人の下書をプレビューすると、上書きされる。
・本人の下書以外は、autosaveされるが、カスタムフィールドに保存できない。
・保存後に表示されるメッセージのプレビューでは、上書きされるか確認が必要。
・このメッセージのプレビューでは、同一タブに表示されたりされなかったり。
一般ユーザーが使いやすいようにする必要があります。
方法は次の通りです。
・プレビュー専用のカスタム投稿タイプを登録する。
・フック'admin_init'でHTTPリクエスト変数の'action'を書き換える。
・フック'admin_action_'で自動保存等が行われる前に分岐する。
・カスタム投稿タイプとして保存し、これを表示する。
・保存後に表示されるメッセージからプレビューを削除する。
カスタム投稿タイプはこれまで使っていませんでしたが、プレビュー用には適していると思います。
(1)カスタム投稿タイプ登録
アドミニメニューに表示するようにしています。デバッグ目的と不用なファイル削除用です。
(2)プレビューボタンがクリックされたかどうかの判定
プレビューボタンをクリックすると、'wp-preview'という名前の一行テキストボックスに'dopreview'という値がセットされます。この値の有無で判定できます。
(3)カスタム投稿保存
保存時のパラメータの'post_status'は、'draft'にする必要があります。'draft'以外は表示でエラーになります。このエラーを回避するには、管理画面の 設定→パーマリンク設定 を開く必要があります。'draft'の場合は、問題ありません。
プレビュー用ファイルは一人一つにしています。
コード
// -------------------------------- // カスタム投稿タイプ登録 // hk_temp:プレビュー用 // -------------------------------- function hk_functions_custom_init() { $args = array( 'label' => 'hk_temps', 'public' => true, 'exclude_from_search' => true, 'menu_position' => 100, 'labels' => array( 'name' => '一時ファイル', 'all_items' => '一時ファイル一覧', 'edit_item' => '一時ファイルの編集' ), 'supports' => array( 'title', 'editor', 'custom-fields', ), ); register_post_type( 'hk_temp', $args ); return; } add_action( 'init', 'hk_functions_custom_init' ); // -------------------------------- // プレビュー action 修正 // -------------------------------- function hk_functions_admin_init_preview() { if ( isset($_POST['wp-preview']) && 'dopreview' == $_POST['wp-preview'] ) { unset( $_GET['action'] ); unset( $_POST['action'] ); $_REQUEST['action'] = 'hk_preview'; } return; } add_action( 'admin_init', 'hk_functions_admin_init_preview' ); // -------------------------------- // プレビュー カスタム投稿保存 // -------------------------------- function hk_preview() { // パラメータ削除 $_POST['wp-preview'] = ''; // user_id $user_id = get_current_user_id(); // 新投稿パラメータ $user_id = get_current_user_id(); $new_args = array( 'post_title' => $_POST['post_title'], 'post_content' => $_POST['content'], 'post_author' => $user_id, 'post_name' => 'hk_temp_'.$user_id, 'post_status' => 'draft', 'post_type' => 'hk_temp', ); // プレビュー用ファイル有無 $args = array( 'author' => $user_id, 'post_type' => 'hk_temp', 'posts_per_page' => 1, ); $my_query = new WP_Query( $args ); // プレビュー用ファイル有 if ( $my_query->have_posts() ) { $my_query->the_post(); $old_post = get_post(); $post_id = $old_post->ID; // 新投稿パラメータ $new_args['ID'] = $post_id; wp_reset_postdata(); // データベースの投稿を更新 wp_update_post( $new_args ); } // プレビュー用ファイル無 else { // データベースに投稿を追加 $post_id = wp_insert_post( $new_args ); } // プレビュー用URL $url = get_permalink( $post_id ); wp_redirect( $url ); exit(); } add_action( 'admin_action_hk_preview', 'hk_preview' ); // -------------------------------- // 保存時のメッセージ プレビュー”削除 // -------------------------------- function hk_functions_post_updated_messages( $messages ) { // POST $messages['post'][ 1] = '投稿を更新しました。'; $messages['post'][ 6] = '投稿を公開しました。'; $messages['post'][ 8] = '投稿を作成しました。'; $messages['post'][ 9] = '投稿の公開を予約しました。'; $messages['post'][10] = '投稿の下書きを更新しました。'; // PAGE $messages['page'][ 1] = '固定ページを更新しました。'; $messages['page'][ 6] = '固定ページを公開しました。'; $messages['page'][ 8] = '固定ページを作成しました。'; $messages['page'][ 9] = '固定ページの公開を予約しました。'; $messages['page'][10] = '固定ページの下書きを更新しました。'; return $messages; } add_filter( 'post_updated_messages', 'hk_functions_post_updated_messages' );
このプログラムをお使いになる場合は、お使いになる方の自己責任でお願いします。