Cum să utilizezi încărcarea media într-un widget personalizat în WordPress 3.5
Creez un mic widget pentru WordPress 3.5 care permite încărcarea de imagini.
Widget-ul este încărcat corect de WordPress. Când adaug widget-ul într-o bară laterală, butonul de încărcare nu funcționează. Dacă actualizez pagina păstrând widget-ul în bara laterală, butonul funcționează și pot încărca și salva imaginea corect.
Pentru a construi widget-ul, m-am inspirat din aceste link-uri:
https://stackoverflow.com/questions/13863087/wordpress-custom-widget-image-upload
Codul meu pentru widget:
<?php
add_action('widgets_init', 'ctUp_ads_widget');
function ctUp_ads_widget() {
register_widget( 'ctUp_ads' );
}
function ctUp_wdScript(){
wp_enqueue_media();
wp_enqueue_script('adsScript', get_template_directory_uri() . '/js/ads.js');
}
add_action('admin_enqueue_scripts', 'ctUp_wdScript');
class ctUp_ads extends WP_Widget{
function ctUp_ads() {
$widget_ops = array( 'classname' => 'ctUp-ads' );
$control_ops = array( 'width' => 250, 'height' => 350, 'id_base' => 'ctUp-ads-widget' );
$this->WP_Widget( 'ctUp-ads-widget',THEMENAME .' - Reclame', $widget_ops, $control_ops );
}
public function widget($args, $instance){
extract( $args );
?>
<a href="#"><img src="<?php echo esc_url($instance['image_uri']); ?>" /></a>
<?php }
function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['text'] = strip_tags( $new_instance['text'] );
$instance['image_uri'] = strip_tags( $new_instance['image_uri'] );
return $instance;
}
public function form($instance){ ?>
<p>
<label for="<?php echo $this->get_field_id('text'); ?>"><?php _e('Text', THEMENAME); ?></label><br />
<input type="text" name="<?php echo $this->get_field_name('text'); ?>" id="<?php echo $this->get_field_id('text'); ?>" value="<?php echo $instance['text']; ?>" class="widefat" />
</p>
<p>
<label for="<?php echo $this->get_field_id('image_uri'); ?>">Imagine</label><br />
<img class="custom_media_image" src="<?php if(!empty($instance['image_uri'])){echo $instance['image_uri'];} ?>" style="margin:0;padding:0;max-width:100px;float:left;display:inline-block" />
<input type="text" class="widefat custom_media_url" name="<?php echo $this->get_field_name('image_uri'); ?>" id="<?php echo $this->get_field_id('image_uri'); ?>" value="<?php echo $instance['image_uri']; ?>">
<a href="#" class="button custom_media_upload"><?php _e('Încarcă', THEMENAME); ?></a>
</p>
<?php
}
}
Cod JavaScript:
jQuery(function($){
$('.custom_media_upload').click(function(e) {
e.preventDefault();
var custom_uploader = wp.media({
title: 'Titlu Personalizat',
button: {
text: 'Text Buton Personalizat',
},
multiple: false // Setează asta pe true pentru a permite selectarea mai multor fișiere
})
.on('select', function() {
var attachment = custom_uploader.state().get('selection').first().toJSON();
$('.custom_media_image').attr('src', attachment.url);
$('.custom_media_url').val(attachment.url);
$('.custom_media_id').val(attachment.id);
})
.open();
});
});
Mulțumesc anticipat pentru ajutor!
Verifică dacă acest lucru funcționează pentru tine: Pune acest cod în
jQuery(document).ready( function(){
function media_upload( button_class) {
var _custom_media = true,
_orig_send_attachment = wp.media.editor.send.attachment;
jQuery('body').on('click',button_class, function(e) {
var button_id ='#'+jQuery(this).attr('id');
/* console.log(button_id); */
var self = jQuery(button_id);
var send_attachment_bkp = wp.media.editor.send.attachment;
var button = jQuery(button_id);
var id = button.attr('id').replace('_button', '');
_custom_media = true;
wp.media.editor.send.attachment = function(props, attachment){
if ( _custom_media ) {
jQuery('.custom_media_id').val(attachment.id);
jQuery('.custom_media_url').val(attachment.url);
jQuery('.custom_media_image').attr('src',attachment.url).css('display','block');
} else {
return _orig_send_attachment.apply( button_id, [props, attachment] );
}
}
wp.media.editor.open(button);
return false;
});
}
media_upload( '.custom_media_upload');
});
În loc de link pentru încărcare, poți folosi un buton
<input type="button" value="<?php _e( 'Încarcă Imagine', 'numele temei' ); ?>" class="button custom_media_upload" id="custom_image_uploader"/>
Actualizare:
Doar câteva modificări minore în codul tău js și problema ta va fi rezolvată în loc de
jQuery(button_class).click(function(e) {
trebuie să folosești
jQuery('body').on('click',button_class, function(e) {
deoarece widget-ul este adăugat folosind ajax. Chiar și codul tău anterior ar trebui să funcționeze dacă faci modificări similare în js.
$('body').on('click','.custom_media_upload',function(e) {

Mulțumesc Dot1 pentru răspuns!
Am încercat să înlocuiesc codul widget-ului, dar din păcate încă nu funcționează. Acest lucru funcționează doar dacă reîncărc pagina cu widget-ul activat.
Nu înțeleg unde este problema!

Momentan lucrez local cu xampp. Dacă dorești, pot crea un fișier arhivat cu widget-ul pe care să îl încărci pe dropbox

https://dl.dropboxusercontent.com/u/5490925/wpads.zip Am plasat widget-ul în tema apelându-l din fișierul functions.php - Mulțumesc!

Am încercat modificările pe care mi le-ai arătat, dar din păcate încă nu funcționează pentru mine.
Dacă adaug widget-ul, butonul nu funcționează. Dacă păstrez widget-ul activ și actualizez pagina, butonul funcționează.
Am schimbat numele scriptului în custom-upload.js

WP_Debug este dezactivat. Calea fișierului este corectă și este încărcat corect în zona administrativă. Am încărcat widget-ul în tema implicită WordPress pentru a-l testa.

Bună. Îmi pare rău dacă nu am răspuns mai devreme, dar eram la serviciu. Instalez o demonstrație de WordPress pe un server pe care îl am disponibil. Când voi instala WordPress, îți voi trimite link-ul.

Mulțumesc mult!!! Acum funcționează perfect! Chiar nu știu cum să-ți mulțumesc! Mulțumesc enorm pentru timpul acordat!
