web-dev-qa-db-fra.com

Ajout de contenu iframe au widget Barre latérale

J'essaie d'ajouter un widget publicitaire Amazon dans un widget de barre latérale WordPress (WordPress auto-hébergé, v3.1.3). Le code du widget est fondamentalement un iframe.

J'ai essayé d'utiliser le widget "Texte" et d'y coller le code iframe, mais lorsque j'enregistre le widget, le code iframe disparaît.

J'ai rencontré ce problème/limitation auparavant et je l'ai résolu à l'aide du IFrame Widget , mais je souhaite utiliser plusieurs iFrame dans la barre latérale, et le widget IFrame ne prend en charge qu'un seul widget à la fois.

Est-ce que je manque quelque chose d'évident? Existe-t-il un paramètre permettant d'autoriser le code iframe dans les widgets? Ou est-ce normalement autorisé, et j'ai fait une bêtise à mon installation? Si non, de bonnes solutions de contournement?

6
Matt Gibson

Créez simplement un widget qui ne filtre pas votre entrée. C’est probablement le widget le plus simple avec la saisie de l’utilisateur que vous pouvez créer.

Voici le widget que j'utilise dans mon plugin Magic Widgets .

/**
 * Simplified variant of the native text widget class.
 *
 * @author Fuxia Scholz
 * @version 1.0
 */
class Unfiltered_Text_Widget extends WP_Widget
{
    /**
     * @uses apply_filters( 'magic_widgets_name' )
     */
    public function __construct()
    {
        // You may change the name per filter.
        // Use add_filter( 'magic_widgets_name', 'your custom_filter', 10, 1 );
        $widgetname = apply_filters( 'magic_widgets_name', 'Unfiltered Text' );
        parent::__construct(
            'unfiltered_text'
        ,   $widgetname
        ,   array( 'description' => 'Pure Markup' )
        ,   array( 'width' => 300, 'height' => 150 )
        );
    }

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

    /**
     * Prepares the content. Not.
     *
     * @param  array $new_instance New content
     * @param  array $old_instance Old content
     * @return array New content
     */
    public function update( $new_instance, $old_instance )
    {
        return $new_instance;
    }

    /**
     * Backend form.
     *
     * @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
        /* To enable the preview uncomment the following lines.
         * Be aware: Invalid HTML may break the rest of the site and it
         * may disable the option to repair the input text.

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

Vous enregistrez le widget avec:

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

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

Maintenant, vous obtenez un nouveau widget dans wp-admin/widgets.php:

widgets in backend

Je mets seulement deux vidéos Youtube comme iframes et un <hr> dans le widget.
Sortie:

widget output

8
fuxia

Pour mettre à jour la réponse en question, à partir du WP 4.8 que j'ai testé, le widget texte normal peut désormais afficher en natif des iframes en utilisant simplement la balise iframe régulière:

<iframe src="https://iframesiteurl.com"></iframe>
1
Carl Alberto