Aggiunta di input personalizzato per l'attributo di dati in insert media modale


8

Sto provando ad aggiungere un input di testo al modale "Inserisci media" nella speranza di poter aggiungere un data-attributo html5 all'ancoraggio principale delle immagini.

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

Finora sono stato in grado di aggiungere l'input al modale:

inserisci qui la descrizione dell'immagine

Usando il codice qui sotto nel mio file 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 );

E ho aggiunto data-fancybox-group=""l'ancora usando:

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

Questo è dove sono bloccato ... Ho un posto dove inserire i dati e ho un posto dove andare i dati, ma non sono sicuro di come ottenere i dati dall'input ai dati attributo -fancybox-group.

Risposte:


3

Ho dato un'occhiata alla fonte, sfortunatamente non ho visto un bel modo per passare le informazioni senza salvarle. Il che fa schifo - alla grande - perché in realtà non è tutto ciò che deve essere salvato.

Una soluzione alternativa sarebbe quella di abilitare le sessioni PHP mettendo quanto segue all'inizio del tuo functions.php:

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

Ora puoi usare le $_SESSIONvariabili, in questo modo:

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

Crea il tuo campo modulo in questo modo:

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

Utilizzare la variabile di sessione in questo modo:

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

Modificare l'output di conseguenza:

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

Questo è tutto. Dovrebbe essere praticamente autoesplicativo, altrimenti basta chiedere.


3

Dovresti essere in grado di tirare il campo usando 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);

Inoltre, dovrai agganciarti al attachment_fields_to_savefiltro, se non l'hai già fatto, per salvare il campo che hai aggiunto.

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

Dovresti anche aggiornare la tua add_fancybox_inputfunzione. Modifica il valore per estrarre il campo 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 );

Questo sembra funzionare, l'unico problema che vedo è che i dati vengono salvati su diverse pagine. Come nel caso in cui aggiungo un attributo di dati a un'immagine in una pagina, questi vengono salvati, quindi se uso la stessa immagine in un'altra pagina, l'attributo di dati dovrà essere ripristinato.
— aprile

C'è un modo per ottenere l'input dell'utente all'attributo data senza salvarlo, o almeno un modo per cancellare i metadati dopo che l'immagine è stata inserita nella pagina?
— aprile

Sto pensando che delete_post_meta($id, 'fancyboxGroup');dovrebbe eliminare l'attributo memorizzato, ma non sono sicuro di come farlo scattare dopo image_send_to_editor.
— circa

+1 perché questo è il modo comune per farlo. Ci sono alcune cose che cambierei, come non mostrare il campo nella pagina dell'allegato, tenere vuoto il campo modulo e non apportare alcuna modifica se lo è, come ho fatto nella mia risposta.
— Nicolai,

Una possibilità sarebbe quella di utilizzare i transitori con (breve) scadenza. Invece di salvare per pubblicare meta. In questo modo non ci si dovrebbe preoccupare di cancellare i dati. @ apaul34208
— Nicolai,

0

Non sono sicuro che questa sia la cosa migliore per te, ma credo che potresti provarlo.

Ottieni i dati dal campo di input e inseriscili nel modulo su un input nascosto o qualcosa del genere e esegui l'attributo data quando la finestra di Media Selection si chiuderà

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

So che sembra folle, ma potrebbe essere molto semplice per te e potrebbe fare il trucco.


Se questo è jQuery, non penso che sia come .data()debba essere usato api.jquery.com/jquery.data
— apaul

Si prega di verificare se non si è sicuri. jQuery.data avrà bisogno dell'elemento (selettore) ma poiché al selettore viene assegnato $ ('. fancybox'), allora hai la loro coppia chiave / valore e sì, è corretto.
— Marius Talagiu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.