¿Cómo usar el gestor de medios de WordPress 3.5 en un meta box?

12 dic 2012, 02:37:57
Vistas: 19.3K
Votos: 16

¿Es posible hacer esto?

Me encanta cómo funciona el nuevo gestor de medios. Supongo que tiene que ver con una llamada jQuery como la forma anterior.

EDITADO

Este es el código que estoy usando actualmente

jQuery(document).ready(function($) {
$('.custom_upload_image_button').click(function() {
    imageField = $(this).prev('input');
    tb_show('', 'media-upload.php?type=image&TB_iframe=true');
});
window.send_to_editor = function(html) {
    imgurl = $(html).attr('href');
    $(imageField).val(imgurl);
    tb_remove();
};
$('.clear_field').click(function() {
    var defaultImage = jQuery(this).parent().siblings('.custom_default_image').text();
    jQuery(this).parent().siblings('.custom_upload_image').val('');
    return false;
});
});
0
Todas las respuestas a la pregunta 5
4

Para comenzar, las funciones básicas y sobrescrituras que conozco hasta ahora. Puede haber mejores soluciones, pero solo he tenido dos días con la versión 3.5:

// abrir modal - vincula esto a tu botón
    if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
        wp.media.editor.open( ##unique_id_here## );

// copia de seguridad de la función send original
   original_send = wp.media.editor.send.attachment;

// nueva función send
   wp.media.editor.send.attachment = function( a, b) {
       console.log(b); // b contiene toda la información sobre el adjunto
       // o cualquier otra cosa que quieras hacer con los datos en este punto
       // la función original hace una llamada ajax para recuperar la etiqueta html de la imagen y hace algo más
    };

// wp.media.send.to.editor activará automáticamente window.send_to_editor por compatibilidad con versiones anteriores

// copia de seguridad de window.send_to_editor original
   window.original_send_to_editor = window.send_to_editor; 

// sobrescribir window.send_to_editor
   window.send_to_editor = function(html) {
       // el argumento html puede no ser útil en este caso
       // usa los datos de var b (adjunto) aquí para hacer tu propia llamada ajax o usa los datos de b y envíalos de vuelta a tus campos de entrada definidos, etc.
   }

Esta no es una respuesta completa y funcional. Debes definir y hacer seguimiento de tus campos de entrada por ti mismo, etc. Esto solo es para que comiences. Si tienes preguntas más concretas, solo pregunta.

Y asegúrate de reasignar las funciones originales cuando tu script haya terminado.


Extraído de los comentarios:

¿Cómo puedo escuchar el evento de cierre del lightbox?

// agregar listener:
wp.media.view.Modal.prototype.on('close', function(){ console.log('se activó el cierre'); }
12 dic 2012 08:35:42
Comentarios

¡Gracias! Pero no logro que funcione. He pegado arriba lo que he estado usando para el antiguo cargador de medios, por si ayuda.

souporserious souporserious
12 dic 2012 20:16:30

Ipstenu y el equipo de soporte han creado una lista maestra de problemas (http://wordpress.org/support/topic/troubleshooting-wordpress-35-master-list?replies=4) reportados para WordPress 3.5. Este hilo no está destinado a recibir comentarios de usuarios, sino que es un hilo curado que destaca rápidamente los problemas conocidos reportados, así como instrucciones sobre cómo solucionarlos.

Tara Tara
12 dic 2012 22:24:13

¿Cómo puedo escuchar el evento de cierre del lightbox? Necesito activar una función personalizada si alguien no elige una nueva imagen

Xaver Xaver
13 dic 2012 18:34:56

// agregar escucha: wp.media.view.Modal.prototype.on('close', function(){ console.log('cierre activado'); }

ungestaltbar ungestaltbar
14 dic 2012 00:16:23
1

Aquí tienes un pequeño tutorial sobre cómo usar el gestor de medios de WP 3.5 en las opciones del tema. Esto es lo que he implementado y me funciona perfectamente. Háznos saber si encuentras alguna solución mejor.

Así es como he implementado el código en las opciones de mi tema:

jQuery(document).ready(function($){
  $('.stag-metabox-table .button').click(function(e){
  var send_attachment_bkp = wp.media.editor.send.attachment;
  var button = $(this);
  var id = button.attr('id').replace('_button', '');
  wp.media.editor.send.attachment = function(props, attachment){
    $("#"+id).val(attachment.url);
    wp.media.editor.send.attachment = send_attachment_bkp;
  }

  wp.media.editor.open(button);
  return false;

  });
});

Actualización

Este código solo funciona en la página de edición de entradas. Para que funcione en la página de opciones del tema necesitas añadir wp_enqueue_media();

13 dic 2012 09:05:45
Comentarios

¿qué pasa si solo se permite seleccionar una sola imagen y no múltiples?

Mehul Kaklotar Mehul Kaklotar
6 mar 2015 17:06:21
2

Estoy haciendo casi lo mismo, todavía no está listo pero funciona:

En el php:

<input id="default_featured_image" type="text" size="100" name="default_featured_image" value="<?php echo esc_attr( $value ); ?>" />
<?php
do_action( 'media_buttons', 'default_featured_image' ); // el segundo argumento es el mismo que el id del `<input>`

El javascript:

jQuery('#default_featured_image_button').click(function () {
    var formfield = jQuery('#default_featured_image').attr('name');
    tb_show('', 'media-upload.php?type=image&amp;TB_iframe=true');
    return false;
});

window.send_to_editor = function (html) {
    var imgurl = jQuery('img', html).attr('src');
    console.log(jQuery('img', html));
    console.log(html);
    console.log(imgurl);
    // establecer la URL como el valor
    jQuery('#default_featured_image').val(imgurl);
    tb_remove();
};

Esto te permitirá subir y enviar la URL de la imagen (de cualquier tamaño) al elemento <input>.
Estoy intentando hacer esto como una configuración y funciona. Lo único que necesito ahora es una forma confiable de enviar el ID del adjunto al <input>.

14 dic 2012 15:32:01
Comentarios

¡¡¡¡Muchííííííííííííííííísimas gracias!!!! ¡Esto finalmente funcionó después de 2 días de búsqueda desesperada de la solución!!! ¡¡¡Mil gracias!!!

Devner Devner
25 feb 2013 09:24:00

quizás quieras echar un vistazo al código fuente de esto en mi plugin: http://wordpress.org/extend/plugins/default-featured-image/

janw janw
25 feb 2013 11:35:19
0

Creo que @janw tiene esto completamente correcto, pero no pude hacer que una cosa funcionara. Jan inserta el botón de la biblioteca multimedia usando:

do_action( 'media_buttons', 'default_featured_image' );

y luego previene la acción predeterminada usando:

jQuery('#default_featured_image_button').click(function () {...

El problema con el que me encontré es que insertar un botón de medios de esta manera no asigna un id de "default_featured_image_button" al enlace. De hecho, no agrega ningún id al enlace insertado. Así que esto es lo que hice para que funcione.

Agregué esta línea a mi función de callback del metabox justo después de mi campo de entrada:

<input id="upload_logo_button" type="button" value="Imagen de la Biblioteca Multimedia" class="button-secondary" />

Luego encolé mi archivo jQuery personalizado y el archivo CSS de thickbox, también en mi archivo functions.php, usando:

add_action('admin_enqueue_scripts', 'jhsir_load_image_set_js');

function jhsir_load_image_set_js() {
    wp_enqueue_script( 'jhsir_image_set_script', get_stylesheet_directory_uri() . '/js/image-set.js', array('jquery','media-upload','thickbox') );
    wp_enqueue_style( 'thickbox' );
}

Finalmente, mi archivo image-set.js incluía lo siguiente:

jQuery(document).ready(function($) {

    var formfield = null;

    $('#upload_logo_button, #upload_background_button').click(function() {

        $('html').addClass('Image');

        formfield = $(this).prev('input').attr('name');  
        formfield_id = $(this).prev('input').attr('id'); 

        tb_show( '', 'media-upload.php?type=image&TB_iframe=true' );
        return false;
    });

    // usuario inserta archivo en la entrada.
    // solo ejecuta personalizado si el usuario inició el proceso usando el proceso anterior
    // window.send_to_editor(html) es cómo wp maneja normalmente los datos recibidos

    window.original_send_to_editor = window.send_to_editor;
    window.send_to_editor = function( html ) {
        var fileurl;

        if(formfield != null) {
            fileurl = $( 'img', html).attr('src');

            $( "#" + formfield_id ).val(fileurl);

            tb_remove();

            $('html').removeClass('Image');
            formfield = null;
        } else {
            window.original_send_to_editor(html);
        }
    };
});

Notarás que usé variables para almacenar el nombre y el id del campo de entrada que está justo antes del enlace que llama al jQuery. De esa manera, este código se puede usar repetidamente en la misma página. Solo necesitarías asignar una clase a todos los botones o usar id's individuales para los botones en tu jQuery como lo hice yo. Espero que esto ayude a alguien como la respuesta de Jan me ayudó a mí.

13 mar 2013 21:48:56
0

Sé que esta es una publicación antigua, pero solo quiero compartir mis hallazgos:

Para abrir el editor de medios, llamamos a esta función

wp.media.editor.open();

el editor de medios básicamente verificará el editor tinyMCE (window.tinymce), luego Quicktags (window.QTags), para pasarle el contenido.

Para mi enfoque para obtener el contenido, asigné window.QTags con un objeto personalizado, que tiene un método insertContent():

var newObject = {
  insertContent: function(html){
    // para extraer la fuente de la imagen
    $(html).find('img').attr('src');
  }
}

// asignar el newObject a la propiedad window.QTags
window.QTags = newObject;

Referencia: phpxref

28 nov 2015 13:00:09