将按钮追加到WordPress图像详细信息模式

时间:2017-05-25 作者:Jack Ottermans

我已经找了几天了,所以我会尽量简短地回答我的问题,以避开你的提问。

我想我在jQuery(append)中所做的应该是非常基本的,但由于一些奇怪的原因,我无法在添加时完成它。js到后端。此外,这种自定义黑客只是暂时的,直到Gutenberg editor 释放到核心,所有这些都将不再需要。

Q:

Simply add a "Hello world!" string to the Image Details modal where the red text on the screenshot(s) below is.

--

下面的屏幕截图是我正在做的一个快速的峰会。

enter image description here

在单个图像上按Edit(编辑)时,会弹出此Image Details(图像详细信息)模式not 是媒体库的一部分,并且没有Post\\u ID。例如,占位符(URL)图像。

2号截图。此图像详细信息模式是您在之前添加到媒体库帖子的图像上单击“编辑图像”时得到的。预览缩略图下方美丽的替换按钮刺痛了我的眼睛,我想要他,他是我的Chuck Norris!

enter image description here

3 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

这里有一种操作模板的替代技术。我改编了下面的解决方案this post.

在下面的方法中print_media_templates 挂钩,在wp-includes/media-template.php, 用于输出一些JavaScript,以删除默认的图像详细信息下划线模板(<script type="text/html" id="tmpl-image-details">) 并将其替换为一个复制版本,我们可以对其进行修改以满足我们的需要。

我添加了你好,世界在修改后的模板中,以及替换按钮(稍后将详细介绍)。这种方法的缺点之一是,如果/当WordPress核心更新时,我们的分叉模板将不会反映对此特定媒体模板的任何更改。

这里的另一个问题是,仅仅添加按钮是不够的。您可以通过删除HTML注释来激活该按钮(<!---->) 如果你想继续的话,我会把它包起来。在不属于媒体库的图像上使用标准的“替换”(Replace)按钮将触发控制台中的错误,但似乎始终有效。理想情况下,应该创建一个自定义按钮,或者应该实现处理Replace按钮功能的JS控制器(我不知道该怎么做)。

