Ajout d'une entrée personnalisée pour l'attribut de données dans le média d'insertion modal

8

J'essaie d'ajouter une entrée de texte au modal "Insérer un média" dans l'espoir de pouvoir ajouter un data-attribut html5 à l'ancre parent des images.

<a class="fancybox" href="..." data-fancybox-group=" "> <- Cette partie
<img class="wp-image-871" src="..." alt="..." width="245" height="333" />
</a>

Jusqu'à présent, j'ai pu ajouter l'entrée au modal:

entrez la description de l'image ici

En utilisant le code ci-dessous dans mon fichier 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 );

Et j'ai ajouté data-fancybox-group=""l'ancre à l'aide de:

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);

C'est là que je suis coincé ... J'ai un endroit pour entrer les données et j'ai un endroit pour les données, mais je ne sais pas comment obtenir les données de l'entrée aux données -fancybox-group attribut.

apaul
la source

Réponses:

3

J'ai jeté un coup d'œil à la source, malheureusement je n'ai pas vu un bon moyen de transmettre l'information sans l'enregistrer. Ce qui craint - beaucoup de temps - parce que ce n'est vraiment rien qui doit être sauvé.

Une solution de contournement serait d'activer les sessions PHP en mettant ce qui suit au début de votre functions.php:

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

Vous pouvez maintenant utiliser des $_SESSIONvariables, comme ceci:

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

Créez votre champ de formulaire comme ceci:

    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
    );

Utilisez la variable de session comme ceci:

    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
    );

Modifiez la sortie en conséquence:

    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
    );

C'est à peu près ça. Cela devrait être assez explicite, sinon demandez simplement.

Nicolai
la source
3

Vous devriez pouvoir tirer le champ en utilisant 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);

De plus, vous devrez vous connecter au attachment_fields_to_savefiltre, si vous ne l'avez pas déjà fait, pour enregistrer le champ que vous avez ajouté.

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);

Vous devez également mettre à jour votre add_fancybox_inputfonction. Modifiez la valeur pour extraire le champ 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 );
rien à voir
la source
Cela semble fonctionner, le seul problème que je vois est que les données sont enregistrées sur différentes pages. Comme si j'ajoute un attribut de données à une image sur une page, il enregistre ces données, donc si j'utilise la même image sur une autre page, l'attribut de données devra être réinitialisé.
apaul
Existe-t-il un moyen d'obtenir l'entrée utilisateur sur l'attribut data sans l'enregistrer, ou au moins un moyen d'effacer les métadonnées une fois l'image insérée dans la page?
apaul
Je pense que delete_post_meta($id, 'fancyboxGroup');devrait supprimer l'attribut stocké, mais je ne sais pas comment le faire démarrer après image_send_to_editor.
apaul
+1 parce que c'est la façon la plus courante de le faire. Il y a certaines choses que je changerais, comme ne pas afficher le champ sur la page de pièce jointe, garder le champ de formulaire vide et ne pas faire de changements si c'est le cas - comme je l'ai fait dans ma réponse.
Nicolai
Une possibilité serait d'utiliser des transitoires avec une (courte) expiration. Au lieu d'enregistrer pour publier la méta. De cette façon, vous n'auriez pas à vous soucier de supprimer les données. @ apaul34208
Nicolai
0

Je ne sais pas si c'est la meilleure chose pour vous, mais je suppose que vous pourriez l'essayer.

Obtenez les données du champ de saisie et placez-les dans le formulaire sur une entrée cachée ou quelque chose et faites l'attribut de données lorsque la fenêtre de la sélection de média se fermera

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

Je sais que cela semble fou, mais cela pourrait être très simple pour vous et cela pourrait faire l'affaire.

Marius Talagiu
la source
Si c'est jQuery, je ne pense pas que c'est comme ça .data()qu'on doit l'utiliser api.jquery.com/jquery.data
apaul
Veuillez tester si vous n'êtes pas sûr. jQuery.data aura besoin de l'élément (sélecteur) mais puisque le sélecteur reçoit $ ('. fancybox'), vous avez alors leur paire clé / valeur, et oui c'est correct.
Marius Talagiu