问题描述
假设我想将一些 post_meta 添加到”new” 修订版 UI 中。我只在修改版本上保存一些元数据,并希望在此屏幕上显示。
通常我会打开 wp-admin/revisions.php
寻找一些钩子和代码。但是修订页面都是用 Backbone 完成的。我不知道骨干 (完全愿意学习) 。但是,我无法找到有关如何在 WordPress 中修改现有管理员骨干视图的任何内容。
有没有人成功修改了这个界面,可以提供一个如何做到的例子?
最佳解决方案
不幸的是,WordPress 并没有建立标准化的最佳实践来吸引骨干模板。已经有 plans suggested 将熟悉的过滤器和操作 API 引入到 WordPress 中的 Javascript 中,但这种运动缺乏牵引力。 Carl Danley created a library which does just that,如果您正在尝试以最细微的方式构建/jerry-rig 代码,所有这些都可以帮助您完成所有尝试。
基本上,您正在尝试覆盖 revisions.view.Meta
的微型模板中发生的情况。
没有一种简单的方法来覆盖微模板标记本身。我建议覆盖从 revisions.view.Meta
扩展到 revisions.view.MetaFrom
和 revisions.view.MetaTo
的任何构造函数的.template()
方法。为了做到这一点,这里有一些样板:
add_action( 'admin_footer-revision.php', function() {
$post = get_post();
?>
<script id="tmpl-revisions-meta-override" type="text/html">
<# if ( ! _.isUndefined( data.attributes ) ) { #>
<div class="diff-title">
<# if ( 'from' === data.type ) { #>
<strong><?php _ex( 'From:', 'Followed by post revision info' ); ?></strong>
<# } else if ( 'to' === data.type ) { #>
<strong><?php _ex( 'To:', 'Followed by post revision info' ); ?></strong>
<# } #>
<div class="author-card<# if ( data.attributes.autosave ) { #> autosave<# } #>">
{{{ data.attributes.author.avatar }}}
<div class="author-info">
<# if ( data.attributes.autosave ) { #>
<span class="byline"><?php printf( __( 'Autosave by %s' ),
'<span class="author-name">{{ data.attributes.author.name }}</span>' ); ?></span>
<# } else if ( data.attributes.current ) { #>
<span class="byline"><?php printf( __( 'Current Revision by %s' ),
'<span class="author-name">{{ data.attributes.author.name }}</span>' ); ?></span>
<# } else { #>
<span class="byline"><?php printf( __( 'Revision by %s' ),
'<span class="author-name">{{ data.attributes.author.name }}</span>' ); ?></span>
<# } #>
<span class="time-ago">{{ data.attributes.timeAgo }}</span>
<span class="date">({{ data.attributes.dateShort }})</span>
</div>
Your custom text here
<# if ( 'to' === data.type && data.attributes.restoreUrl ) { #>
<input <?php if ( wp_check_post_lock( $post->ID ) ) { ?>
disabled="disabled"
<?php } else { ?>
<# if ( data.attributes.current ) { #>
disabled="disabled"
<# } #>
<?php } ?>
<# if ( data.attributes.autosave ) { #>
type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Autosave' ); ?>" />
<# } else { #>
type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Revision' ); ?>" />
<# } #>
<# } #>
</div>
<# if ( 'tooltip' === data.type ) { #>
<div class="revisions-tooltip-arrow"><span></span></div>
<# } #>
<# } #>
</script>
<script>
(function($) {
wp.revisions.view.MetaFrom.prototype.template = wp.template('revisions-meta-override');
wp.revisions.view.MetaTo.prototype.template = wp.template('revisions-meta-override');
})(jQuery);
</script>
<?php
} );
并解释一下。我们正在修改管理页面的页脚,所以我们保证构造函数 revisions.view.MetaFrom
和 revisions.view.MetaTo
have been defined,但在修订模块引导程序 has been triggered 之前。这很重要,因为我们要在构造函数使用之前修改它们。我将 revisions.view.Meta
的微型模板的内容逐字复制到模板 #tmpl-revisions-meta-override
的覆盖版本中,但注意我已经在模板中添加了 Your custom text here
,其中您希望使用自定义文本。然后,我使用修改的微型模板的 ID 作为参考,覆盖构造函数的 template()
方法。
瞧。现在,这取决于你对自定义文本的处理方式。如果你想在那里放一些文字,去吧。如果要输出特定于该修订版本的文本,您将需要查看 Carl Danley 上述的库,并触发通过 data
的过滤器钩子,以便您可以输出特定于当前数据的特定内容。
我知道,这是疯狂的。但是这是我们在 WordPress 骨干模板中覆盖 Javascript 的地方。我们应该讨论如何烘焙可定制性,就像你要求的核心一样,但我们并不是因为缺乏兴趣/动力。随时在我们的 weekly WordPress core developer chats 上引发谈话。我会在那里。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。