【问题标题】:Custom widget form: Cannot change the value of any input fields自定义小部件表单:无法更改任何输入字段的值
【发布时间】:2016-11-12 19:35:48
【问题描述】:

我正在创建一个 wordpress 小部件,它应该包含一些管理员用户应该能够输入的纯文本,并且该部分工作正常。但我还需要上传一个文件,我的 javascript 工作正常,直到 jQuery 尝试更改 input#image_url 字段的值,因为它只是不更新​​。它使用 .val() 方法设置正确的值,因此它包含在 DOM 中未显示的值,因此更改不可见。然后我尝试进入控制台并使用 jQuery 和普通文档 api 标准选择输入字段,如下所示:

var input = document.getElementById("image_url");
input.value = "herpderp";

这也失败了,因此无法更改该输入字段的值只是一些基本问题,在 jsfiddle.net 之类的东西中,上面的代码 100% 正确。所以我的问题是,是否有人在 Wordpress 中尝试过任何破坏输入字段的操作?我已经检查了我的 html 是否格式错误,但我认为它看起来没问题。我的代码如下,供参考:

file:my_theme/functions.php

include_once('widgets/intro.php');

function caribia_enqueue_styles()
{
    $parent_style = 'parent-style';
    wp_enqueue_style($parent_style, get_template_directory_uri() . '/style.css');
    wp_enqueue_style('child-style', get_stylesheet_directory_uri() . '/style.css', array($parent_style));
    wp_enqueue_style('caribia-css', get_stylesheet_directory_uri() . '/css/caribia.css');
    wp_enqueue_script('caribia-js', get_stylesheet_directory_uri() . '/js/caribia.js', array('jquery'));
}

function caribia_register_widgets() {
    register_widget('Intro_Widget');
}

function load_wp_media_files() {
    wp_enqueue_media();
}

add_action('wp_enqueue_scripts', 'caribia_enqueue_styles', 12);
add_action('admin_enqueue_scripts', 'caribia_enqueue_styles');
add_action('widgets_init', 'caribia_register_widgets');
add_action( 'admin_enqueue_scripts', 'load_wp_media_files' );






file:my_theme/widgets/intro.php
<?php

/**
 * Widget API: Intro_Widget class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Adds Foo_Widget widget.
 */
class Intro_Widget extends WP_Widget {

