Thêm tùy chọn tùy chỉnh vào hộp thoại wplink


16

Tôi quản lý để thêm tùy chọn tùy chọn cho hình ảnh với

function attachment_field_credit( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'first_image', true );
    $isSelected1 = $field_value == '1' ? 'selected ' : '';
    $isSelected2 = $field_value != '1' ? 'selected ' : '';
    $form_fields['first_image'] = array(
        'label' => __( 'Use as first image' ),
        'input' => 'html',
        'html' => "<select name='attachments[{$post->ID}][first_image]' id='attachments[{$post->ID}][first_image]'>
                    <option ".$isSelected1." value='1'>Yes</option>
                    <option ".$isSelected2."  value='2'>No</option>
                   </select>"
    );
    return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'attachment_field_credit', 10, 2 );

Bây giờ tôi cần phải làm gần như tương tự cho các liên kết. Vì vậy, nếu tôi nhấp vào Pages -> Add New -> Insert / Edit Linktôi nhận được điều này:

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

Tôi có thể thêm trường chọn tùy chọn khác cho các liên kết đó không? Làm thế nào để làm điều đó?

Câu trả lời:


18

HTML hộp thoại đến từ WP_Editors::wp_link_dialog()nhưng không có móc trong đó.

Thay vào đó, chúng ta có thể sử dụng jQuery để nối HTML tùy chỉnh vào hộp thoại liên kết và cố gắng ghi đè, ví dụ: wpLink.getAttrs()vì nó rất ngắn ;-)

Ví dụ demo:

jQuery( document ).ready( function( $ ) {
    $('#link-options').append( 
        '<div> 
            <label><span>Link Class</span>
            <select name="wpse-link-class" id="wpse_link_class">
                <option value="normal">normal</option>
                <option value="lightbox">lightbox</option>
           </select>
           </label>
       </div>' );

    wpLink.getAttrs = function() {
        wpLink.correctURL();        
        return {
            class:      $( '#wpse_link_class' ).val(),
            href:       $.trim( $( '#wp-link-url' ).val() ),
            target:     $( '#wp-link-target' ).prop( 'checked' ) ? '_blank' : ''
        };
    }
});

Tôi vừa làm một thử nghiệm nhanh và nó có vẻ hoạt động nhưng cần thử nghiệm và điều chỉnh thêm khi cập nhật liên kết. Đây là một bản hack cũ mà tôi đã làm có thể cần làm mới.

Cập nhật

Có vẻ như bạn muốn thêm rel="nofollow"tùy chọn vào hộp thoại liên kết, vì vậy hãy cập nhật phương pháp trên cho trường hợp đó:

Chúng tôi thêm relthuộc tính liên kết với:

/**
 * Modify link attributes
 */
wpLink.getAttrs = function() {
    wpLink.correctURL();        
    return {
        rel:        $( '#wpse-rel-no-follow' ).prop( 'checked' ) ? 'nofollow' : '',
        href:       $.trim( $( '#wp-link-url' ).val() ),
        target:     $( '#wp-link-target' ).prop( 'checked' ) ? '_blank' : ''
    };
}

Nếu relthuộc tính trống, thì nó sẽ tự động bị xóa khỏi liên kết trong trình chỉnh sửa.

Sau đó, chúng ta có thể nối vào wplink-opensự kiện kích hoạt khi hộp thoại liên kết được mở. Tại đây, chúng tôi có thể đưa HTML tùy chỉnh của mình và cập nhật nó theo lựa chọn liên kết hiện tại:

$(document).on( 'wplink-open', function( wrap ) {

    // Custom HTML added to the link dialog
    if( $('#wpse-rel-no-follow').length < 1 )
        $('#link-options').append( '<div> <label><span></span> <input type="checkbox" id="wpse-rel-no-follow"/> No Follow Link</label></div>');

    // Get the current link selection:
    var _node = wpse_getLink();

    if( _node ) {
        // Fetch the rel attribute
        var _rel = $( _node ).attr( 'rel' );

        // Update the checkbox
        $('#wpse-rel-no-follow').prop( 'checked', 'nofollow' === _rel );
    }

});

nơi chúng tôi sử dụng chức năng trợ giúp sau, dựa trên getLink()chức năng cốt lõi, để lấy HTML của liên kết đã chọn:

function wpse_getLink() {
    var _ed = window.tinymce.get( window.wpActiveEditor );
    if ( _ed && ! _ed.isHidden() ) {
        return _ed.dom.getParent( _ed.selection.getNode(), 'a[href]' );
    } 
    return null;
}

Đây là đầu ra:

không có tùy chọn theo

với HTML sau:

html

ps: Điều này có thể được kiểm tra thêm và cũng có thể được mở rộng để hỗ trợ dịch


Tôi thích câu trả lời này rất nhiều vì nó trông rất dễ dàng. Vấn đề mặc dù không chỉ là việc cập nhật các liên kết, mà nếu tôi có nhiều liên kết trên cùng một trang thì giá trị vẫn là liên kết cuối cùng được chọn ngay cả khi từ một liên kết khác. Vẫn có thể hữu ích cho ai đó!
caramba

Tôi đã cập nhật câu trả lời với một ví dụ không theo liên kết @caramba
birgire

Xin chào @birgire, làm thế nào để lấy lại giá trị hrefnếu người dùng không mở hộp thoại mà chỉ sử dụng hộp bật lên đầu tiên có trình giữ chỗ : Paste URL or type to search?
MinhTri

1
Tôi nghĩ rằng tôi đã sử dụng mce_external_pluginsbộ lọc để tải tệp tập lệnh hoặc after_wp_tiny_mcehook để chèn đoạn mã (với phần nối thêm dưới dạng một chuỗi dòng), để kiểm tra điều này. Các getAttrsphương pháp ở đây sẽ chỉ ghi đè giá trị từ hộp thoại các thiết lập liên kết, tôi đã không nhìn vào cách ghi đè giá trị từ đầu vào inline. Có thể ghi đè wp_link_applylệnh nếu có thể? Tôi nghĩ rằng đây có thể là một câu hỏi mới hay ;-) @ Dan9
birgire 27/8/2016

