Füllen Sie WordPress wp_media modal mit Bildauswahl vor

32

Ich bin der Entwickler des Advanced Custom Fields-Plugins und hoffe, dass Sie mir bei einem Problem helfen können.

Ich habe eine Schaltfläche, über die Sie ein Bild bearbeiten können. Diese Schaltfläche startet ein WP 3.5-Medienmodal über die Funktion wp_media ().

Das Problem ist, dass ich ein Bild im Voraus auswählen möchte, damit dessen Details in das Seitenleistenfenster geladen werden.

Gegenwärtig bin ich mit dem 'offenen' Rückruf verbunden und führe einen Code aus, der diese Auswahl auffüllt, der jedoch klobig und ineffizient ist. So sieht es aus:

// _media is an object I am using

_media.frame = wp.media({
    title       :   'title',
    multiple    :   false,
    button      :   { text : 'button' }
});


// open
_media.frame.on('open',function() {


    // add class
    _media.frame.$el.closest('.media-modal').addClass('acf-media-modal acf-expanded');


    // set selection
    var selection   =   _media.frame.state().get('selection'),
        attachment  =   wp.media.attachment( id );


    attachment.fetch();
    selection.add( attachment );

});


// Finally, open the modal
_media.frame.open();

Dies funktioniert einwandfrei, bis der Benutzer ein anderes modales Fenster öffnet, die Registerkarte zum Hochladen auswählt und dann die von mir erstellte Schaltfläche zum Bearbeiten verwendet. Jetzt schlägt der Code vollständig fehl, da mein Code darauf angewiesen ist, dass sich das Modal im Durchsuchen-Modus befindet.

Ich habe einen Code gefunden, der den Frame in den Browse-Modus wechselt. Er sieht folgendermaßen aus:

_media.frame.content.mode('browse');

Das funktioniert manchmal, aber dann schlägt der folgende Code fehl. Wie es einige Zeit braucht, um zu rendern, bevor der Anhang zur Auswahl hinzugefügt werden kann ....

Sicher gibt es einen besseren Weg.

Danke für Ihre Hilfe. Elliot

Elliot Condon
quelle
Aufgrund der Komplexität dieser Frage, ist es vielleicht am besten , wenn Sie es als ein einfaches Plugin , das bündeln WPSE Benutzer über Github vorzugsweise installieren können, meta.wordpress.stackexchange.com/questions/2572/...
Wyck

Antworten:

3

Hier ist das Skript:

Ich benutze die Funktion loadImagesim folgenden Skript, um die vorhandenen angehängten Bilder über AJAX zu laden, und übergebe dann einfach die Funktion mit den IDs der Bilder und es wird ein vorab ausgefülltes Modal geöffnet.

var frame,
selection = loadImages(images);

$('#stag_images_upload').on('click', function(e) {
    e.preventDefault();

var options = {
    title: '<?php _e("Create Featured Gallery", "stag"); ?>',
    state: 'gallery-edit',
    frame: 'post',
    selection: selection
};

frame = wp.media(options).open();

frame.menu.get('view').unset('cancel');
frame.menu.get('view').unset('separateCancel');
frame.menu.get('view').get('gallery-edit').el.innerHTML = '<?php _e("Edit Featured Gallery", "stag"); ?>';
frame.content.get('view').sidebar.unset('gallery'); // Hide Gallery Settings in sidebar

// when editing a gallery
overrideGalleryInsert();
frame.on( 'toolbar:render:gallery-edit', function() {
    overrideGalleryInsert();
});

frame.on( 'content:render:browse', function( browser ) {
    if ( !browser ) return;
    // Hide Gallery Settings in sidebar
    browser.sidebar.on('ready', function(){
        browser.sidebar.unset('gallery');
    });

    // Hide filter/search as they don't work
    browser.toolbar.on('ready', function(){
        if(browser.toolbar.controller._state == 'gallery-library'){
            browser.toolbar.$el.hide();
        }
    });
});

// All images removed
frame.state().get('library').on( 'remove', function() {
    var models = frame.state().get('library');
    if(models.length == 0){
        selection = false;
        $.post(ajaxurl, { ids: '', action: 'stag_save_images', post_id: stag_ajax.post_id, nonce: stag_ajax.nonce });
    }
});

function overrideGalleryInsert(){
    frame.toolbar.get('view').set({
        insert: {
            style: 'primary',
            text: '<?php _e("Save Featured Gallery", "stag"); ?>',
            click: function(){
                var models = frame.state().get('library'),
                    ids = '';

                models.each( function( attachment ) {
                    ids += attachment.id + ','
                });

                this.el.innerHTML = '<?php _e("Saving...", "stag"); ?>';

                $.ajax({
                    type: 'POST',
                    url: ajaxurl,
                    data: { 
                        ids: ids, 
                        action: 'stag_save_images', 
                        post_id: stag_ajax.post_id, 
                        nonce: stag_ajax.nonce 
                    },
                    success: function(){
                        selection = loadImages(ids);
                        $('#_stag_image_ids').val( ids );
                        frame.close();
                    },
                    dataType: 'html'
                }).done( function( data ) {
                    $('.stag-gallery-thumbs').html( data );
                    console.log(data);
                });
            }
        }
    });
}

function loadImages(images){
    if (images){
        var shortcode = new wp.shortcode({
            tag:      'gallery',
            attrs:    { ids: images },
            type:     'single'
        });

        var attachments = wp.media.gallery.attachments( shortcode );

        var selection = new wp.media.model.Selection( attachments.models, {
            props:    attachments.props.toJSON(),
            multiple: true
        });

        selection.gallery = attachments.gallery;

        selection.more().done( function() {
            // Break ties with the query.
            selection.props.set({ query: false });
            selection.unmirror();
            selection.props.unset('orderby');
        });

        return selection;
    }
    return false;
}

});

Und hier ist die PHP-Funktion, die die AJAX-Anfrage bearbeitet:

function stag_save_images(){
    if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){
        return;
    }

    if ( !isset($_POST['ids']) || !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'stag-ajax' ) ){
        return;
    }

    if ( !current_user_can( 'edit_posts' ) ) return;

    $ids = strip_tags(rtrim($_POST['ids'], ','));
    update_post_meta($_POST['post_id'], '_stag_image_ids', $ids);

    $thumbs = explode(',', $ids);
    $thumbs_output = '';
    foreach( $thumbs as $thumb ) {
        $thumbs_output .= '<li>' . wp_get_attachment_image( $thumb, array(75,75) ) . '</li>';
    }

    echo $thumbs_output;

    die();
}
add_action( 'wp_ajax_stag_save_images', 'stag_save_images' );

function stag_metabox_scripts(){
    global $post;
    if( isset($post) ) {
        wp_localize_script( 'jquery', 'stag_ajax', array(
            'post_id' => $post->ID,
            'nonce' => wp_create_nonce( 'stag-ajax' )
        ) );
    }
}

add_action( 'admin_enqueue_scripts', 'stag_metabox_scripts' );

Ich habe gerade das Snippet aus meinem WordPress-Framework kopiert, ich hoffe, es macht Sinn.

Ram Ratan Maurya
quelle