Làm cách nào để kết nối và sửa đổi UI sửa đổi mới (3.6+)?


8

Giả sử tôi muốn thêm một số post_meta vào giao diện người dùng "mới". Tôi chỉ lưu một số meta trên các phiên bản và muốn hiển thị nó trên màn hình này.

nhập mô tả hình ảnh ở đây

Thông thường, tôi sẽ mở ra wp-admin/revisions.phpđể tìm một số móc và mã đi. Nhưng trang sửa đổi là tất cả được thực hiện với Backbone . Tôi không biết Backbone (hoàn toàn sẵn sàng học hỏi). Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì về cách sửa đổi các lượt xem Backbone của quản trị viên hiện có trong WordPress.

Có ai đã sửa đổi thành công giao diện này và có thể cung cấp một ví dụ về cách nó có thể được thực hiện?


Một cuộc gọi ajax nối ​​thêm dữ liệu được trả về vào .diff-meta-to để thực hiện những gì bạn muốn. Sự kiện nào để xem là nơi tôi dường như đã va vào tường. Các sự kiện tùy chỉnh được xác định trong wp-admin / js / revutions.js Mẫu cho phần revision-meta nằm trong wp-admin / revision.php xung quanh dòng 163 (script id = "tmpl-
revutions

Câu trả lời:


8

Thật không may, không có thực hành tốt nhất được chuẩn hóa bởi WordPress để nối vào các mẫu Backbone. Đã có kế hoạch đề xuất đưa API bộ lọc và hành động quen thuộc vào Javascript trong WordPress, nhưng thiếu lực kéo trong phong trào này. Carl Danley đã tạo ra một thư viện thực hiện điều đó , rất hữu ích nếu bạn đang cố gắng xây dựng / jerry-giàn mã theo cách nhanh nhất để tất cả bạn làm những gì bạn đang cố gắng làm.

Về cơ bản, bạn đang cố gắng ghi đè những gì đang diễn ra trong revisions.view.Metamicrotemplate.

Không có cách nào đơn giản để ghi đè lên phần đánh dấu microtemplate. Những gì tôi muốn đề xuất là ghi đè .template()phương thức của bất kỳ nhà xây dựng nào mở rộng từ revisions.view.Meta, những người đang revisions.view.MetaFromrevisions.view.MetaTo. Để làm điều này, đây là một số mẫu soạn sẵn:

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

Và để giải thích điều đó. Chúng tôi đang nối vào chân trang của quản trị viên sửa đổi, vì vậy chúng tôi đảm bảo rằng các hàm tạo revisions.view.MetaFromrevisions.view.MetaTo đã được xác định , nhưng trước khi mô đun bootstrapper đã được kích hoạt . Điều này rất quan trọng, vì chúng tôi muốn sửa đổi các hàm tạo trước khi chúng được đưa vào sử dụng. Tôi đã sao chép nội dung của revisions.view.Metanguyên văn microtem khắc vào một phiên bản ghi đè của mẫu #tmpl-revisions-meta-override, nhưng lưu ý rằng tôi đã thêm Your custom text herevào mẫu trong đó có vẻ như bạn muốn văn bản tùy chỉnh của mình. Sau đó, tôi ghi đè cả template()phương thức của hàm tạo, sử dụng ID của microtemplate đã sửa đổi làm tham chiếu.

Voila. Bây giờ, nó phụ thuộc vào những gì bạn muốn làm với văn bản tùy chỉnh của bạn. Nếu bạn muốn đặt một số văn bản trong đó, đi cho nó. Nếu bạn muốn xuất văn bản cụ thể cho bản sửa đổi đó, bạn sẽ muốn kiểm tra thư viện đã nói ở trên của Carl Danley và kích hoạt móc lọc đi qua datađể bạn có thể xuất một cái gì đó cụ thể cho dữ liệu trong tay.

Tôi biết, điều này là điên rồ. Nhưng đây là nơi chúng ta đang ghi đè Javascript trong các mẫu xương sống của WordPress. Chúng ta nên có các cuộc thảo luận về cách chúng ta có thể nướng trong khả năng tùy biến như bạn yêu cầu cốt lõi, nhưng chúng ta không phải vì thiếu sự quan tâm / động lực. Hãy thoải mái châm ngòi cuộc trò chuyện tại các cuộc trò chuyện nhà phát triển cốt lõi WordPress hàng tuần của chúng tôi . Tôi sẽ ở đó.


điều đó thật tuyệt. Tôi đã làm cho nó hoạt động nhưng vấn đề duy nhất là khi tôi cố gắng viết ra một cái gì đó vào mẫu từ hook hành động, nó không bao giờ xuất hiện, có thể là do nó chạy trước khi chế độ xem được hiển thị. Nếu tôi dán nó setTimeoutvới độ trễ 100ms, nó sẽ hoạt động. Tôi không thể tìm thấy bất kỳ sự kiện revisions.jsnào khi mẫu kết thúc hiển thị, việc trì hoãn nó có phải là cách duy nhất không? (mã ở đây: gist.github.com/jjeaton/ed4d22245943c2eaa4fa )
jjeaton

Tôi đã sửa đổi câu trả lời: Bạn nên sử dụng hook bộ lọc, để bạn textcó thể xuất ra trong lệnh gọi applicationFilters và xuất nội tuyến trong mẫu. Bạn không muốn sử dụng jQuery.text () để sửa đổi microtemplate, hãy sử dụng khả năng thoát khỏi mẫu Underscore.js. (mã ở đây: gist.github.com/ericandrewlewis/3f3f39dc7ebdc4a56681 )
Eric Andrew Lewis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.