2. 8. 4 投稿作成のカスタマイズ(4)プレビュー

プレビュー

 プレビューに次のような問題点があります。
   ・本人の下書をプレビューすると、上書きされる。
   ・本人の下書以外は、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' );

 このプログラムをお使いになる場合は、お使いになる方の自己責任でお願いします。

更新日:2016/03/23
掲載日:2015/12/16