WP2.7以降のリビジョン管理と自動保存を停止するプラグイン で配布しているプラグインの初版の処理内容の詳細は以下。

バージョンは 0 にしておきます。

プレビュークリック時の自動保存の仕組み

/wp-admin/js/post.js でプレビューのクリックをフックしている。
処理は submit で /wp-admin/post.php に投げている。

$('#post-preview').click(function(e){
if ( 1 > $('#post_ID').val() && autosaveFirst ) {
    autosaveDelayPreview = true;
    autosave();
    return false;
}

$('input#wp-preview').val('dopreview');
$('form#post').attr('target', 'wp-preview').submit().attr('target', '');
$('input#wp-preview').val('');
return false;
});

/wp-admin/post.php の post_preview() で、とある処理をしてプレビュー画面にリダイレクトしている。

elseif ( isset($_POST['wp-preview']) && 'dopreview' == $_POST['wp-preview'] )
    $action = 'preview';
(中略)
case 'preview':
    check_admin_referer( 'autosave', 'autosavenonce' );

    $url = post_preview();

    wp_redirect($url);
    exit();
    break;

post_preview() の処理には下書き以外の記事は自動保存する処理ある。

if ( 'draft' == $post->post_status ) {
    $id = edit_post();
} else { // Non drafts are not overwritten.  The autosave is stored in a special post revision.
    $id = wp_create_post_autosave( $post->ID );
    if ( ! is_wp_error($id) )
        $id = $post->ID;
}

そんな感じで自動保存されてしまう。

対処方法

対処方法は以下の方法が考えられる。

$(‘#post-preview’).click をフックさせない。

または、post_preview() を呼ばずにプレビュー画面へリダイレクト。

JavaScript は苦手なのと、PHP の処理を抑えておくほうが安心なので後者を選択する。

プラグイン作成

下記の処理をするプラグインを入れる。

define('WP_POST_REVISIONS', false);
function disable_autosave_script() {
    wp_deregister_script('autosave');
}
function disable_autosave_check_admin_referer($action, $result) {
    if ($action != 'autosave') return $result;
    $url = get_permalink((int)$_POST['post_ID']);
    wp_redirect($url);
    exit();
}
add_action('wp_print_scripts', 'disable_autosave_script');
add_action('check_admin_referer', 'disable_autosave_check_admin_referer', 10, 2);

トレードオフ

バグかと思っていたけど、プレビューをクリックしたら編集画面に書かれてある状態をプレビューしてくれるという仕様のような気がしてきた。

こうすることで、公開後に変更した状態を見たい場合に変更記事を自分だけが見ることができる。しかし、このプラグインを入れると公開後は更新をして誰でも見れる状態にしないと見ることができないので、編集中に確認する場合でも第三者が閲覧できる状態になってしまう。

下記の対処の影響だとすると検討不十分の気もする。自動保存を無効にしたい人のことまで気にする必要はないと考えている気もする。プラグインで対処できる余地があるので、考えてくれてはいるのだろう。

細かいけどユーザビリティが向上してるところ(下書きの自動保存がリアルタイムで表示されたりとか)

さばかん 自宅サーバーBlog – WordPress 2.7 日本語 正式版公開

いずれにせよ、どちらもそれなりに意味があるので、メリット、デメリットを判断した上で採用を決めたほうがよい。

参考

はじめは、JavaScript で対処しようとしていたのでそのときの調べもの。
jQuery 1.3.2 日本語リファレンス
jQueryのreadyメソッドはonloadイベントより前に呼ばれる at HouseTect, JavaScripter Blog
jQuery()の挙動を解読する(21) $(document).ready(f)、bindReady()、$.ready() 解読 ──jQuery解読(32)

この記事のトラックバックURL

トラックバック一覧

この記事にはトラックバックがついていません。

コメント一覧

この記事にはコメントがついていません。

RSS feed for comments on this post.

コメント投稿

:b-ok: :b-ng: :b-heart: :b-heartbreak: :b-note: :b-idea: :b-!: :b-?: :b-sleep: :b-up: :b-down: :b-run: :b-tear: :b-sweat: :b-cat: :b-star: :b-glitter: :b-silent: :b-anger: :b-black: :b-neutral: :b-weep: :b-cry: :b-grin: :b-shock: :b-shy: :b-smile: :b-angry: :b-redangry: :b-depress: :b-glad: :b-relieve: :b-surprised: :b-tired: :b-fascinated: :b-oops: :b-amazed: :b-absent: :b-happy: :b-discouraged:

zontheworld
うまい焼肉が喰いたい。
HTML convert time: 0.251 sec. ( Login )