    /**
     * Register widget with WordPress.
     */
    function __construct() {
        parent::__construct(
            'intro_widget',
            __( 'Intro widget', 'text_domain' ),
            array( 'description' => __( 'A intro widget, should output a image, header, sub-headers
            and a description for each subheader', 'text_domain' ), )
        );

        add_action('admin_enqueue_scripts', array($this, 'upload_scripts'));
    }

    /**
     * Upload the Javascripts for the media uploader
     */
    public function upload_scripts()
    {
        wp_enqueue_script('media-upload');
        wp_enqueue_script('thickbox');
        wp_enqueue_script('upload_media_widget', get_stylesheet_directory_uri() . '/js/upload-media.js', array('jquery'));
        wp_enqueue_style('thickbox');
    }


    /**
     * Front-end display of widget.
     *
     * @see WP_Widget::widget()
     *
     * @param array $args     Widget arguments.
     * @param array $instance Saved values from database.
     */
    public function widget($args, $instance) {
        echo $args['before_widget'];
        echo "herpderp";
        echo $args['after_widget'];
    }

    /**
     * @param array $instance
     * @return string Default return is 'noform'.
     */
    public function form($instance) {
        ?>
        <div>
            <label for="image_url">Image</label>
            <input type="text" name="image_url" id="image_url" class="regular-text">
            <input type="button" name="upload-btn" id="upload-btn" class="button-secondary" value="Upload Image">
        </div>
        <?php
    }

    /**
     * Sanitize widget form values as they are saved.
     *
     * @see WP_Widget::update()
     *
     * @param array $new_instance Values just sent to be saved.
     * @param array $old_instance Previously saved values from database.
     *
     * @return array Updated safe values to be saved.
     */
    public function update( $new_instance, $old_instance ) {
        return $new_instance;
    }
}

一些javascript:

jQuery(document).ready(function($) {
     $(document).on('click','#upload-btn',function(e) {
        var image = wp.media({
            title: 'Upload Image',
            multiple: false
        }).open().on('select', function(e){
            console.log('select was called');
            var uploaded_image = image.state().get('selection').first();
            console.log(uploaded_image);
            var image_url = uploaded_image.toJSON().url;
            $('#image_url').val(image_url);
        });
    });
});

【问题讨论】:

    标签: php html wordpress forms input


    【解决方案1】:

    我在使用.val 时遇到了类似的问题,并且没有资格更新小部件页面按钮。直到我使用了.trigger('change') 方法。所以对于第一条评论,你说的我会替换

    $('#image_url').val(image_url);
    

    $('#image_url').val(image_url).trigger('change'); 
    

    进行此更正后,小部件页面上的更新按钮应该可以更新。

    【讨论】:

      【解决方案2】:

      所以我看了一下,我认为我从来没有发现到底出了什么问题,但是从另一个小部件复制输入字段然后对其进行修改使其以某种方式工作。所以我的小部件现在看起来像这样:

      <?php
      
      /**
       * Widget API: Intro_Widget class
       *
       * @package WordPress
       * @subpackage Widgets
       * @since 4.4.0
       */
      
      /**
       * Adds Foo_Widget widget.
       */
      class Intro_Widget extends WP_Widget {
      
          /**
           * Register widget with WordPress.
           */
          function __construct() {
              parent::__construct(
                  'intro_widget',
                  __( 'Intro widget', 'text_domain' ),
                  array( 'description' => __( 'A intro widget, should output a image, header, sub-headers
                  and a description for each subheader', 'text_domain' ), )
              );
      
              add_action('admin_enqueue_scripts', array($this, 'upload_scripts'));
          }
      
          /**
           * Upload the Javascripts for the media uploader
           */
          public function upload_scripts()
          {
              wp_enqueue_script('media-upload');
              wp_enqueue_script('thickbox');
              wp_enqueue_script('upload_media_widget', get_stylesheet_directory_uri() . '/js/upload-media.js', array('jquery'));
              wp_enqueue_style('thickbox');
          }
      
      
          /**
           * Front-end display of widget.
           *
           * @see WP_Widget::widget()
           *
           * @param array $args     Widget arguments.
           * @param array $instance Saved values from database.
           */
          public function widget($args, $instance) {
              echo $args['before_widget'];
              echo "herpderp";
              echo $args['after_widget'];
          }
      
          /**
           * @param array $instance
           * @return string
           */
          public function form($instance) {
              $title = !empty( $instance['title'] ) ? $instance['title'] : __( 'New title', 'text_domain' );
              $image_url = !empty($instance['image_url']) ? $instance['image_url'] : __('New imageurl', 'text_domain');
              ?>
              <p>
                  <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( esc_attr( 'Title:' ) ); ?></label>
                  <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"
                         name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
              </p>
              <p>
                  <label for="<?php echo esc_attr( $this->get_field_id( 'image_url' ) ); ?>"><?php _e( esc_attr( 'Image url:' ) ); ?></label>
                  <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'image_url' ) ); ?>"
                         name="<?php echo esc_attr( $this->get_field_name( 'image_url' ) ); ?>" type="text" value="<?php echo esc_attr( $image_url ); ?>">
                  <input type="button" name="upload-btn" id="upload-btn" class="button-secondary" value="Upload Image">
              </p>
              <?php
          }
      
          /**
           * Sanitize widget form values as they are saved.
           *
           * @see WP_Widget::update()
           *
           * @param array $new_instance Values just sent to be saved.
           * @param array $old_instance Previously saved values from database.
           *
           * @return array Updated safe values to be saved.
           */
          public function update($new_instance, $old_instance) {
              $instance = $old_instance;
              $instance['title'] = strip_tags($new_instance['title']);
              $instance['image_url'] = strip_tags($instance['image_url']);
              $this->flush_widget_cache();
              return $instance;
          }
      
      }
      

      然后我将 javascript 更改为:

      jQuery(document).ready(function($) {
           $(document).on('click','#upload-btn',function(e) {
              var image = wp.media({
                  title: 'Upload Image',
                  multiple: false
              }).open().on('select', function(e){
                  console.log('select was called');
                  var uploaded_image = image.state().get('selection').first();
                  console.log(uploaded_image);
                  document.getElementById("widget-intro_widget-3-image_url").value = uploaded_image.toJSON().url;
              });
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 2015-11-06
        • 2021-09-09
        • 2019-02-05
        • 1970-01-01
        • 2019-12-02
        • 2011-02-03
        • 2017-09-03
        • 2011-03-29
        相关资源
        最近更新 更多