web-dev-qa-db-ja.com

どうやって新しいリビジョンのUI(3.6+)を修正し修正するのですか?

"new"リビジョンUIにpost_metaを追加したいとしましょう。私はリビジョンだけでいくつかのメタを保存しています、そしてこのスクリーンにそれを表示したいです。

enter image description here

通常は、いくつかのフックを探してコードを探すためのwp-admin/revisions.php検索を開きます。しかし、改訂ページはすべて Backbone で行われます。私はバックボーンを知りません(完全に学ぶ意欲があります)。しかし、私はWordPressで既存の管理者バックボーンビューを変更する方法について何も見つけることができません。

誰かがこのインターフェースを正常に変更し、それがどのように行われることができるかの例を提供することができますか?

7
jjeaton

残念ながら、バックボーンテンプレートにフックするためにWordPressによって制定された標準化されたベストプラクティスはありません。 WordPressのJavascriptに慣れ親しんだフィルタとアクションのAPIを取り入れるための 計画の提案 がありましたが、この動きに牽引力がありません。 Carl Danley ちょうどそれを実現するライブラリ を作成しました。これは、自分がやろうとしていることをするために/ jerry-rigコードを最も細かい方法で構築しようとしている場合に役立ちます。

基本的に、あなたはrevisions.view.Metaのマイクロテンプレートで起こっていることを上書きしようとしています。

マイクロテンプレートのマークアップ自体をオーバーライドする簡単な方法はありません。私が提案したいのは、revisions.view.Metaから拡張するコンストラクタの.template()メソッドをオーバーライドすることです。それらはrevisions.view.MetaFromrevisions.view.MetaToです。これを行うには、ここでいくつかの定型文があります:

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 と定義されていますが、リビジョンモジュールbootstrapper がトリガされる前に です。コンストラクタを使用する前に修正したいので、これは重要です。 revisions.view.Metaのmicrotemplateの内容をそのままテンプレート#tmpl-revisions-meta-overrideのオーバーライドされたバージョンにコピーしましたが、カスタムテキストが欲しいように見えるYour custom text hereをテンプレートに追加しました。次に、変更したマイクロテンプレートのIDを参照として使用して、両方のコンストラクタのtemplate()メソッドをオーバーライドします。

ほら。今、それはあなたがあなたのカスタムテキストで何をしたいのかに依存します。そこにテキストを配置したい場合は、それを行ってください。そのリビジョンに固有のテキストを出力したい場合は、Carl Danleyの前述のライブラリをチェックアウトし、dataに沿って渡すフィルタフックをトリガーして、手元のデータに固有のものを出力できるようにします。

私は知っている、これは非常識です。しかし、これがWordPressのバックボーンテンプレートでJavascriptをオーバーライドしているところです。私たちはあなたがコアに求めているように私たちがどのようにカスタマイズ可能性を焼くことができるかについて議論するべきですが、私たちは興味/運動量の欠如があるからではありません。 毎週のWordPressコア開発者チャット で、気軽に会話を始めてください。行きます。

7