【问题标题】:TinyMCE popup add media buttonTinyMCE 弹出添加媒体按钮
【发布时间】:2014-09-16 16:29:23
【问题描述】:

在我正在开发的 Wordpress 主题中,我有一个 TinyMCEPopup 可以将短代码添加到编辑器,一些短代码需要图像。我可以添加一个“添加媒体”按钮来打开 Wordpress 媒体上传器并允许用户选择或上传图片,即使我在 TinyMCEPopup 中?

【问题讨论】:

    标签: javascript wordpress tinymce wordpress-theming


    【解决方案1】:

    不知道会不会有帮助,但我遇到了同样的问题并像这样解决了。

    functions.php添加

    add_action( 'after_setup_theme', 'mytheme_theme_setup' );
    
    if ( ! function_exists( 'mytheme_theme_setup' ) ) {
        function mytheme_theme_setup() {
    
            add_action( 'init', 'mytheme_buttons' );
    
        }
    }
    
    /********* TinyMCE Buttons ***********/
    if ( ! function_exists( 'mytheme_buttons' ) ) {
        function mytheme_buttons() {
            if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
                return;
            }
    
            if ( get_user_option( 'rich_editing' ) !== 'true' ) {
                return;
            }
    
            add_filter( 'mce_external_plugins', 'mytheme_add_buttons' );
            add_filter( 'mce_buttons', 'mytheme_register_buttons' );
        }
    }
    
    if ( ! function_exists( 'mytheme_add_buttons' ) ) {
        function mytheme_add_buttons( $plugin_array ) {
            $plugin_array['mybutton'] = get_template_directory_uri().'/js/tinymce_buttons.js';
            return $plugin_array;
        }
    }
    
    if ( ! function_exists( 'mytheme_register_buttons' ) ) {
        function mytheme_register_buttons( $buttons ) {
            array_push( $buttons, 'mybutton' );
            return $buttons;
        }
    }
    

    这将初始化您需要的按钮。现在在tinymce_buttons.js 中添加类似

    (function() {
        tinymce.PluginManager.add('mybutton', function( editor, url ) {
            editor.addButton( 'mybutton', {
                text: 'My button for media upload',
                icon: false,
                onclick: function() {
                    editor.windowManager.open( {
                        title: 'Insert Media',
                        body: [
                            {
                                type: 'textbox',
                                name: 'img',
                                label: 'Image',
                                value: '',
                                classes: 'my_input_image',
                            },
                            {
                                type: 'button',
                                name: 'my_upload_button',
                                label: '',
                                text: 'Upload image',
                                classes: 'my_upload_button',
                            },
                        ],
                        onsubmit: function( e ) {
                            editor.insertContent( '[shortcode-name img="' + e.data.img + '"]');
                        }
                    });
                },
            });
        });
    
    })();
    
    jQuery(document).ready(function($){
        $(document).on('click', '.mce-my_upload_button', upload_image_tinymce);
    
        function upload_image_tinymce(e) {
            e.preventDefault();
            var $input_field = $('.mce-my_input_image');
            var custom_uploader = wp.media.frames.file_frame = wp.media({
                title: 'Add Image',
                button: {
                    text: 'Add Image'
                },
                multiple: false
            });
            custom_uploader.on('select', function() {
                var attachment = custom_uploader.state().get('selection').first().toJSON();
                $input_field.val(attachment.url);
            });
            custom_uploader.open();
        }
    });
    

    首先添加按钮功能。要放入弹出窗口的选项列表为here。它不是 100% 完成的,但比官方文档更好。

    第一部分是按钮初始化。这为您提供了一个“我的媒体上传按钮”按钮,单击时您应该获得一个带有输入字段和一个按钮的模式。

    点击按钮,媒体上传将打开,您可以选择您的图片。选择后,url 将出现在输入字段中,您将在短代码中获得它。

    希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      还有一个类似这样的问题 (Open/Access WP Media library from tinymce plugin popup window),所以我将我的答案粘贴在这里,因为这很相似:

      您好 - 我刚才遇到了同样的问题并找到了解决方案,所以我在这里分享。我希望现在还不算太晚。

      首先要能够使用 WP 添加媒体按钮,您必须将所需的脚本加入队列。这很简单,只需像这样调用 wp_enqueue_media() 函数:

      add_action('admin_enqueue_scripts', 'enqueue_scripts_styles_admin');
      function enqueue_scripts_styles_admin(){
          wp_enqueue_media();
      }
      

      此调用可确保您拥有使用 WP Media 按钮所需的库。

      当然,您还应该有 HTML 元素来保存上​​传/选择的媒体文件 URL,如下所示:

      <input type="text" class="selected_image" />
      <input type="button" class="upload_image_button" value="Upload Image">
      

      第一个文本字段将保存媒体文件的 URL,而第二个文本字段是用于打开媒体弹出窗口本身的按钮。

      然后在你的 jscript 中,你会有这样的东西:

          var custom_uploader;
      
          $('.upload_image_button').click(function(e) {
              e.preventDefault();
      
              var $upload_button = $(this);
      
              //Extend the wp.media object
              custom_uploader = wp.media.frames.file_frame = wp.media({
                  title: 'Choose Image',
                  button: {
                      text: 'Choose Image'
                  },
                  multiple: false
              });
      
              //When a file is selected, grab the URL and set it as the text field's value
              custom_uploader.on('select', function() {
                  var attachment = custom_uploader.state().get('selection').first().toJSON();
                  $upload_button.siblings('input[type="text"]').val(attachment.url);
              });
      
              //Open the uploader dialog
              custom_uploader.open();
      
          });
      

      现在我不会解释每一行,因为它并不难理解。最重要的部分是使用 wp 对象使所有这些工作。

      棘手的部分是在 TinyMCE 弹出窗口上完成所有这些工作(这是我面临的问题)。我已经在 hi 和 lo 中搜索了解决方案,这对我有用。不过在此之前,我先说一下我遇到了什么问题。当我第一次尝试实现这一点时,我在弹出窗口本身遇到了“WP is undefined”问题。要解决这个问题,您只需将 WP 对象传递给脚本,如下所示:

      (function() {
      tinymce.create('tinymce.plugins.someplugin', {
          init : function(ed, url) {
              // Register commands
              ed.addCommand('mcebutton', function() {
                  ed.windowManager.open(
                      {
                          file : url + '/editor_button.php', // file that contains HTML for our modal window
                          width : 800 + parseInt(ed.getLang('button.delta_width', 0)), // size of our window
                          height : 600 + parseInt(ed.getLang('button.delta_height', 0)), // size of our window
                          inline : 1
                      },
                      {
                          plugin_url : url,
                          wp: wp
                      }
                  );
              });
      
              // Register buttons
              ed.addButton('someplugin_button', {title : 'Insert Seomthing', cmd : 'mcebutton', image: url + '/images/some_button.gif' });
          }
      });
      
      // Register plugin
      // first parameter is the button ID and must match ID elsewhere
      // second parameter must match the first parameter of the tinymce.create() function above
      tinymce.PluginManager.add('someplugin_button', tinymce.plugins.someplugin);
      
      })();
      

      我们感兴趣的是这一行 => "wp: wp" 。这一行确保我们将 wp 对象传递给当我们单击 tinymce 按钮时要打开的弹出窗口(实际上是一个 iframe...)。您实际上可以通过此对象(ed.windowManager.open 方法的第二个参数)将任何内容传递给弹出窗口!

      最后但并非最不重要的一点是,您必须像这样在您的 javascript 上引用传递的 wp 对象:

          var args = top.tinymce.activeEditor.windowManager.getParams();
          var wp = args.wp;
      

      确保在调用/使用 WP 对象之前执行此操作。

      这就是完成这项工作所需要做的一切。它对我有用,我希望它对你有用:)

      【讨论】:

      • 感谢@Paolo。传递wp 对象确实是这里的主要线索!
      • 谢谢@Paolo!不幸的是,事情对我不起作用,所以由于没有关于 SO 的直接消息,请通过 andrija.jambrovic@solversint.com 联系我,或者如果我应该问一个 SO 问题,请在此处告诉我 :) 做得很好,文档很烂,这是我发现的第一个高级示例。
      • @Andrija:你有什么问题?我会尽力提供帮助。
      • 好的,上一个答案是为我做的 :D 但是感谢您提供帮助:)
      • @KushagraAg​​arwal:已经有一段时间了,但我想我只是把它放在 /js 文件夹中,比 PHP 文件高 1 级。你实际上可以把它放在你想要的任何地方。只要确保正确引用它。
      猜你喜欢
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多