wp.​​media.view.ImageDetails-設定を画像のHTML5 data- *属性として保存する


19

最終的に達成したいのは、画像の詳細ボックスに追加された追加の設定であり、属性<img>として画像タグに保存されdata-*ます

例: <img src="..." data-my_setting="...">


私のコード

プラグインを作成していますが、画像を編集するときのために、さらに設定を作成する必要があります。これまでのところ、次のコードがあります。

jQuery(function($) {

    var imageDetails = wp.media.view.ImageDetails

    wp.media.view.ImageDetails = wp.media.view.ImageDetails.extend({
        // Initialize - Call function to add settings when rendered
        initialize: function() {
            this.on('post-render', this.add_settings);
        },
        // To add the Settings
        add_settings: function() {
            $('.advanced-section').prepend('\
                <h2>My Settings</h2>\
                <input type="text" class="my_setting">\
            ');

            // Set Options
            this.controller.image.set({"data-settings": 'setting-value-here'})
        }
    });

}) // End of jQuery(function($))

新しい投稿を作成して1つの画像を追加し、クリックして[編集](ポップアップしたツールバーの鉛筆アイコン)を押しました。画像の詳細ページに行きましたが、これは次のように見えました。

ここに画像の説明を入力してください

ここまでは順調ですね。この行で:

this.controller.image.set({"data-settings": 'setting-value-here'})

通常、jQueryを使用して入力の値を取得しますが、テストのために、それをの静的な値に変更しました'setting-value-here'。Image Detailsボックスの右下隅にある「Update」を押しました。


問題

テキストエディターでは、次のようにHTMLコードが表示されます。

ここに画像の説明を入力してください

これはいない持ってdata-settings="setting-value-here"、どのように来ますか?

行をこれに置き換えた場合:

 this.controller.image.set({alt: 'setting-value-here'})

それはありません変更のALTにタグをalt="setting-value-here"。それで、data- *属性を設定しようとして何が間違っていますか?


ソリューション

@bongerに感謝します(彼は50の評判の完全な賞金を得ました)、私は次のコードを持っています:

PHP:

function add_my_settings() {
    ob_start();
    wp_print_media_templates();
    $tpl = ob_get_clean();
    if ( ( $idx = strpos( $tpl, 'tmpl-image-details' ) ) !== false
            && ( $before_idx = strpos( $tpl, '<div class="advanced-section">', $idx ) ) !== false ) {
        ob_start();
        ?>
        <div class="my_setting-section">
            <h2><?php _e( 'My Settings' ); ?></h2>
            <div class="my_setting">
                <label class="setting my_setting">
                    <span><?php _e( 'My Setting' ); ?></span>
                        <input type="text" data-setting="my_setting" value="{{ data.model.my_setting }}" />
                    </label>
                </div>
            </div>
        <?php
        $my_section = ob_get_clean();
        $tpl = substr_replace( $tpl, $my_section, $before_idx, 0 );
    }
    echo $tpl;
};

// Hack the output of wp_print_media_templates()
add_action('wp_enqueue_media', $func =
    function() {
        remove_action('admin_footer', 'wp_print_media_templates');
        add_action('admin_footer',  'add_my_settings');
    }
);

JavaScript:(を使用してエンキューする必要がありますwp_enqueue_script()

// When Image is Edited
wp.media.events.on('editor:image-edit', function(data) {
    data.metadata.my_setting = data.editor.dom.getAttrib( data.image, 'data-my_setting' );
});

// When Image is Updated
wp.media.events.on('editor:image-update', function(data) {
    data.editor.dom.setAttrib( data.image, 'data-my_setting', data.metadata.my_setting );
});

3
+2-雄弁で、簡潔で、よく研究されていればいいので、話題が痛い。このような質問はまれな品種です。
TheDeadMedic

2
ありがとう!質問する前に、できる限り問題を調査(および広範囲にデバッグ)します。(本当に簡単な質問を見つけて、OPがグーグルを試してさえいなかったときは嫌いです)
カスパーリー

回答:


14

それを行うための方法は、(非常に便利)を使用することであるeditor:image-editeditor:image-updateTinyMCEのをによってトリガイベントwpeditimageを直接(DOMを設定し取得するためのプラグイン/ 更新でラップするwp_enqueue_mediaアクションを):

add_action( 'wp_enqueue_media', function () {
    add_action( 'admin_footer', function () {
        ?>
        <script type="text/javascript">
        jQuery(function ($) {
            if (wp && wp.media && wp.media.events) {
                wp.media.events.on( 'editor:image-edit', function (data) {
                    data.metadata.my_setting = data.editor.dom.getAttrib( data.image, 'data-my_setting' );
                } );
                wp.media.events.on( 'editor:image-update', function (data) {
                    data.editor.dom.setAttrib( data.image, 'data-my_setting', data.metadata.my_setting );
                } );
            }
        });
        </script>
        <?php
    }, 11 );
} );

設定フィールドを追加してデータを入力するにwp_print_media_templates()は、オーバーライドImageDetails.initialize()(アクションでラップするように更新)するのではなく、出力をハックする方が恐ろしいでしょうwp_enqueue_media

add_action( 'wp_enqueue_media', function () {
    remove_action( 'admin_footer', 'wp_print_media_templates' );
    add_action( 'admin_footer', $func = function () {
        ob_start();
        wp_print_media_templates();
        $tpl = ob_get_clean();
        // To future-proof a bit, search first for the template and then for the section.
        if ( ( $idx = strpos( $tpl, 'tmpl-image-details' ) ) !== false
                && ( $before_idx = strpos( $tpl, '<div class="advanced-section">', $idx ) ) !== false ) {
            ob_start();
            ?>
    <div class="my_setting-section">
        <h2><?php _e( 'My Settings' ); ?></h2>
        <div class="my_setting">
            <label class="setting my_setting">
                <span><?php _e( 'My Setting' ); ?></span>
                <input type="text" data-setting="my_setting" value="{{ data.model.my_setting }}" />
            </label>
        </div>
    </div>
            <?php
            $my_section = ob_get_clean();
            $tpl = substr_replace( $tpl, $my_section, $before_idx, 0 );
        }
        echo $tpl;
    } );
} );

2
どうもありがとうございます!これは非常に便利です(ただし、頭を動かすには数分かかります)。私は答えを受け入れ、それが終了する直前に賞金を授与します(誰かがより良い/より簡単な答えを考え出す)
カスパーリー

うーん、それは前に実行された場合に起こりwp_enqueue_media()ます。おそらく、よりよい道を使用することですwp_enqueue_mediaの終わりで焼成されたアクションwp_enqueue_media()ですべてのコードをラップすなわち、add_action( 'wp_enqueue_media', function () { /*the code*/ } );
bonger

いいえ、その逆!
ボンガー

私は...答えを更新します
bonger

1
これは、アンダースコアのテンプレートスタッフのWPのオーバーライドですunderscorejs.org/#template(参照wp.template「WP-含ま/ JS / WP-util.js」に)....私は思う
bonger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.