WordPress.org

Make WordPress Core


Ignore:
Timestamp:
07/14/17 07:40:23 (5 months ago)
Author:
westonruter
Message:

Widgets: Add Custom HTML widget.

Ports [40893], [40926], [41000] to the 4.8 branch.
Props westonruter, timmydcrawford, obenland.
Fixes #40907 for 4.8.

Location:
branches/4.8
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/4.8

  • branches/4.8/src/wp-includes/default-widgets.php

    r40640 r41044  
    6161/** WP_Nav_Menu_Widget class */ 
    6262require_once( ABSPATH . WPINC . '/widgets/class-wp-nav-menu-widget.php' ); 
     63 
     64/** 
     65 * Core class used to implement a Custom HTML widget. 
     66 * 
     67 * Note that this class is only located in this file in the 4.8 branch 
     68 * for the sake of automatic updates. In 4.9 and above, it is located at 
     69 * `wp-includes/widgets/class-wp-widget-custom-html.php`. 
     70 * 
     71 * @since 4.8.1 
     72 * 
     73 * @see WP_Widget 
     74 */ 
     75class WP_Widget_Custom_HTML extends WP_Widget { 
     76 
     77    /** 
     78     * Default instance. 
     79     * 
     80     * @since 4.8.1 
     81     * @var array 
     82     */ 
     83    protected $default_instance = array( 
     84        'title' => '', 
     85        'content' => '', 
     86    ); 
     87 
     88    /** 
     89     * Sets up a new Custom HTML widget instance. 
     90     * 
     91     * @since 4.8.1 
     92     */ 
     93    public function __construct() { 
     94        $widget_ops = array( 
     95            'classname' => 'widget_custom_html', 
     96            'description' => __( 'Arbitrary HTML code.' ), 
     97            'customize_selective_refresh' => true, 
     98        ); 
     99        $control_ops = array( 
     100            'width' => 400, 
     101            'height' => 350, 
     102        ); 
     103        parent::__construct( 'custom_html', __( 'Custom HTML' ), $widget_ops, $control_ops ); 
     104    } 
     105 
     106    /** 
     107     * Outputs the content for the current Custom HTML widget instance. 
     108     * 
     109     * @since 4.8.1 
     110     * 
     111     * @param array $args     Display arguments including 'before_title', 'after_title', 
     112     *                        'before_widget', and 'after_widget'. 
     113     * @param array $instance Settings for the current Custom HTML widget instance. 
     114     */ 
     115    public function widget( $args, $instance ) { 
     116 
     117        $instance = array_merge( $this->default_instance, $instance ); 
     118 
     119        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ 
     120        $title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ); 
     121 
     122        $content = $instance['content']; 
     123 
     124        /** 
     125         * Filters the content of the Custom HTML widget. 
     126         * 
     127         * @since 4.8.1 
     128         * 
     129         * @param string                $content  The widget content. 
     130         * @param array                 $instance Array of settings for the current widget. 
     131         * @param WP_Widget_Custom_HTML $this     Current Custom HTML widget instance. 
     132         */ 
     133        $content = apply_filters( 'widget_custom_html_content', $content, $instance, $this ); 
     134 
     135        echo $args['before_widget']; 
     136        if ( ! empty( $title ) ) { 
     137            echo $args['before_title'] . $title . $args['after_title']; 
     138        } 
     139        echo $content; 
     140        echo $args['after_widget']; 
     141    } 
     142 
     143    /** 
     144     * Handles updating settings for the current Custom HTML widget instance. 
     145     * 
     146     * @since 4.8.1 
     147     * 
     148     * @param array $new_instance New settings for this instance as input by the user via 
     149     *                            WP_Widget::form(). 
     150     * @param array $old_instance Old settings for this instance. 
     151     * @return array Settings to save or bool false to cancel saving. 
     152     */ 
     153    public function update( $new_instance, $old_instance ) { 
     154        $instance = array_merge( $this->default_instance, $old_instance ); 
     155        $instance['title'] = sanitize_text_field( $new_instance['title'] ); 
     156        if ( current_user_can( 'unfiltered_html' ) ) { 
     157            $instance['content'] = $new_instance['content']; 
     158        } else { 
     159            $instance['content'] = wp_kses_post( $new_instance['content'] ); 
     160        } 
     161        return $instance; 
     162    } 
     163 
     164    /** 
     165     * Outputs the Custom HTML widget settings form. 
     166     * 
     167     * @since 4.8.1 
     168     * 
     169     * @param array $instance Current instance. 
     170     * @returns void 
     171     */ 
     172    public function form( $instance ) { 
     173        $instance = wp_parse_args( (array) $instance, $this->default_instance ); 
     174        ?> 
     175        <p> 
     176            <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label> 
     177            <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>"/> 
     178        </p> 
     179 
     180        <p> 
     181            <label for="<?php echo $this->get_field_id( 'content' ); ?>"><?php _e( 'Content:' ); ?></label> 
     182            <textarea class="widefat code" rows="16" cols="20" id="<?php echo $this->get_field_id( 'content' ); ?>" name="<?php echo $this->get_field_name( 'content' ); ?>"><?php echo esc_textarea( $instance['content'] ); ?></textarea> 
     183        </p> 
     184 
     185        <?php if ( ! current_user_can( 'unfiltered_html' ) ) : ?> 
     186            <?php 
     187            $probably_unsafe_html = array( 'script', 'iframe', 'form', 'input', 'style' ); 
     188            $allowed_html = wp_kses_allowed_html( 'post' ); 
     189            $disallowed_html = array_diff( $probably_unsafe_html, array_keys( $allowed_html ) ); 
     190            ?> 
     191            <?php if ( ! empty( $disallowed_html ) ) : ?> 
     192                <p> 
     193                    <?php _e( 'Some HTML tags are not permitted, including:' ); ?> 
     194                    <code><?php echo join( '</code>, <code>', $disallowed_html ); ?></code> 
     195                </p> 
     196            <?php endif; ?> 
     197        <?php endif; ?> 
     198        <?php 
     199    } 
     200} 
Note: See TracChangeset for help on using the changeset viewer.