@birgire Cảm ơn bạn! Cuối cùng, tôi đã tìm thấy nơi để có được nó. WordPress sử dụng tinymce.ui.Control.extend.setUrltrong plugin wp-includes/js/tinymce/plugins/wplink/plugin.js.
MinhTri

3

Nhìn vào lõi, không có dấu vết của bất kỳ bộ lọc hoặc hành động nào trong wp_link_dialogchức năng, điều này sẽ giúp cuộc sống của bạn dễ dàng hơn ...

Điều tra cách những người khác đã giải quyết vấn đề này, có một plugin thực hiện ít nhiều giống như bạn muốn. Về cơ bản, nó hủy đăng ký wplink.js wp_deregister_script('wplink');và đăng ký lại một phiên bản sửa đổi của tệp, lần này bao gồm cả trường bổ sung mong muốn.

Mặc dù tôi không nghĩ rằng đây là phương pháp tốt nhất (có tính đến các xung đột có thể xảy ra sau đó trong khi cập nhật WordPress), tôi nghĩ rằng đó là cách dễ nhất để có được nó.

Hy vọng nó giúp!


Cảm ơn bạn đã thông tin và liên kết plugin. Tôi cũng sẽ xem xét plugin và xem họ đã giải quyết nó như thế nào ...
caramba

Tôi đã giải quyết nó bằng cách xem nguồn của plugin được đề cập trong câu trả lời này có thể tìm thấy trên github github.com/ffsantos92/rel-nofollow-checkbox nếu có ai cần nó. Tôi chỉ phải thay đổi 5 từ hoặc hơn ...
caramba
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.