Добавить пользовательские параметры в диалог wplink

16

Мне удалось добавить пользовательский вариант выбора для изображений с

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я получу это:

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

Могу ли я добавить другое поле выбора опции для этих ссылок? Как это сделать?

Caramba
источник

Ответы:

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: это может быть проверено в дальнейшем, а также может быть расширен для поддержки переводов

birgire
источник
Мне очень понравился этот ответ, потому что он выглядел так просто. Проблема, однако, заключалась не только в обновлении ссылок, также, если у меня было несколько ссылок на одном сайте, значение оставалось последним, которое было выбрано, даже если по другой ссылке. Может все еще быть полезным для кого-то, хотя!
Карамба
Я обновил ответ с помощью примера без перехода по ссылке @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), я думаю, что его проще всего получить.

Надеюсь, это поможет!

Capiedge
источник
Спасибо за информацию и ссылку на плагин. Я также посмотрю на плагин и посмотрю, как они его решили ...
caramba
Я решил это, посмотрев на источник плагина, упомянутого в этом ответе, который можно найти на github github.com/ffsantos92/rel-nofollow-checkbox, если кому-то это нужно. Я только должен был изменить 5 слов или около того ...
Карамба