问题描述

在我的插件中,我想添加两个按钮到媒体管理器 (在”media-toolbar-primary” 部分的 “插入发布” 的左侧),并连接一个 jQuery 操作。

  1. 第一个 – “Select All” 按钮可以选择所有可用的图像 (仅图像),具体取决于所选的选项值 (例如所有媒体项目,上传到此帖子等) 。因此,如果选择了 “所有媒体项目” – 所有可用的图像都将被选中,如果选择了 “已上传到此帖子”,则只会选择附加到当前帖子的图像。

  2. 第二个 – “自定义插入到邮件” – 将获取所有选定图像的图像数据 (全尺寸图像源,替代文字,大小等可用),同时允许将它们包装在有条件的 HTML 代码中 – 将代码返回到锡伯斯编辑器。

第二个按钮的返回代码可以这样看:

<ul>
  <li><img src="full/path/to/001.jpg" alt="alt text 1" /></li>
  <li><img src="full/path/to/002.jpg" alt="alt text 2" /></li>
  <li><img src="full/path/to/003.jpg" alt="alt text 3" /></li>
  <li><img src="full/path/to/004.jpg" alt="alt text 4" /></li>
  <li><img src="full/path/to/005.jpg" alt="alt text 5" /></li>
</ul>

据我所知,唯一的方法是使用覆盖适当的 Backbone 视图,但除此之外,这就是我现在所知道的。

感谢帮助。

最佳解决方案

这个代码块将在 “插入到帖子” 旁边添加一个按钮。点击后,它会将选定的图像发送到 WP 编辑器,每个都包含在您的模板 HTML 中:

var wpMediaFramePost = wp.media.view.MediaFrame.Post;
wp.media.view.MediaFrame.Post = wpMediaFramePost.extend(
{
    mainInsertToolbar: function( view )
    {
        "use strict";

        wpMediaFramePost.prototype.mainInsertToolbar.call(this, view);

        var controller = this;

        this.selectionStatusToolbar( view );

        view.set( "customInsertIntoPost", {
            style: "primary",
            priority: 80,
            text: "Insert selected images into post",
            requires: { selection: true },

            click: function()
            {
                var state = controller.state(),
                    selection = state.get("selection")._byId,
                    template = _.template('<li><img src="<%=%20imagePath%20%>" alt="<%= altText %>" /></li>'),
                    output = "<ul>";

                _.each(selection, function( item )
                {
                    if( item.attributes.type === "image" )
                    {
                        output += template({
                            imagePath: item.attributes.sizes.full.url,
                            altText: item.attributes.alt
                        });
                    }
                });

                output += "</ul>";

                send_to_editor(output);
            }
        });
    }
});

添加自定义按钮不是问题。但选择”all images” 可能会有点棘手,因为 WP 3.5 媒体浏览器一点一点地加载附件。我会研究一下,但我建议您手动选择附件。

次佳解决方案

编写一个小插件,使用以下示例源将叠加弹出窗口中的媒体管理器左侧栏列表中添加一个项目。

结果如下:

add_action( 'admin_footer-post-new.php', 'wpse_78881_script' );
add_action( 'admin_footer-post.php', 'wpse_78881_script' );
function wpse_78881_script() {
    ?>
    <script type="text/javascript">
        jQuery(window).on('load', function() {
            var media   = window.wp.media,
            Attachment  = media.model.Attachment,
            Attachments = media.model.Attachments,
            Query       = media.model.Query,
            l10n        = media.view.l10n = typeof _wpMediaViewsL10n === 'undefined' ? {} : _wpMediaViewsL10n,
            My_new_item = undefined,
            Item_string = 'New Item!';

            jQuery(document).on( 'click', '.insert-media', function( event ) {
                var workflow = wp.media.editor.get();
                var options  = workflow.options;

                if ( undefined == My_new_item ) {
                    // see for wp.media.view.RouterItem also: wp-includes/js/media-views.js
                    My_new_item = new wp.media.view.RouterItem( _.extend( options, { text: Item_string } ) );
                    workflow.menu.view.views.set( '.media-menu', My_new_item, _.extend( options, { add: true } ) );
                }

            });
        });
    </script>
    <?php
}

第三种解决方案

我没有完全答复你的问题,但这是一个好的开始。要自定义新的媒体管理器,您应该学习 wp-includes/js/media-views.js 中的 JavaScript 骨干代码。例如,这是一个小插件,将 “”Select All”” 按钮添加到 “从 URL 插入” 工具栏中:

custom.php

add_action('admin_enqueue_scripts', 'custom_add_script');
function custom_add_script(){
    wp_enqueue_script('custom', plugins_url('custom.js', __FILE__), array('media-views'), false, true);
}

custom.js

var originalToolbar = wp.media.view.Toolbar.Embed;
wp.media.view.Toolbar.Embed = originalToolbar.extend({
    // code modified from media-views.js, l 2500
    initialize: function() {

        this.options.items = _.defaults( this.options.items || {}, {
            // keep the original button
            select: {
                style:    'primary',
                text:     wp.media.view.l10n.insertIntoPost,
                priority: 80,
                click:    this.clickSelect,
                requires: false
            },
            // and add a new one
            selectAll: {
                text: 'Select All',
                style: 'primary',
                priority: 80,
                requires: false,
                click: this.selectAll
            }
        });

        wp.media.view.Toolbar.Select.prototype.initialize.apply( this, arguments );
    },

    selectAll: function(){
        console.log('select All');
    }
});

对于 “自定义插入到邮件” 按钮,我建议使用图库短代码。 UI 已经存在,用于选择所需的图像,并将该短码插入锡姆恰的正确位置。你所要做的就是编写自己的画廊短码格式。

看看 wp-includes/media.php 中的 gallery_shortcode 功能,并使用 post_gallery 滤镜。

第四种方案

托马斯·格里芬创建了一个插件示例,New Media Image Uploader,关于如何使用新的媒体经理。

This plugin provides a solid example for integrating the new media manager workflow into your plugins/themes by showing you how to upload/insert an image file into a text field.

第五种方案

我刚刚在 WP 3.6 中遇到过一个案例,其中 aesqe(非常有用) 的答案导致图像被插入两次,因为主干的 state.get("selection")._byId 包括 idcid 对于所选择的每个图像。

state.get("selection")._byId 更改为 state.get("selection").models,同时保留每个对象的属性。

希望这样可以让某人有些沮丧。我会把它作为一个意见而不是一个答案,但唉,我没有声望。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。