Usando o Wordpress 3.5 Media Uploader na caixa meta?

14

Isso é possível fazer?

Eu amo como o novo uploader funciona. Eu estou supondo que tem a ver com uma chamada jQuery como o contrário.

EDITAR

Este é o código que estou usando no momento

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;
});
});
    
por souporserious 12.12.2012 / 01:37

5 respostas

9

Para começar, as funções básicas e substituições, tanto quanto eu sei atualmente. Pode haver soluções melhores, mas eu só tinha dois dias com 3.5 ainda:

// open modal - bind this to your button
    if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
        wp.media.editor.open( ##unique_id_here## );

// backup of original send function
   original_send = wp.media.editor.send.attachment;

// new send function
   wp.media.editor.send.attachment = function( a, b) {
       console.log(b); // b has all informations about the attachment
       // or whatever you want to do with the data at this point
       // original function makes an ajax call to retrieve the image html tag and does a little more
    };

// wp.media.send.to.editor will automatically trigger window.send_to_editor for backwards compatibility

// backup original window.send_to_editor
   window.original_send_to_editor = window.send_to_editor; 

// override window.send_to_editor
   window.send_to_editor = function(html) {
       // html argument might not be useful in this case
       // use the data from var b (attachment) here to make your own ajax call or use data from b and send it back to your defined input fields etc.
   }

Esta não é uma resposta completa de trabalho. Você tem que definir e manter o controle de seus campos de entrada por si mesmo, etc. Isso só deve começar. Se você tiver perguntas mais concretas, basta perguntar.

E certifique-se de reatribuir as funções originais quando o seu script estiver pronto.

Retirado de comentários:

  

Como posso ouvir o evento de fechamento da mesa de luz?

// add listener: 
wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }
    
por ungestaltbar 12.12.2012 / 07:35
6

Aqui está um pequeno tutorial em como usar o WP 3.5 media uploader nas opções de tema. Foi isso que eu criei e funciona perfeito para mim. Deixe-me saber se você encontrar uma solução melhor.

Veja como implementei o código nas minhas opções de 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;

  });
});

Atualizar

Este código funciona apenas na página de edição de postagens. Para que funcione na página de opções de tema, você precisa adicionar wp_enqueue_media();

    
por Ram Ratan Maurya 13.12.2012 / 08:05
3

Estou quase fazendo o mesmo, mas ainda não está pronto, mas funciona:

no 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' ); // second argument is the same as the '<input>' id

O 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);
    // set the url as the value
    jQuery('#default_featured_image').val(imgurl);
    tb_remove();
};

Isso permitirá que você envie e envie o URL da imagem (de qualquer tamanho) para o elemento <input> .
Estou tentando fazer isso como uma configuração e funciona, só que eu preciso agora é uma maneira confiável de enviar o ID do anexo para o <input>

    
por janw 14.12.2012 / 14:32
3

Eu acho que @janw tem essa completamente certa, mas eu não consegui fazer uma coisa funcionar. Jan insere o botão da biblioteca de mídia usando:

do_action( 'media_buttons', 'default_featured_image' );

e, em seguida, preempece a ação padrão usando:

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

O problema que eu encontrei é que inserir um botão de mídia dessa maneira não atribui um id de "default_featured_image_button" ao link. Na verdade, não adiciona nenhum id no link inserido. Então foi isso que eu fiz para que funcionasse.

Eu adicionei esta linha à minha função de callback da meta box logo após o meu campo de entrada:

<input id="upload_logo_button" type="button" value="Media Library Image" class="button-secondary" />

Eu, então, enfileirei meu arquivo jquery personalizado e o arquivo thickbox css, também no meu arquivo 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 meu arquivo image-set.js incluiu o seguinte:

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

    // user inserts file into post.
    // only run custom if user started process using the above process
    // window.send_to_editor(html) is how wp normally handles the received data

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

Você notará que usei variáveis para armazenar o nome e o id do campo de entrada que é anterior ao link que chama o jQuery. Dessa forma, esse código pode ser usado repetidamente na mesma página. Você só precisa atribuir uma classe a todos os botões ou usar ids individuais para os botões em sua jquery como eu fiz. Espero que isso ajude alguém como a resposta de Jan me fez.

    
por MatthewLee 13.03.2013 / 20:48
0

Eu sei que este é um post antigo, mas só quero compartilhar minhas descobertas:

Para abrir o editor de mídia, chamamos essa função

wp.media.editor.open();

o editor de mídia basicamente verificará o editor tinyMCE ( window.tinymce ) e, em seguida, as Quicktags ( window.QTags ), para passar o conteúdo para.

Para minha abordagem para obter o conteúdo, atribuí window.QTags a um objeto personalizado, que tem um método insertContent() :

var newObject = {
  insertContent: function(html){
    // to extract the image source
    $(html).find('img').attr('src');
  }
}

// assign the newObject to window.QTags property
window.QTags = newObject;

Referência: phpxref

    
por user3323765 28.11.2015 / 12:00