在自定义插件中使用媒体上载程序

时间:2011-11-18 作者:lior

作为我正在创建的小部件的一部分,我需要管理员通过小部件面板上传图像我在一个新类下有以下代码

<?php
function form($instance) {
   $instance = wp_parse_args( (array) $instance, array( \'qrimage\'=> \'\');
   $qrimage=$instance[\'qrimage\']; ?>

<label for="<?php echo $this->get_field_id(\'qrimage\'); ?>">
      Upload QR Image:
<input class="wide" 
       id="<?php echo $this->get_field_id(\'qrimage\'); ?>" 
       name="<?php echo $this->get_field_id(\'qrimage\'); ?>" 
       type="text" 
       value=\'<?php echo attribute_escape($qrimage); ?>\' />
Upload Image 
<label for="uploadi<?php echo $this->get_field_id(\'qrimage\'); ?>"> 
   <input class="uploadi<?php echo $this->get_field_id(\'qrimage\'); ?>" 
          name="uploadi<?php echo $this->get_field_id(\'qrimage\'); ?>" 
          id="uploadi<?php echo $this->get_field_id(\'qrimage\'); ?>" 
          value="Upload Image" type="button" />
</label>

<script type="text/javascript">
      var formfield = \'\';
      var imgurl =\'\';
      jQuery(document).ready(function() {
        jQuery(\'.uploadi<?php echo $this->get_field_id(\'qrimage\');?>\').click(function() {
         formfield = jQuery(\'#<?php echo $this->get_field_id(\'qrimage\'); ?>\').attr(\'name\');
         tb_show(\'\', \'media-upload.php?type=image&amp&TB_iframe=1\');
         return false;
        });

        // send url back to plugin editor
        window.send_to_editor = function(html) {
         imgurl = jQuery(\'img\',html).attr(\'src\');
         jQuery(\'#<?php echo $this->get_field_id(\'qrimage\'); ?>\').val(imgurl);
         tb_remove();
        }

        });
  </script>
事情是。。。如果我在widgets面板上有一个widget实例,那么一切都正常。

一旦我添加了另一个实例,第一个实例上的一切都正常,但在第二个实例上,我无法保存图像,文本字段获得值,但在保存时它就消失了

有什么想法吗?为什么?

谢谢

1 个回复
SO网友:marcochiesi

控件的输出代码form 方法为小部件的每个实例(包括“可用小部件”面板中包含的“虚拟”实例)添加到页面一次,因此在您的示例中,定义window.send_to_editor 函数可能会出现多次,最后一个实例会覆盖以前的实例。至少有两个原因导致form 方法:

创建小部件的新实例(使用拖放)时,“dummy”(标记为)的html代码__i__ 索引)被复制到新创建的小部件,索引被替换为一个数字,但事件处理程序没有被复制,因此新小部件可能不会按预期运行form 方法被发送回页面,然后动态添加到DOM中。根据jQuery documentation, “检索到的数据中的任何嵌入JavaScript都是在HTML作为字符串返回之前执行的”,这可能会导致奇怪的行为(此外,并非所有浏览器都有相同的行为)我建议您将javascript代码放在单独的js文件中,并使用wp_enqueue_script 并使用jQuerylive 方法添加事件处理程序。您可以对所有实例使用通用事件处理程序,然后查找适当的DOM元素来应用相关操作。示例:

jQuery(\'input[id^=uploadi]\').live(\'click\', function() {
     formfield = jQuery(\'input[id^=qrimage]\', jQuery(this).closest(\'.widget\')).attr(\'name\');
     tb_show(\'\', \'media-upload.php?type=image&amp;TB_iframe=1\');
     return false;
});
注:更改qrimage 选择上面代码中的选择器(未测试),以确定字段前缀是什么。

P、 我还注意到url中有一个拼写错误media-upload.php?type=image&amp&TB_iframe=1

结束