web-dev-qa-db-fra.com

Déclenche la boîte de dialogue "modifications non enregistrées" pour les modifications postérieures méta personnalisées

J'utilise un type de publication personnalisé avec des champs méta personnalisés, mais l'enregistrement automatique et la boîte de dialogue "modifications non enregistrées" ne semblent pas être déclenchés pour ces champs méta personnalisés. L'enregistrement automatique n'est pas aussi important pour moi que la boîte de dialogue des modifications non enregistrées - y a-t-il un moyen de le déclencher?

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']);
}
2
Kevin

Le code en effet ne regarde que l'éditeur TinyMCE ou le champ de titre et de contenu si l'éditeur est masqué:

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;
    }
};

Vous pouvez remplacer ce gestionnaire onbeforeunload par le vôtre (assurez-vous d'inclure la fonctionnalité existante, bien sûr). Ou jouez avec l'état isDirty() de l'éditeur TinyMCE et cette valeur autosaveLast?

2
Jan Fabry

J'ai résolu ce problème en utilisant cet excellent plugin jQuery qui vérifie l'état de données incorrect d'un formulaire. Il contient des méthodes pour vérifier les champs ajoutés/supprimés/modifiés via javascript. Ça donne un coup de pied au cul!

Je n'ai pas manipulé le "AUTOSAVE" (pour le moment). J'espère que quelqu'un trouvera cela utile.

0
Alexandre Bourlier