使用媒体模式从自定义插件上传图像

时间:2018-02-28 作者:Brandon Benefield

我正在创建一个自定义插件,我需要用户能够上传多个图像。我希望他们能够通过内置的媒体页面做到这一点,但通过插件设置页面的模式/弹出窗口。

使用Thrive Architect 并选择Image 选项卡上,会出现一个模式,它看起来与管理屏幕上的媒体库一模一样。我如何做到这一点?

我搜索了wordpress media modal 它回来了Javascript Reference/wp.media 但我不完全确定这是否是我要找的。

这是WordPress中的内置功能还是我需要找到自己的方法来创建它?

最后,欢迎其他人提出任何建议!总是很高兴知道别人找到了什么解决方案。

1 个回复
SO网友:Jonathan Guerin

啊!

任何关心用户体验的人都会面临一个经典问题。

根据我的经验,wp.media 就是要走的路。

这是not my code, but it gets the job done. I\'ve used it plenty.

我将逐一解释它的作用:

// Source: https://vedmant.com/using-wordpress-media-library-in-widgets-options/
jQuery(document).ready(function ($) {

   $(document).on("click", ".upload_image_button", function (e) {
      e.preventDefault();
      var $button = $(this);


      // Create the media frame.
      var file_frame = wp.media.frames.file_frame = wp.media({
         title: \'Select or upload image\',
         library: { // remove these to show all
            type: \'image\' // specific mime
         },
         button: {
            text: \'Select\'
         },
         multiple: false  // Set to true to allow multiple files to be selected
      });

      // When an image is selected, run a callback.
      file_frame.on(\'select\', function () {
         // We set multiple to false so only get one image from the uploader

         var attachment = file_frame.state().get(\'selection\').first().toJSON();

         $button.siblings(\'input\').val(attachment.url).change();

      });

      // Finally, open the modal
      file_frame.open();
   });
});
第一件事是第一件事。We need a button, tied to an input, 稍后将对此进行详细介绍。它可以位于自定义程序中,也可以位于您需要的任何位置:

<button class="upload_image_button">Upload Image</button>
然后,我们需要一个绑定到此按钮的数据摄取器。不幸的是,这超出了范围,但假设您在小部件中执行此操作,这将导致:

<p>
    <label for="<?php echo $this->get_field_id( \'image\' ); ?>">Image:</label>
    <br>
    <input class="widefat" id="<?php echo $this->get_field_id( \'image\' ); ?>" name="<?php echo $this->get_field_name( \'image\' ); ?>" value="<?php echo $instance[\'image\'];?>" />
    <br>
    <button class="upload_image_button">Upload Image</button>
</p>
到目前为止,我们只针对按钮,继续:

  // Create the media frame.
  var file_frame = wp.media.frames.file_frame = wp.media({
     title: \'Select or upload image\',
     library: { // remove these to show all
        type: \'image\' // specific mime
     },
     button: {
        text: \'Select\'
     },
     multiple: false  // Set to true to allow multiple files to be selected
  });
代码注释得很好,但下面是相应的文档文件:https://codex.wordpress.org/Javascript_Reference/wp.media

所以我们只是调用WP-JS-API来访问媒体帧。现在,开始获取我们需要的文件路径:

file_frame.on(\'select\', function () {
每当我们从框架中选择某个内容时,以AJAX调用、JSON格式获取所述文件的路径,并让我使用它-

var attachment = file_frame.state().get(\'selection\').first().toJSON();
还记得那个必须连接到输入的按钮吗?是的,所以我们插入了这个链接,我们刚刚进入了这个输入:

$button.siblings(\'input\').val(attachment.url).change();
这样,一个新的链接就诞生了。

结束

相关推荐

Media searching ignored

我们的网站使用WordPress,有很多媒体文件。我们网站的媒体名称格式如下[Car brand\'s name]-[number].jpg, 例如Tesla-1.jpg 或Aston Martin-3.jpg. 因此,我们可以通过搜索文章的名称轻松找到文章的特定媒体。但突然间,我们找不到媒体。我们正在尝试搜索名称为的媒体,但搜索结果不变。(不搜索任何内容时的媒体屏幕)(搜索Aston Martin时的媒体屏幕)当然,在填充搜索文本框后,它会显示一个加载图标,但结果总是一样的。为什么会发生这种情况?更新+