Utilizarea încărcătorului media WordPress 3.5 în meta box-uri?
Este posibil să faci asta?
Îmi place cum funcționează noul încărcător. Presupun că are legătură cu un apel jQuery, similar cu metoda anterioară.
EDIT
Acesta este codul pe care îl folosesc în prezent:
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;
});
});
Pentru a te ajuta să începi, iată funcțiile de bază și suprascrierile pe care le cunosc în prezent. Pot exista soluții mai bune, dar am avut doar două zile cu versiunea 3.5:
// deschide modal - leagă această funcție de butonul tău
if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
wp.media.editor.open( ##unique_id_here## );
// backup al funcției originale send
original_send = wp.media.editor.send.attachment;
// noua funcție send
wp.media.editor.send.attachment = function( a, b) {
console.log(b); // b conține toate informațiile despre atașament
// sau orice altceva dorești să faci cu datele în acest moment
// funcția originală face un apel ajax pentru a obține tag-ul html al imaginii și mai mult
};
// wp.media.send.to.editor va declanșa automat window.send_to_editor pentru compatibilitate inversă
// backup al window.send_to_editor original
window.original_send_to_editor = window.send_to_editor;
// suprascrie window.send_to_editor
window.send_to_editor = function(html) {
// argumentul html poate să nu fie util în acest caz
// folosește datele din var b (atașament) aici pentru a face propriul apel ajax sau folosește datele din b și trimite-le înapoi la câmpurile tale de input etc.
}
Acesta nu este un răspuns complet funcțional. Trebuie să definești și să ții evidența câmpurilor tale de input singur etc.. Acesta este doar un punct de plecare. Dacă ai întrebări mai concrete, doar întreabă.
Și asigură-te să reatribui funcțiile originale când scriptul tău este terminat.
Extras din comentarii:
Cum pot asculta evenimentul de închidere al lightbox-ului?
// adaugă listener:
wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }

Mulțumesc! Totuși, nu reușesc să fac să funcționeze. Am adăugat mai sus codul pe care îl foloseam pentru vechiul încărcător media, poate te ajută.

Ipstenu și echipa de suport au creat o listă principală cu problemele (http://wordpress.org/support/topic/troubleshooting-wordpress-35-master-list?replies=4) raportate pentru WordPress 3.5. Acest subiect nu este menit să conțină feedback de la utilizatori, ci este un fir moderat care evidențiază rapid problemele cunoscute raportate, precum și instrucțiuni pentru remedierea acestora.

Cum pot asculta evenimentul de închidere al lightbox-ului? Am nevoie să declanșez o funcție personalizată dacă cineva nu alege o imagine nouă

Iată un mic tutorial despre cum să utilizezi încărcătorul media din WP 3.5 în opțiunile temei. Aceasta este soluția la care am ajuns și funcționează perfect pentru mine. Spune-mi dacă găsești o soluție mai bună.
Iată cum am implementat codul în opțiunile temei mele:
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;
});
});
Actualizare
Acest cod funcționează doar pe pagina de editare a articolului. Pentru a-l face să funcționeze și pe pagina de opțiuni a temei, trebuie să adaugi wp_enqueue_media();

Fac aproape același lucru, nu este încă gata, dar funcționează:
În 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' ); // al doilea argument este același cu id-ul `<input>`
JavaScript:
jQuery('#default_featured_image_button').click(function () {
var formfield = jQuery('#default_featured_image').attr('name');
tb_show('', 'media-upload.php?type=image&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);
// setează URL-ul ca valoare
jQuery('#default_featured_image').val(imgurl);
tb_remove();
};
Aceasta vă va permite să încărcați și să trimiteți URL-ul imaginii (de orice dimensiune) către elementul <input>
.
Încerc să fac asta ca o setare și funcționează. Singurul lucru de care am nevoie acum este o metodă sigură de a trimite ID-ul atașamentului către <input>
.

Mulțumesc multtttttttttttttttttt!!!! Aceasta a funcționat în sfârșit după 2 zile de căutare disperată a soluției!!! Mulțumesc enorm!!!

poți arunca o privire la codul sursă al acestuia în plugin-ul meu: http://wordpress.org/extend/plugins/default-featured-image/

Cred că @janw a rezolvat acest lucru complet corect, dar nu am reușit să fac să funcționeze un anumit aspect. Jan inserează butonul bibliotecii de media folosind:
do_action( 'media_buttons', 'default_featured_image' );
și apoi interceptează acțiunea implicită folosind:
jQuery('#default_featured_image_button').click(function () {...
Problema cu care m-am confruntat este că inserarea unui buton de media în acest fel nu atribuie un id de "default_featured_image_button" linkului. De fapt, nu adaugă niciun id pe linkul inserat. Așa că iată ce am făcut pentru a rezolva problema.
Am adăugat această linie în funcția mea de callback pentru meta box, imediat după câmpul de input:
<input id="upload_logo_button" type="button" value="Imagine din Biblioteca Media" class="button-secondary" />
Apoi am încărcat fișierul meu jQuery personalizat și fișierul CSS thickbox, tot în fișierul functions.php, folosind:
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' );
}
În final, fișierul meu image-set.js a inclus următoarele:
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;
});
// utilizatorul inserează fișierul în post.
// rulează doar personalizarea dacă utilizatorul a pornit procesul folosind procedura de mai sus
// window.send_to_editor(html) este modul în care wp gestionează în mod normal datele primite
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);
}
};
});
Veți observa că am folosit variabile pentru a stoca numele și id-ul câmpului de input care este chiar înaintea linkului care apelează jQuery. În acest fel, acest cod poate fi folosit în mod repetat pe aceeași pagină. Va trebui doar să atribuiți o clasă tuturor butoanelor sau să folosiți id-uri individuale pentru butoane în jQuery, așa cum am făcut eu. Sper că acest lucru va ajuta pe cineva, așa cum răspunsul lui Jan m-a ajutat pe mine.

Știu că acesta este un post vechi, dar vreau doar să împărtășesc descoperirile mele:
Pentru a deschide editorul media, apelăm această funcție
wp.media.editor.open();
editorul media va verifica în mod esențial editorul tinyMCE (window.tinymce
), apoi Quicktags (window.QTags
), pentru a transmite conținutul.
Pentru abordarea mea de a obține conținutul, am atribuit window.QTags
cu un obiect personalizat, care are o metodă insertContent()
:
var newObject = {
insertContent: function(html){
// pentru a extrage sursa imaginii
$(html).find('img').attr('src');
}
}
// atribuie newObject proprietății window.QTags
window.QTags = newObject;
Referință: phpxref