add_action( \'print_media_templates\', \'wpse_print_media_templates\' );
function wpse_print_media_templates() { ?>
    <script>
        // Idea via http://unsalkorkmaz.com/wp3-5-media-gallery-edit-modal-change-captions-to-title/
        jQuery( document ).ready( function( $ ){
            jQuery( "script#tmpl-image-details:first" ).remove();
        });
    </script>

    <script type="text/html" id="tmpl-image-details">
        <div class="media-embed">
            <div class="embed-media-settings">
                <div class="column-image">
                    <div class="image">
                        <img src="{{ data.model.url }}" draggable="false" alt="" />

                        <# if ( data.attachment && window.imageEdit ) { #>
                            <div class="actions">
                                <input type="button" class="edit-attachment button" value="<?php esc_attr_e( \'Edit Original\' ); ?>" />
                                <input type="button" class="replace-attachment button" value="<?php esc_attr_e( \'Replace\' ); ?>" />
                            </div>
                        <# } else if ( ! data.attachment && window.imageEdit ) { #>
                            <!--
                                <div class="actions">
                                    <input type="button" class="replace-attachment button my-theme"  value="<?php esc_attr_e( \'Replace\' ); ?>" />
                                </div>
                             -->
                        <# } #>
                        <h1>Hello, world!</h1>
                    </div>
                </div>
                <div class="column-settings">
                    <?php
                    /** This filter is documented in wp-admin/includes/media.php */
                    if ( ! apply_filters( \'disable_captions\', \'\' ) ) : ?>
                        <label class="setting caption">
                            <span><?php _e(\'Caption\'); ?></span>
                            <textarea data-setting="caption">{{ data.model.caption }}</textarea>
                        </label>
                    <?php endif; ?>

                    <label class="setting alt-text">
                        <span><?php _e(\'Alternative Text\'); ?></span>
                        <input type="text" data-setting="alt" value="{{ data.model.alt }}" />
                    </label>

                    <h2><?php _e( \'Display Settings\' ); ?></h2>
                    <div class="setting align">
                        <span><?php _e(\'Align\'); ?></span>
                        <div class="button-group button-large" data-setting="align">
                            <button class="button" value="left">
                                <?php esc_html_e( \'Left\' ); ?>
                            </button>
                            <button class="button" value="center">
                                <?php esc_html_e( \'Center\' ); ?>
                            </button>
                            <button class="button" value="right">
                                <?php esc_html_e( \'Right\' ); ?>
                            </button>
                            <button class="button active" value="none">
                                <?php esc_html_e( \'None\' ); ?>
                            </button>
                        </div>
                    </div>

                    <# if ( data.attachment ) { #>
                        <# if ( \'undefined\' !== typeof data.attachment.sizes ) { #>
                            <label class="setting size">
                                <span><?php _e(\'Size\'); ?></span>
                                <select class="size" name="size"
                                    data-setting="size"
                                    <# if ( data.userSettings ) { #>
                                        data-user-setting="imgsize"
                                    <# } #>>
                                    <?php
                                    /** This filter is documented in wp-admin/includes/media.php */
                                    $sizes = apply_filters( \'image_size_names_choose\', array(
                                        \'thumbnail\' => __(\'Thumbnail\'),
                                        \'medium\'    => __(\'Medium\'),
                                        \'large\'     => __(\'Large\'),
                                        \'full\'      => __(\'Full Size\'),
                                    ) );

                                    foreach ( $sizes as $value => $name ) : ?>
                                        <#
                                        var size = data.sizes[\'<?php echo esc_js( $value ); ?>\'];
                                        if ( size ) { #>
                                            <option value="<?php echo esc_attr( $value ); ?>">
                                                <?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}
                                            </option>
                                        <# } #>
                                    <?php endforeach; ?>
                                    <option value="<?php echo esc_attr( \'custom\' ); ?>">
                                        <?php _e( \'Custom Size\' ); ?>
                                    </option>
                                </select>
                            </label>
                        <# } #>
                            <div class="custom-size<# if ( data.model.size !== \'custom\' ) { #> hidden<# } #>">
                                <label><span><?php _e( \'Width\' ); ?> <small>(px)</small></span> <input data-setting="customWidth" type="number" step="1" value="{{ data.model.customWidth }}" /></label><span class="sep">&times;</span><label><span><?php _e( \'Height\' ); ?> <small>(px)</small></span><input data-setting="customHeight" type="number" step="1" value="{{ data.model.customHeight }}" /></label>
                            </div>
                    <# } #>

                    <div class="setting link-to">
                        <span><?php _e(\'Link To\'); ?></span>
                        <select data-setting="link">
                        <# if ( data.attachment ) { #>
                            <option value="file">
                                <?php esc_html_e( \'Media File\' ); ?>
                            </option>
                            <option value="post">
                                <?php esc_html_e( \'Attachment Page\' ); ?>
                            </option>
                        <# } else { #>
                            <option value="file">
                                <?php esc_html_e( \'Image URL\' ); ?>
                            </option>
                        <# } #>
                            <option value="custom">
                                <?php esc_html_e( \'Custom URL\' ); ?>
                            </option>
                            <option value="none">
                                <?php esc_html_e( \'None\' ); ?>
                            </option>
                        </select>
                        <input type="text" class="link-to-custom" data-setting="linkUrl" />
                    </div>
                    <div class="advanced-section">
                        <h2><button type="button" class="button-link advanced-toggle"><?php _e( \'Advanced Options\' ); ?></button></h2>
                        <div class="advanced-settings hidden">
                            <div class="advanced-image">
                                <label class="setting title-text">
                                    <span><?php _e(\'Image Title Attribute\'); ?></span>
                                    <input type="text" data-setting="title" value="{{ data.model.title }}" />
                                </label>
                                <label class="setting extra-classes">
                                    <span><?php _e(\'Image CSS Class\'); ?></span>
                                    <input type="text" data-setting="extraClasses" value="{{ data.model.extraClasses }}" />
                                </label>
                            </div>
                            <div class="advanced-link">
                                <div class="setting link-target">
                                    <label><input type="checkbox" data-setting="linkTargetBlank" value="_blank" <# if ( data.model.linkTargetBlank ) { #>checked="checked"<# } #>><?php _e( \'Open link in a new tab\' ); ?></label>
                                </div>
                                <label class="setting link-rel">
                                    <span><?php _e(\'Link Rel\'); ?></span>
                                    <input type="text" data-setting="linkRel" value="{{ data.model.linkClassName }}" />
                                </label>
                                <label class="setting link-class-name">
                                    <span><?php _e(\'Link CSS Class\'); ?></span>
                                    <input type="text" data-setting="linkClassName" value="{{ data.model.linkClassName }}" />
                                </label>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </script>       
    <?php
}

SO网友:birgire

预览缩略图下方美丽的替换按钮刺痛了我的眼睛,我想要他,他是我的Chuck Norris!

“查克·诺里斯(ChuckNorris)不会用键盘编程。他会一直盯着电脑,直到它按自己的意愿运行”(src)

对于我们这些需要键盘编程的人来说,有一种方法可以在.image img 选择器(如果缺少):

replace

我们将ImageDetails 媒体查看并覆盖resetFocus() 方法:

add_action( \'print_media_templates\', function() { ?> 
   <script>
    jQuery(document).ready( function( $ ) {
        wp.media.view.ImageDetails = wp.media.view.ImageDetails.extend({
            resetFocus: function() {
               this.$( \'.link-to-custom\' ).blur();
               this.$( \'.embed-media-settings\' ).scrollTop( 0 );
               // Inject Replace button if it\'s missing:
               if( ! this.$(\'.replace-attachment\' ).length ) {
                   this.$( \'<div class="actions"> <input type="button"  class="replace-attachment button my-theme" value="Replace" /></div>\' ).insertAfter(\'.image img\');
               }
            }
        });
    }); 
   </script> 
<?php } );
我们还可以覆盖initialize() 方法并钩住post-render 事件,如问题中所述here 作者:Druzion。

以下是该问题的有效修改版本:

add_action( \'print_media_templates\', function() { ?> 
   <script>
    jQuery(document).ready( function( $ ) {
        wp.media.view.ImageDetails = wp.media.view.ImageDetails.extend({
            initialize: function() {
                this.on( \'post-render\', this.add_settings );
            },
            add_settings: function() {
                // Inject Replace button if it\'s missing:
                if( ! this.$(\'.replace-attachment\' ).length ) {
                    this.$(\'.image\').append( \'<div class="actions"><input type="button" class="replace-attachment button my-theme" value="Replace" /></div>\');
                }
            }
        });
    }) 
   </script> 
<?php } );
请注意this.$ 使用而不是$.

类似地,我们可以覆盖render() 方法,就像我玩的here.

另一种方法是使用输出缓冲和子字符串替换来替换部分默认模板,就像@bonger所做的那样here.

还要注意@Dave Romsey提到的替换按钮使用中的javascript错误

SO网友:Jack Ottermans

我为使用这种技术感到羞耻,但如果三天内没有人想帮忙,到处询问,你就会变得有些绝望,想找到解决方案。

function hijack_caption_off_filter() {

    $shame = \'<input type="button" class="replace-attachment button my-theme" value="Replace" />\';

    echo $shame;

}
add_filter( \'disable_captions\', \'hijack_caption_off_filter\' );
我想说的是人们应该not 做这样的事情。我在这里所做的是,我劫持了一个标题布尔过滤器[真/假],并通过它回应了我的按钮,只是为了让他出现在media\\u模板上。

结束