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하면 다음을 얻습니다.

여기에 이미지 설명을 입력하십시오

해당 링크에 다른 옵션 선택 필드를 추가 할 수 있습니까? 그렇게하는 방법?

답변:


18

대화 상자 HTML은 WP_Editors::wp_link_dialog()거기 에서 온 것이지만 후크는 없습니다.

우리는 대신에 링크 대화 상자에 사용자 정의 HTML을 추가 할 jQuery를 사용하여 예를 오버라이드 (override)을 시도 할 수 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

추신 : 이것은 더 테스트 할 수 있으며 번역을 지원하기 위해 확장 될 수도 있습니다


나는이 대답이 너무 쉬워서 너무 좋아서 좋아했습니다. 문제는 링크를 업데이트하는 것이 아니라 동일한 사이트에 여러 개의 링크가있는 경우 다른 링크에서라도 선택한 값이 마지막으로 유지 된 것입니다. 그래도 누군가에게 유용 할 수 있습니다!
람바

나는 팔로우 없음 링크 예제 @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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.