Запуск диалогового окна "несохраненные изменения" для пользовательских изменений мета-записей


Я использую пользовательский тип записи с пользовательскими мета-полями, но автосохранение и диалоговое окно "несохраненные изменения", похоже, не запускаются для этих пользовательских мета-полей. Автосохранение не так важно для меня, как диалоговое окно несохраненных изменений - есть ли способ его запустить?

function add_meta_boxes() {
    add_meta_box('places_location', __('Location'), array(&$this, 'location_box'), 'place', 'normal', 'high');
}

function location_box($post) {
    wp_nonce_field(plugin_basename(__FILE__), 'places_location_nonce');

    $lat = get_post_meta($post->ID, 'places_lat', true);
    $lng = get_post_meta($post->ID, 'places_lng', true);

    ?>
    <p>
        <label>
            Latitude:
            <input name="places_lat" value="<?php echo esc_attr($lat); ?>" />
        </label>
        <label>
            Longitude:
            <input name="places_lng" value="<?php echo esc_attr($lng); ?>" />
        </label>
    </p>
    <?php
}

function save_place($id) {
    // skip unverified location nonces
    if(!wp_verify_nonce($_POST['places_location_nonce'], plugin_basename(__FILE__))) return;

    // skip autosave calls
    // commenting this out still doesn't trigger saving these fields on autosave
    //if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // update our custom post meta
    update_post_meta($id, 'places_lat', (float)$_POST['places_lat']);
    update_post_meta($id, 'places_lng', (float)$_POST['places_lng']);
}
Author: Kevin, 2011-04-06

2 answers

Код действительно просматривает только редактор TinyMCE или поле заголовка и содержимого, если редактор скрыт:

window.onbeforeunload = function(){
    var mce = typeof(tinyMCE) != 'undefined' ? tinyMCE.activeEditor : false, title, content;

    if ( mce && !mce.isHidden() ) {
        if ( mce.isDirty() )
            return autosaveL10n.saveAlert;
    } else {
        title = $('#post #title').val(), content = $('#post #content').val();
        if ( ( title || content ) && title + content != autosaveLast )
            return autosaveL10n.saveAlert;
    }
};

Вы могли бы заменить это onbeforeunload обработчик с вашим собственным (обязательно включите существующую функциональность, конечно). Или поиграйте с состоянием isDirty() редактора TinyMCE и этим значением autosaveLast?

 2
Author: Jan Fabry, 2011-04-07 10:33:19

Я решил эту проблему с помощью этого превосходного плагина jQuery, который проверяет грязное состояние формы. Он содержит методы для проверки добавленных/удаленных/измененных полей с помощью javascript. Это просто надирает задницу!

Я не обрабатывал "АВТОСОХРАНЕНИЕ" (пока). Я надеюсь, что кто-то найдет это полезным.

 0
Author: Alexandre Bourlier, 2014-08-18 20:57:01