Cum să utilizezi încărcarea media într-un widget personalizat în WordPress 3.5

5 mai 2013, 23:11:55
Vizualizări: 15.6K
Voturi: 4

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

https://stackoverflow.com/questions/13847714/wordpress-3-5-custom-media-upload-for-your-theme-options/13901303#13901303

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!

0
Toate răspunsurile la întrebare 1
10

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) {
6 mai 2013 12:41:59
Comentarii

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!

Danilo Danilo
6 mai 2013 18:49:22

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

Danilo Danilo
6 mai 2013 19:13:18

Da, asta e suficient, doar partea de plugin și nu întregul WordPress.

Kumar Kumar
6 mai 2013 19:15:40

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

Danilo Danilo
6 mai 2013 19:29:01

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

Danilo Danilo
6 mai 2013 22:29:21

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.

Danilo Danilo
7 mai 2013 11:28:27

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.

Danilo Danilo
7 mai 2013 20:35:02

Ok. Am schimbat parola și am trimis emailul

Danilo Danilo
7 mai 2013 21:18:29

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

Danilo Danilo
7 mai 2013 22:16:58

Bucuros să ajut :)

Kumar Kumar
7 mai 2013 22:18:15
Arată celelalte 5 comentarii