挿入メディアモーダルでのデータ属性のカスタム入力の追加


8

data-画像の親アンカーにhtml5 属性を追加できることを期待して、「メディアの挿入」モーダルにテキスト入力を追加しようとしています。

<a class="fancybox" href="..." data-fancybox-group=" "> <-この部分
<img class="wp-image-871" src="..." alt="..." width="245" height="333" />
</a>

これまでのところ、モーダルに入力を追加することができました。

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

functions.phpファイルで以下のコードを使用します。

function add_fancybox_input( $form_fields, $post ) {
$form_fields['fancyboxGroup'] = array(
'label' => 'fancybox group',
'input' => 'text',
'value' => 'testing',
'helps' => 'use this to group images in fancybox',
);
return $form_fields;
}

add_filter( 'attachment_fields_to_edit', 'add_fancybox_input', 10, 2 );

そして私はdata-fancybox-group=""を使用してアンカーに追加しました:

function give_linked_images_class($html, $id, $caption, $title, $align, $url, $size, $alt = '' ){
  $classes = 'fancybox'; // separated by spaces, e.g. 'img image-link'

  // check if there are already classes assigned to the anchor
  if ( preg_match('/<a.*? class=".*?">/', $html) ) {
    $html = preg_replace('/(<a.*? class=".*?)(".*?>)/', '$1 ' . $classes . '$2', $html);
  } else {
    $html = preg_replace('/(<a.*?)>/', '$1 class="' . $classes . '" data-fancybox-group="" >', $html);
  }
  return $html;
}
add_filter('image_send_to_editor','give_linked_images_class',10,8);

これは私が行き詰まっているところです...データを入力する場所があり、データを移動する場所がありますが、入力からデータにデータを取得する方法がわかりません-fancybox-group属性。

回答:


3

私はソースを調べましたが、残念ながら、保存せずに情報を渡すための良い方法は見ていません。これは最悪です-これは本当に保存する必要のあるものではないからです。

回避策としては、の先頭に次のように記述して、PHPセッションを有効にしますfunctions.php

    if (!session_id()) {
        session_start();
    }

これで$_SESSION、次のように変数を使用できます。

    $_SESSION[ 'your-key' ] = 'your-value';

次のようにフォームフィールドを作成します。

    function wpse_154330_attachment_fields_to_edit( $form_fields, $post ) {
        $current_screen = get_current_screen();
        // we are not saving, so no need to show the field on the attachment page
        if ( $current_screen->id == 'attachment' ) {
            return $form_fields;
        }
        $form_fields['fancyboxGroup'] = array(
            'label' => 'fancybox group',
            'input' => 'text',
            'value' => '', // leave the value empty
            'helps' => 'use this to group images in fancybox',
        );
        return $form_fields;
    }
    add_filter(
        'attachment_fields_to_edit',
        'wpse_154330_attachment_fields_to_edit',
        10,
        2
    );

