Wordpress custom widget image upload

前端 未结 2 1793
傲寒
傲寒 2021-01-31 12:03

I\'m busy with building my own Wordpress Widget. Everything works fine except for the Wordpress media up loader. I have created eight buttons and eight input text fields which s

相关标签:
2条回答
  • 2021-01-31 12:24

    I have simplified the widget a little for this example, removing the for loop as I think you could just create new instances of the widget. This also allows the added benefit of sorting the items. I moved the js to another file as there's no need to repeat the code.

    The widget class

    class Home_Rollover_Widget extends WP_Widget
    {
    
      public function __construct()
      {
        parent::__construct(
          'home-rollover-widget',
          'Home Rollover Widget',
          array(
            'description' => 'Home rollover widget'
          )
        );
      }
    
      public function widget( $args, $instance )
      {
        // basic output just for this example
        echo '<a href="#">
          <img src="'.esc_url($instance['image_uri']).'" />
          <h4>'.esc_html($instance['image_uri']).'</h4>
        </a>';
      }
    
      public function form( $instance )
      {
        // removed the for loop, you can create new instances of the widget instead
        ?>
        <p>
          <label for="<?php echo $this->get_field_id('text'); ?>">Text</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'); ?>">Image</label><br />
          <input type="text" class="img" name="<?php echo $this->get_field_name('image_uri'); ?>" id="<?php echo $this->get_field_id('image_uri'); ?>" value="<?php echo $instance['image_uri']; ?>" />
          <input type="button" class="select-img" value="Select Image" />
        </p>
        <?php
      }
    
    
    } 
    // end class
    
    // init the widget
    add_action( 'widgets_init', create_function('', 'return register_widget("Home_Rollover_Widget");') );
    
    // queue up the necessary js
    function hrw_enqueue()
    {
      wp_enqueue_style('thickbox');
      wp_enqueue_script('media-upload');
      wp_enqueue_script('thickbox');
      // moved the js to an external file, you may want to change the path
      wp_enqueue_script('hrw', '/wp-content/plugins/home-rollover-widget/script.js', null, null, true);
    }
    add_action('admin_enqueue_scripts', 'hrw_enqueue');
    

    New js file: use the .on() method instead of .click() to attach the event handler.

    var image_field;
    jQuery(function($){
      $(document).on('click', 'input.select-img', function(evt){
        image_field = $(this).siblings('.img');
        tb_show('', 'media-upload.php?type=image&amp;TB_iframe=true');
        return false;
      });
      window.send_to_editor = function(html) {
        imgurl = $('img', html).attr('src');
        image_field.val(imgurl);
        tb_remove();
      }
    });
    
    0 讨论(0)
  • 2021-01-31 12:28

    This script helped me alot. Later on, though, I found out that it messed with the media upload in my posts perhaps because it was calling the media uploader scripts twice. I solved it by adding

    if( $hook != 'widgets.php' ) 
        return;
    

    Like this:

    // queue up the necessary js
    function hrw_enqueue($hook) {
    
    if( $hook != 'widgets.php' ) 
        return;
    
      wp_enqueue_style('thickbox');
      wp_enqueue_script('media-upload');
      wp_enqueue_script('thickbox');
      // I also changed the path, since I was using it directly from my theme and not as a plugin
      wp_enqueue_script('hrw', get_template_directory_uri() . '/js/script.js', null, null, true);
    }
    add_action('admin_enqueue_scripts', 'hrw_enqueue');
    

    That way the widget calls the uploader script only in the widgets' page and not in the entire admin.

    0 讨论(0)
提交回复
热议问题