6

I'm trying to add an Amazon advertising widget in a WordPress sidebar widget (self-hosted WordPress, v3.1.3). The widget code is basically an iframe.

I've tried using the "Text" widget and pasting the iframe code in there, but when I save the widget, the iframe code disappears.

I've come across this problem/limitation before and solved it using the IFrame Widget, but I want to use more than one iFrame in my sidebar, and the IFrame widget only supports one widget at a time.

Am I missing something obvious? Is there a setting somewhere to allow iframe code in the widgets? Or is it normally allowed, and I've done something silly to my install? If not, any good workarounds?

2 Answers 2

8

Just create a widget that doesn’t filter your input. This is probably the most simple widget with user input you can build.

Here is the widget I use in my 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
    }
}

You register the widget with:

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

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

Now you get a new widget in wp-admin/widgets.php:

widgets in backend

I put just two cool Youtube videos as iframes and a <hr> into the widget.
Output:

widget output

3
  • Thank you. Great, complete answer. (And it's nice to know I wasn't missing something more obvious!) Jun 4, 2011 at 21:30
  • Shouldn't format_to_edit() have true as 2nd arg to make use of esc_textarea()?
    – kaiser
    Sep 2, 2012 at 20:58
  • @kaiser No, it would not be escaped then.
    – fuxia
    Sep 2, 2012 at 23:53
1

To update the answer in question, as of WP 4.8 site that I have tested, the regular text widget can now natively display iframes by simply using the regular iframe tag:

<iframe src="https://iframesiteurl.com"></iframe>
2
  • In fact, it turned out in the end that this was because my WordPress was a Multisite install, and in Multisite, only the Super Admin has "unfiltered_html" capability. At the time, this wasn't clear from the documentation! Jul 23, 2017 at 9:14
  • Nice to know that information too @MattGibson Jul 24, 2017 at 10:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.