使带有媒体上传的小工具可重复使用

时间:2018-01-27 作者:JLW

我已经创建了一个自定义Wordpress小部件,它允许我用媒体上传器上传图像,一切正常,但现在我想让它可以重复。我用它为一个简单的滑块上传照片,这就是为什么我需要在一个小部件中有多个媒体上传器。只允许一个媒体上传器选择多张照片是行不通的,因为每个特定的照片都有文本字段。

理想情况下,最好有某种“添加另一张幻灯片”按钮,允许我在一个小部件中有我想要的尽可能多的上传者,但在这一点上,我只能在代码中设置一定数量的幻灯片。

我以前从来没有做过这样的事情,所以这段代码只是我从在线搜索中找到的信息中拼凑出来的一些片段,这意味着我对它的理解不是很好,所以我无法找出如何重复它。我把一些不同的事情弄得一团糟,但什么都没做出来。我尝试过简单地复制代码中的图像上传部分并更改ID,就像我能够处理文本区域一样,但这只给了我两个媒体上传器,它们似乎是链接的,因为当我更改一个时,它们都会更改。

我也愿意接受任何关于如何改进或清理此代码的建议。正如我所说,我对这一点有点不熟悉,所以我不确定这段代码写得有多好。

PHP

<p>
    <label for="<?php echo $this->get_field_id(\'subheading_1\'); ?>">Subheading</label><br />
    <input type="text" name="<?php echo $this->get_field_name(\'subheading_1\'); ?>" id="<?php echo $this->get_field_id(\'subheading_1\'); ?>" value="<?php echo $instance[\'subheading_1\']; ?>" class="widefat" />
</p>
<p>
    <label for="<?php echo $this->get_field_id(\'body_1\'); ?>">Body Text</label><br />
    <input type="text" name="<?php echo $this->get_field_name(\'body_1\'); ?>" id="<?php echo $this->get_field_id(\'body_1\'); ?>" value="<?php echo $instance[\'body_1\']; ?>" class="widefat" />
</p>

<p>
    <label for="<?php echo $this->get_field_id(\'image_uri_1\'); ?>">Image</label><br />
    <?php
        if ( $instance[\'image_uri_1\'] != \'\' ) :
            echo \'<img class="custom_media_image" src="\' . $instance[\'image_uri_1\'] . \'" style="margin:0;padding:0;max-width:100px;float:left;display:inline-block" /><br />\';
        endif;
    ?>
    <input type="text" class="widefat custom_media_url" name="<?php echo $this->get_field_name(\'image_uri_1\'); ?>" id="<?php echo $this->get_field_id(\'image_uri_1\'); ?>" value="<?php echo $instance[\'image_uri_1\']; ?>" style="margin-top:5px;">

    <input type="button" class="button button-primary custom_media_button" id="custom_media_button" name="<?php echo $this->get_field_name(\'image_uri_1\'); ?>" value="Upload Image" style="margin-top:5px;" />
</p>
JS

jQuery(document).ready( function($) {
function media_upload(button_class) {
    var _custom_media = true,
    _orig_send_attachment = wp.media.editor.send.attachment;

    $(\'body\').on(\'click\', button_class, function(e) {
        var button_id =\'#\'+$(this).attr(\'id\');
        var self = $(button_id);
        var send_attachment_bkp = wp.media.editor.send.attachment;
        var button = $(button_id);
        var id = button.attr(\'id\').replace(\'_button\', \'\');
        _custom_media = true;
        wp.media.editor.send.attachment = function(props, attachment){
            if ( _custom_media  ) {
                $(\'.custom_media_id\').val(attachment.id);
                $(\'.custom_media_url\').val(attachment.url);
                $(\'.custom_media_image\').attr(\'src\',attachment.url).css(\'display\',\'block\');
            } else {
                return _orig_send_attachment.apply( button_id, [props, attachment] );
            }
        }
        wp.media.editor.open(button);
            return false;
    });
}
media_upload(\'.custom_media_button.button\');
});
提前感谢!

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

由于数据结构和UI趋于僵化,使用小部件不可能实现简单的可重复性。从表面上看,按照您在问题中描述的方式,您可以使用媒体库选择多个图像,而不是一个图像,并将它们作为附件ID列表保存。你应该看看core gallery的图片,寻找灵感。

如果这还不够好,那么应该在UI和小部件数据的DB存储之间进行分离。按照gallery小部件中提出的相同思路,而不是每个可重复数据都有一个字段,而是将所有数据分组到一个隐藏的输入字段中,并创建一个JS,在显示小部件表单时从中提取数据,并在发生更改时将数据存储在其中。(显然,如果一个存储“字段”的限制太大,您可以使用更多,关键是要有一个固定数量的字段)

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst