问题描述

假设我想将一些 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.MetaFromrevisions.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.MetaFromrevisions.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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。