Aggiungere contenuto iframe a un widget nella sidebar

4 giu 2011, 11:28:45
Visualizzazioni: 15.8K
Voti: 6

Sto cercando di aggiungere un widget pubblicitario di Amazon in un widget della sidebar di WordPress (installazione self-hosted, versione 3.1.3). Il codice del widget è sostanzialmente un iframe.

Ho provato a usare il widget "Testo" e incollare il codice iframe lì dentro, ma quando salvo il widget, il codice iframe scompare.

Mi sono già imbattuto in questo problema/limitazione in passato e l'ho risolto usando il plugin IFrame Widget, ma ora vorrei usare più di un iFrame nella mia sidebar, e il widget IFrame supporta solo un widget alla volta.

Mi sfugge qualcosa di ovvio? C'è qualche impostazione per permettere il codice iframe nei widget? Oppure normalmente è consentito e ho fatto qualcosa di stupido nella mia installazione? Se no, ci sono buone alternative?

0
Tutte le risposte alla domanda 2
3

Crea semplicemente un widget che non filtri il tuo input. Questo è probabilmente il widget più semplice con input utente che puoi costruire.

Ecco il widget che uso nel mio plugin Magic Widgets.

/**
 * Variante semplificata della classe widget di testo nativa.
 *
 * @author Fuxia Scholz
 * @version 1.0
 */
class Unfiltered_Text_Widget extends WP_Widget
{
    /**
     * @uses apply_filters( 'magic_widgets_name' )
     */
    public function __construct()
    {
        // Puoi modificare il nome tramite filtro.
        // Usa add_filter( 'magic_widgets_name', 'il_tuo_filtro_personalizzato', 10, 1 );
        $widgetname = apply_filters( 'magic_widgets_name', 'Testo non filtrato' );
        parent::__construct(
            'unfiltered_text'
        ,   $widgetname
        ,   array( 'description' => 'Puro Markup' )
        ,   array( 'width' => 300, 'height' => 150 )
        );
    }

    /**
     * Output.
     *
     * @param  array $args
     * @param  array $instance
     * @return void
     */
    public function widget( $args, $instance )
    {
        echo $instance['text'];
    }

    /**
     * Prepara il contenuto. No.
     *
     * @param  array $new_instance Nuovo contenuto
     * @param  array $old_instance Vecchio contenuto
     * @return array Nuovo contenuto
     */
    public function update( $new_instance, $old_instance )
    {
        return $new_instance;
    }

    /**
     * Form backend.
     *
     * @param array $instance
     * @return void
     */
    public function form( $instance )
    {
        $instance = wp_parse_args( (array) $instance, array( 'text' => '' ) );
        $text     = format_to_edit($instance['text']);
?>
        <textarea class="widefat" rows="7" cols="20" id="<?php
            echo $this->get_field_id( 'text' );
        ?>" name="<?php
            echo $this->get_field_name( 'text' );
        ?>"><?php
            echo $text;
        ?></textarea>
        <?php
        /* Per abilitare l'anteprima decommenta le seguenti righe.
         * Attenzione: HTML non valido potrebbe interrompere il resto del sito e
         * potrebbe disabilitare l'opzione per riparare il testo di input.

        ! empty ( $text )
            and print '<h3>Anteprima</h3><div style="border:3px solid #369;padding:10px">'
                . $instance['text'] . '</div>';
        /**/
        ?>
<?php
    }
}

Registri il widget con:

add_action( 'widgets_init', 'register_unfiltered_text_widget', 20 );

function register_unfiltered_text_widget()
{
    register_widget( 'Unfiltered_Text_Widget' );
}

Ora ottieni un nuovo widget in wp-admin/widgets.php:

widget nel backend

Ho inserito semplicemente due fantastici video di Youtube come iframe e un <hr> nel widget.
Output:

output del widget

4 giu 2011 13:32:38
Commenti

Grazie. Ottima risposta completa. (Ed è bello sapere che non mi stava sfuggendo qualcosa di più ovvio!)

Matt Gibson Matt Gibson
5 giu 2011 00:30:15

Non dovrebbe format_to_edit() avere true come secondo argomento per utilizzare esc_textarea()?

kaiser kaiser
2 set 2012 23:58:31

@kaiser No, in quel caso non sarebbe escapato.

fuxia fuxia
3 set 2012 02:53:13
2

Per aggiornare la risposta alla domanda, dalla versione di WP 4.8 che ho testato, il widget di testo regolare può ora visualizzare nativamente gli iframe semplicemente utilizzando il normale tag iframe:

<iframe src="https://iframesiteurl.com"></iframe>
23 lug 2017 08:24:05
Commenti

Infatti, alla fine si è scoperto che il problema era dovuto al fatto che il mio WordPress era un'installazione Multisite, e in Multisite, solo il Super Admin ha la capacità "unfiltered_html". All'epoca, questo non era chiaro dalla documentazione!

Matt Gibson Matt Gibson
23 lug 2017 12:14:29

Buono a sapersi anche questa informazione @MattGibson

Carl Alberto Carl Alberto
24 lug 2017 13:15:54