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()いますが、そこにはフックがありません。

代わりに、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、スニペットを挿入するフック(追加部分を1行の文字列として使用)を使用したと思います。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ワードかそこらを変更するだけでした
...-カランバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.