问题描述
我想加强媒体编辑器,WordPress 3.5 之后,在画廊视图。我想在右侧添加一个新的选择字段,并将所选值发送到图库的短码。
我认为,wp-includes/js/media-editor.js
中的 wp.media.gallery
功能是插入画廊短码的默认功能。
我想添加一个新参数,参数的值来自媒体管理器中的选择字段。
我玩过不同的来源,特别是来自 this question,但是 Backbone 对我来说是非常新的,我不明白它是如何工作的。我也玩过钩子 print_media_templates
,但在媒体视图上没有结果。
我应该使用什么钩子?
最佳解决方案
如果你真的想使用骨干模板,那么你的钩子是正确的。
我将使用 jQuery 插入 HTML 模板,而不是覆盖库设计视图的 template()
函数。但是我猜你已经知道了,所以我会发布 Backbone 版本:
add_action('print_media_templates', function(){
// define your backbone template;
// the "tmpl-" prefix is required,
// and your input field should have a data-setting attribute
// matching the shortcode name
?>
<script type="text/html" id="tmpl-my-custom-gallery-setting">
<label class="setting">
<span><?php _e('My setting'); ?></span>
<select data-setting="my_custom_attr">
<option value="foo"> Foo </option>
<option value="bar"> Bar </option>
<option value="default_val"> Default Value </option>
</select>
</label>
</script>
<script>
jQuery(document).ready(function(){
// add your shortcode attribute and its default value to the
// gallery settings list; $.extend should work as well...
_.extend(wp.media.gallery.defaults, {
my_custom_attr: 'default_val'
});
// merge default gallery settings template with yours
wp.media.view.Settings.Gallery = wp.media.view.Settings.Gallery.extend({
template: function(view){
return wp.media.template('gallery-settings')(view)
+ wp.media.template('my-custom-gallery-setting')(view);
}
});
});
</script>
<?php
});
次佳解决方案
一个小来源,也许是一个插件来创建解决方案。起初 php 部分,包含媒体管理器中的按钮的 javascript 。更有用的答案,但是 @One Trick Pony 的答案是创建和正确的方向和 JS 解决方案。
查看图片上的结果:
由此产生的短码,如果大小不是默认大小:
钩子 print_media_templates
是包含按钮,标记的正确的地方。还有一个脚本入队,有附加控件的解决方案。
class Custom_Gallery_Setting {
/**
* Stores the class instance.
*
* @var Custom_Gallery_Setting
*/
private static $instance = null;
/**
* Returns the instance of this class.
*
* It's a singleton class.
*
* @return Custom_Gallery_Setting The instance
*/
public static function get_instance() {
if ( ! self::$instance )
self::$instance = new self;
return self::$instance;
}
/**
* Initialises the plugin.
*/
public function init_plugin() {
$this->init_hooks();
}
/**
* Initialises the WP actions.
* - admin_print_scripts
*/
private function init_hooks() {
add_action( 'wp_enqueue_media', array( $this, 'wp_enqueue_media' ) );
add_action( 'print_media_templates', array( $this, 'print_media_templates' ) );
}
/**
* Enqueues the script.
*/
public function wp_enqueue_media() {
if ( ! isset( get_current_screen()->id ) || get_current_screen()->base != 'post' )
return;
wp_enqueue_script(
'custom-gallery-settings',
plugins_url( 'js/custom-gallery-setting.js', __FILE__ ),
array( 'media-views' )
);
}
/**
* Outputs the view template with the custom setting.
*/
public function print_media_templates() {
if ( ! isset( get_current_screen()->id ) || get_current_screen()->base != 'post' )
return;
?>
<script type="text/html" id="tmpl-custom-gallery-setting">
<label class="setting">
<span>Size</span>
<select class="type" name="size" data-setting="size">
<?php
$sizes = apply_filters( 'image_size_names_choose', array(
'thumbnail' => __( 'Thumbnail' ),
'medium' => __( 'Medium' ),
'large' => __( 'Large' ),
'full' => __( 'Full Size' ),
) );
foreach ( $sizes as $value => $name ) { ?>
<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, 'thumbnail' ); ?>>
<?php echo esc_html( $name ); ?>
</option>
<?php } ?>
</select>
</label>
</script>
<?php
}
}
// Put your hands up...
add_action( 'admin_init', array( Custom_Gallery_Setting::get_instance(), 'init_plugin' ), 20 );
以下源代码是 javascript,在 php 的示例源中,文件 custom-gallery-setting.js
/**
* Custom Gallery Setting
*/
( function( $ ) {
var media = wp.media;
// Wrap the render() function to append controls
media.view.Settings.Gallery = media.view.Settings.Gallery.extend({
render: function() {
media.view.Settings.prototype.render.apply( this, arguments );
// Append the custom template
this.$el.append( media.template( 'custom-gallery-setting' ) );
// Save the setting
media.gallery.defaults.size = 'thumbnail';
this.update.apply( this, ['size'] );
return this;
}
} );
} )( jQuery );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。