Wie kann ich die neue Revisions-Benutzeroberfläche (3.6+) einbinden und ändern?

8

Angenommen, ich möchte der "neuen" Revisions-Benutzeroberfläche post_meta hinzufügen. Ich speichere einige Meta nur für Revisionen und möchte sie auf diesem Bildschirm anzeigen.

Geben Sie hier die Bildbeschreibung ein

Normalerweise würde wp-admin/revisions.phpich nach ein paar Hooks suchen und Code weg. Die Überarbeitungsseite ist jedoch vollständig mit Backbone erstellt . Ich kenne Backbone nicht (total lernbereit). Ich kann jedoch nichts darüber finden, wie vorhandene Admin-Backbone-Ansichten in WordPress geändert werden können.

Hat jemand diese Schnittstelle erfolgreich geändert und kann ein Beispiel dafür geben, wie es gemacht werden kann?

jjeaton
quelle
Ein Ajax-Aufruf, der die zurückgegebenen Daten an .diff-meta-to anfügt, sollte das erreichen, was Sie wollen. Bei welchem ​​Ereignis bin ich anscheinend gegen eine Wand gestoßen? Benutzerdefinierte Ereignisse werden in wp-admin / js / revisions.js definiert. Die Vorlage für den Abschnitt revision-meta befindet sich in wp-admin / revision.php um Zeile 163 (Skript-ID = "tmpl-revisions-meta")
nvwd

Antworten:

8

Leider gibt es keine standardisierte Best Practice von WordPress zum Einbinden in Backbone-Vorlagen. Es wurden Pläne vorgeschlagen , die bekannte Filter- und Aktions-API in WordPress auf Javascript zu bringen, aber es gibt einen Mangel an Traktion in dieser Bewegung. Carl Danley hat eine Bibliothek erstellt, die genau das tut. Dies ist hilfreich, wenn Sie versuchen, Code auf die kleinste Art und Weise zu erstellen, damit alle das tun, was Sie tun möchten.

Grundsätzlich versuchen Sie zu überschreiben, was in revisions.view.Metader Mikrotemplate vor sich geht.

Es gibt keine einfache Möglichkeit, das Mikrotemplate-Markup selbst zu überschreiben. Was ich vorschlagen würde, ist das Überschreiben der .template()Methode eines Konstruktors, der sich von revisions.view.Meta, dem Sein revisions.view.MetaFromund revisions.view.MetaTo. Um dies zu tun, hier ein paar Boilerplate:

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
} );

Und um das zu erklären. Wir schließen uns der Fußzeile der Revisionsadministrationsseite an, sodass wir sicher sind, dass die Konstruktoren revisions.view.MetaFromund revisions.view.MetaTo definiert wurden , jedoch bevor der Bootstrapper des Revisionsmoduls ausgelöst wurde . Dies ist wichtig, da wir die Konstruktoren ändern möchten, bevor sie verwendet werden. Ich habe den Inhalt der revisions.view.MetaMikrotemplate wörtlich in eine überschriebene Version der Vorlage kopiert #tmpl-revisions-meta-override, aber ich habe Your custom text herein der Vorlage hinzugefügt, dass es so aussieht, als ob Sie Ihren benutzerdefinierten Text möchten. Dann überschreibe ich die template()Methode beider Konstruktoren und verwende die ID der modifizierten Mikrotemplate als Referenz.

Voila. Nun kommt es darauf an, was Sie mit Ihrem benutzerdefinierten Text tun möchten. Wenn Sie dort Text einfügen möchten, versuchen Sie es. Wenn Sie für diese Revision spezifischen Text ausgeben möchten, sollten Sie die oben genannte Bibliothek von Carl Danley überprüfen und einen Filter-Hook auslösen data, damit Sie etwas Spezifisches für die vorliegenden Daten ausgeben können.

Ich weiß, das ist verrückt. Aber hier sind wir mit dem Überschreiben von Javascript in WordPress Backbone-Vorlagen. Wir sollten darüber diskutieren, wie wir die Anpassbarkeit, wie Sie sie wünschen, in den Kern einbinden können, aber wir sind nicht, weil es an Interesse / Dynamik mangelt. Fühlen Sie sich frei, bei unseren wöchentlichen WordPress-Kernentwickler-Chats Gespräche zu führen . Ich werde da sein.

Eric Andrew Lewis
quelle
das ist toll. Ich habe es zum Laufen gebracht, aber das einzige Problem ist, dass wenn ich versuche, etwas aus dem Aktions-Hook in die Vorlage zu schreiben, es nie angezeigt wird, wahrscheinlich weil es ausgeführt wird, bevor die Ansicht gerendert wird. Wenn ich es setTimeoutmit einer Verzögerung von 100 ms einstecke, funktioniert es. Ich konnte keine Ereignisse finden, revisions.jswenn die Vorlage fertig gerendert wurde. Ist eine Verzögerung wahrscheinlich der einzige Weg? (Code hier: gist.github.com/jjeaton/ed4d22245943c2eaa4fa )
jjeaton
Ich habe die Antwort geändert: Sie sollten einen Filter-Hook verwenden, damit Sie textinnerhalb des ApplyFilters-Aufrufs ausgegeben und inline in der Vorlage ausgegeben werden können. Sie möchten keine jQuery.text () verwenden, um eine Mikrotemplate zu ändern. Verwenden Sie die Möglichkeit, dass die Vorlage Underscore.js maskiert wird. (Code hier: gist.github.com/ericandrewlewis/3f3f39dc7ebdc4a56681 )
Eric Andrew Lewis