Додайте спеціальні параметри до діалогового вікна wplink


16

Мені вдалося додати спеціальний параметр-select для зображень із

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

Тепер мені потрібно зробити майже те саме для посилань. Тож якщо я натискаю, Pages -> Add New -> Insert / Edit Linkя отримую це:

введіть тут опис зображення

Чи можу я додати ще одне поле для вибору параметрів для цих посилань? Як це зробити?

Відповіді:


18

Діалогове вікно HTML походить, WP_Editors::wp_link_dialog()але гаків немає.

Ми могли б замість цього використовувати jQuery, щоб додати користувальницький HTML до діалогового вікна посилань та спробувати замінити, наприклад wpLink.getAttrs(), тому що він дуже короткий ;-)

Демонстраційний приклад:

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

Я просто зробив швидкий тест і, здається, працює, але потребує подальшого тестування та коригування під час оновлення посилань. Ось старий хак, який я зробив, який може потребувати оновлення.

Оновлення

Схоже, ви хочете додати rel="nofollow"параметр до діалогового вікна посилань, тому давайте оновимо вищевказаний підхід для цього випадку:

Ми додаємо relатрибут посилання з:

/**
 * 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' : ''
    };
}

Якщо relатрибут порожній, він буде автоматично видалений із посилання в редакторі.

Тоді ми можемо підключитися до wplink-openподії, яка виникає, коли відкриється діалогове вікно зв’язку. Тут ми можемо вставити наш спеціальний HTML та оновити його відповідно до поточного вибору посилань:

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

});

де ми використовуємо наступну помічну функцію на основі getLink()основної функції, щоб отримати HTML обраного посилання:

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

Ось результат:

немає наступного варіанту

із таким HTML:

html

ps: Це можна додатково перевірити, а також може бути розширено на підтримку перекладів


Мені ця відповідь дуже сподобалась, бо це виглядало так просто. Однак ця проблема полягала не лише в оновленні посилань, а також у тому випадку, якщо у мене на одному сайті було декілька посилань, значення залишалося останнім, яке було обрано, навіть якщо з іншого посилання. Ще може бути корисним для когось, хоча!
карамба

Я оновив відповідь на прикладі відсутності посилань @caramba
birgire

Привіт @birgire, як отримати значення, hrefякщо користувач не відкриє діалогове вікно, а просто використає перше спливаюче вікно, яке містить заповнювач Paste URL or type to search:?
MinhTri

1
Я думаю, що я застосував mce_external_pluginsфільтр для завантаження файлу сценарію або after_wp_tiny_mceгака, щоб ввести фрагмент (з додатковою частиною у вигляді рядкового рядка), щоб перевірити це. getAttrsМетод тут тільки перевизначити значення з діалогового вікна Налаштування, а я не дивився в те, як перевизначити значення з вхідного інлайн. Можливо, замініть wp_link_applyкоманду, якщо можливо? Я думаю, це може бути гарним новим питанням ;-) @ Dan9
birgire

@birgire Дякую! Нарешті я знайшов, де його взяти. WordPress використовує tinymce.ui.Control.extend.setUrlу плагіні wp-includes/js/tinymce/plugins/wplink/plugin.js.
MinhTri

3

Дивлячись на серцевину, немає жодного сліду жодного фільтра чи дії у wp_link_dialogфункції, яка б полегшила ваше життя ...

Досліджуючи, як інші вирішили цю проблему, є плагін, який робить більш-менш те саме, як ви хочете. В основному він скасовує реєстрацію wplink.js wp_deregister_script('wplink');і знову реєструє змінену версію файлу, на цей раз, включаючи бажане додаткове поле.

Хоча я не думаю, що це найкращий метод (враховуючи можливі наступні конфлікти під час оновлення WordPress), я вважаю, що це найпростіший ват.

Сподіваюся, це допомагає!


Дякуємо за інформацію та посилання на плагін. Я також загляну в плагін і побачу, як вони його вирішили ...
caramba

Я вирішив це, переглянувши джерело плагіна, згаданого у цій відповіді, який можна знайти на github github.com/ffsantos92/rel-nofollow-checkbox, якщо комусь це потрібно. Мені довелося лише змінити 5 слів чи так ...
caramba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.