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.