次のようにセッション変数を使用します。

    function wpse154330_save_attachment_field( $post, $attachment ) {
        // we're only setting up the variable, not changing anything else
        if ( isset( $attachment[ 'fancyboxGroup' ] ) {
            $_SESSION[ 'fancyboxGroup' ] = $attachment[ 'fancyboxGroup' ];
        }
        return $post;
    }
    add_filter(
        'attachment_fields_to_save',
        'wpse154330_save_attachment_field',
        10,
        2
    );

それに応じて出力を変更します。

    function wpse154330_image_send_to_editor(
        $html,
        $id,
        $caption,
        $title,
        $align,
        $url,
        $size,
        $alt = ''
    ) {
        // no need to modify the output, if no fancybox group is given
        if (
            empty( $_SESSION[ 'fancyboxGroup' ] )
            || ! isset( $_SESSION[ 'fancyboxGroup' ] )
        ) {
            return $html;
        }
        $classes = 'fancybox';
        if ( preg_match( '/<a.*? class=".*?">/', $html ) ) {
            $html = preg_replace(
                '/(<a.*? class=".*?)(".*?>)/',
                '$1 ' . $classes . '$2',
                $html
            );
        } else {
            $html = preg_replace(
                '/(<a.*?)>/',
                '$1 class="'
                    . $classes
                    . '" data-fancybox-group="'
                    . $_SESSION[ 'fancyboxGroup' ]
                    . '" >',
                $html
            );
        }
        unset( $_SESSION[ 'fancyboxGroup' ] );
        return $html;
    }
    add_filter(
        'image_send_to_editor',
        'wpse154330_image_send_to_editor',
        10,
        8
    );

それについてです。自明のはずですが、それ以外の場合は質問してください。


3

を使用してフィールドをプルできるはずget_post_metaです。

function give_linked_images_class($html, $id, $caption, $title, $align, $url, $size, $alt = '' ){
  $classes = 'fancybox'; // separated by spaces, e.g. 'img image-link'

  // check if there are already classes assigned to the anchor
  if ( preg_match('/<a.*? class=".*?">/', $html) ) {
    $html = preg_replace('/(<a.*? class=".*?)(".*?>)/', '$1 ' . $classes . '$2', $html);
  } else {
    $html = preg_replace('/(<a.*?)>/', '$1 class="' . $classes . '" data-fancybox-group="'.get_post_meta($id, 'fancyboxGroup', true).'" >', $html);
  }
  return $html;
}
add_filter('image_send_to_editor','give_linked_images_class',10,8);

また、attachment_fields_to_saveまだ追加していない場合は、フィルターにフックして、追加したフィールドを保存する必要があります。

function wpse154330_save_attachment_field($post, $attachment) {
    if( isset($attachment['fancyboxGroup']) ){
            update_post_meta($post['ID'], 'fancyboxGroup', $attachment['fancyboxGroup']);
        }

    return $post;
}

add_filter( 'attachment_fields_to_save','wpse154330_save_attachment_field', 10, 2);

add_fancybox_input関数も更新する必要があります。値を変更して、fancyboxフィールドをプルします。

function add_fancybox_input( $form_fields, $post ) {
$form_fields['fancyboxGroup'] = array(
'label' => 'fancybox group',
'input' => 'text',
'value' => get_post_meta($post->ID, 'fancyboxGroup', true),
'helps' => 'use this to group images in fancybox',
);
return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'add_fancybox_input', 10, 2 );

これは機能しているように見えますが、私が目にする唯一の問題は、データが異なるページにわたって保存されることです。あるページの画像にdata-属性を追加する場合と同様に、そのデータが保存されるため、別のページで同じ画像を使用する場合は、data-属性をリセットする必要があります。
2014

保存せずにdata-属性へのユーザー入力を取得する方法、または少なくとも画像がページに挿入された後にメタデータを消去する方法はありますか?
2014

delete_post_meta($id, 'fancyboxGroup');保存された属性を削除する必要があると思いますが、後でそれを起動する方法がわかりませんimage_send_to_editor
2014

+1は、これが一般的な方法だからです。添付ページにフィールドを表示しない、フォームフィールドを空のままにする、変更されない場合は変更するなど、いくつか変更したいことがあります。
Nicolai

1つの可能性は、(短い)有効期限のあるトランジェントを利用することです。保存してメタを投稿する代わりに。これにより、データの削除について心配する必要がなくなります。@ apaul34208
Nicolai

0

これがあなたにとって最良のことかどうかはわかりませんが、試してみることはできると思います。

入力フィールドからデータを取得し、非表示の入力などのフォームに配置し、メディア選択のウィンドウが閉じるときにデータ属性を実行します

$inputValue = $('.some_class').val();
$('.fancybox').data('fancybox-group', $inputValue);

奇妙に聞こえるかもしれませんが、それはあなたにとって非常に簡単なことで、うまくいくかもしれません。


それがjQueryの場合、私はそれがどのように考えていない.data()使用されることを意味しているapi.jquery.com/jquery.data
apaul

不明な場合はテストしてください。jQuery.dataには要素(セレクター)が必要ですが、セレクターには$( '。fancybox')が指定されているため、キーと値のペアがあり、そうです。
Marius Talagiu 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.