当前位置: 首页 > 知识库问答 >
问题:

TinyMCE弹出窗口添加媒体按钮

叶恩
2023-03-14

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

共有2个答案

公羊晟
2023-03-14

还有另一个类似的问题(从tinymce插件弹出窗口打开/访问WP媒体库),所以我将我的答案粘贴在这里,因为这是类似的:

嗨,我刚才遇到了同样的问题,找到了解决方案,所以我在这里分享。我希望不会太晚。

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

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

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

当然,您还应该有超文本标记语言元素来保存上传/选择的媒体文件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弹出窗口上完成所有这些工作(这是我面临的问题)。我已经搜索了嗨和洛的解决方案,以下是对我有效的方法。但在此之前,我先说说我遇到了什么问题。当我第一次尝试实现这一点时,我遇到了弹出窗口本身的“WP未定义”问题。为了解决这个问题,你只需要像这样把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);

})();

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

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

在调用/使用WP对象之前,请确保这样做。

这就是你要做的一切,让这一切顺利。它对我有用,我希望它对你有用:)

伯庆
2023-03-14

不知道这是否有用,但我有同样的问题,并像这样解决了它。

functions.php中add

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();
    }
});

首先添加按钮功能。此处给出了要放入弹出窗口的选项列表。它不是100%完整,但比官方文件要好,因为官方文件是垃圾。

第一部分是按钮初始化。这会给你一个“媒体上传的我的按钮”按钮,点击你会得到一个带有输入字段和按钮的模式。

单击按钮,媒体上传将打开,您可以选择您的图像。在选择时,网址将在输入字段中,您将在短代码中获得它。

希望有帮助:)

 类似资料:
  • 本文向大家介绍javascript弹出窗口中增加确定取消按钮,包括了javascript弹出窗口中增加确定取消按钮的使用技巧和注意事项,需要的朋友参考一下 比例a标签点击后,弹出带确定与取消的窗口,点击确定则执行一个动作,否则不执行. 首先我们用ecshop 模板使用举例 解释.$votings用来判断是否多次投票,如果再投票,则执行 js函数vote_this(),扣积分. 如果后台发现会员是初

  • 问题内容: 我想使用Firefox浏览器,使用RSelenium从网站下载文件。我正确地完成了所有操作(导航,选择正确的元素并写下我想要的内容);现在,我单击“下载”按钮,然后打开一个Firefox弹出窗口,并询问我是否要下载文件或“用…打开”。 不幸的是,由于隐私限制,我无法编写示例。 我的问题是:如何在需要时切换到弹出窗口/警报并单击“确定”? 我尝试了以下方法,但均未成功: 我也试过了 但是

  • Popup 是一种可以包含任何Html内容的弹出窗口,从App的主内容区域上弹出。 Popup 和其他所有的遮罩图层一样,是所谓的“临时视图”的一部分。 Popup 布局 Popup 布局相当简单. 你所需要做的就是将放到 body 里正确的位置上: <div class="modal modal-no-buttons"> ... <div class="popup"> An

  • 问题内容: 因此,我一直在用Qt为我的Python应用程序创建GUI。我现在遇到的情况是,按下按钮后,将执行适当的推迟操作,我们执行一些任务,然后需要打开一个单独的窗口,其中包含一两个东西。但是我似乎无法弄清楚如何创建这个新的单独窗口。谁能给我一个如何创建一个例子吗? 问题答案: 一个使您抓狂的常见错误是忘记将创建的弹出窗口的句柄存储在将保持活动状态的python变量中(例如,存储在主窗口的数据成

  • 问题内容: 我已经开始了angularjs项目,我想实现fancybox。 为此,我在解决方案中包含了jQuery和fancybox插件。我试图在下面的fancybox窗口中显示的代码中打开模板。 视图 控制者 还有 popup / add.html Fancybox成功打开了一个包含模板的窗口,但是该表达式尚未求值。谁能帮忙吗? 问题答案: 我已经为fancybox创建了指令

  • E/AndroidRuntime:致命异常:main process:com.luteraa.luteraaesports,pid:6355 java.lang.nullpointerException:试图在com.luteraa.luteraaesports.bgmicategoryAdapter.OpenDialog(bgmicategoryAdapter.java.access$000(b