Make WordPress Core


Ignore:
Timestamp:
07/24/2017 10:45:55 PM (9 years ago)
Author:
westonruter
Message:

Widgets: Rename Text widget's legacy mode to non-visual mode, restore boolean filter prop, and improve compatibility for widget_text filters applied in Custom HTML widget.

Props westonruter, obenland, timmydcrawford for testing.
Amends [41050].
See #35243, #40951, #40907.
Fixes #41394.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/widgets/class-wp-widget-text.php

    r41086 r41132  
    8080        public function is_legacy_instance( $instance ) {
    8181
    82                 // If the widget has been updated while in legacy mode, it stays in legacy mode.
    83                 if ( ! empty( $instance['legacy'] ) ) {
    84                         return true;
    85                 }
    86 
    87                 // If the widget has been added/updated in 4.8 then filter prop is 'content' and it is no longer legacy.
     82                // Legacy mode when not in visual mode.
     83                if ( isset( $instance['visual'] ) ) {
     84                        return ! $instance['visual'];
     85                }
     86
     87                // Or, the widget has been added/updated in 4.8.0 then filter prop is 'content' and it is no longer legacy.
    8888                if ( isset( $instance['filter'] ) && 'content' === $instance['filter'] ) {
    8989                        return false;
     
    194194
    195195                $text = ! empty( $instance['text'] ) ? $instance['text'] : '';
    196                 $is_visual_text_widget = ( isset( $instance['filter'] ) && 'content' === $instance['filter'] );
     196                $is_visual_text_widget = ( ! empty( $instance['visual'] ) && ! empty( $instance['filter'] ) );
     197
     198                // In 4.8.0 only, visual Text widgets get filter=content, without visual prop; upgrade instance props just-in-time.
     199                if ( ! $is_visual_text_widget ) {
     200                        $is_visual_text_widget = ( isset( $instance['filter'] ) && 'content' === $instance['filter'] );
     201                }
     202                if ( $is_visual_text_widget ) {
     203                        $instance['filter'] = true;
     204                        $instance['visual'] = true;
     205                }
    197206
    198207                /*
     
    222231                $text = apply_filters( 'widget_text', $text, $instance, $this );
    223232
    224                 if ( isset( $instance['filter'] ) ) {
    225                         if ( 'content' === $instance['filter'] ) {
    226 
    227                                 /**
    228                                  * Filters the content of the Text widget to apply changes expected from the visual (TinyMCE) editor.
    229                                  *
    230                                  * By default a subset of the_content filters are applied, including wpautop and wptexturize.
    231                                  *
    232                                  * @since 4.8.0
    233                                  *
    234                                  * @param string         $text     The widget content.
    235                                  * @param array          $instance Array of settings for the current widget.
    236                                  * @param WP_Widget_Text $this     Current Text widget instance.
    237                                  */
    238                                 $text = apply_filters( 'widget_text_content', $text, $instance, $this );
    239 
    240                         } elseif ( $instance['filter'] ) {
    241                                 $text = wpautop( $text ); // Back-compat for instances prior to 4.8.
    242                         }
     233                if ( $is_visual_text_widget ) {
     234
     235                        /**
     236                         * Filters the content of the Text widget to apply changes expected from the visual (TinyMCE) editor.
     237                         *
     238                         * By default a subset of the_content filters are applied, including wpautop and wptexturize.
     239                         *
     240                         * @since 4.8.0
     241                         *
     242                         * @param string         $text     The widget content.
     243                         * @param array          $instance Array of settings for the current widget.
     244                         * @param WP_Widget_Text $this     Current Text widget instance.
     245                         */
     246                        $text = apply_filters( 'widget_text_content', $text, $instance, $this );
     247
     248                } elseif ( ! empty( $instance['filter'] ) ) {
     249                        $text = wpautop( $text ); // Back-compat for instances prior to 4.8.
    243250                }
    244251
     
    272279         */
    273280        public function update( $new_instance, $old_instance ) {
     281                $new_instance = wp_parse_args( $new_instance, array(
     282                        'title' => '',
     283                        'text' => '',
     284                        'filter' => false, // For back-compat.
     285                        'visual' => null, // Must be explicitly defined.
     286                ) );
     287
    274288                $instance = $old_instance;
     289
    275290                $instance['title'] = sanitize_text_field( $new_instance['title'] );
    276291                if ( current_user_can( 'unfiltered_html' ) ) {
     
    280295                }
    281296
    282                 /*
    283                  * If the Text widget is in legacy mode, then a hidden input will indicate this
    284                  * and the new content value for the filter prop will by bypassed. Otherwise,
    285                  * re-use legacy 'filter' (wpautop) property to now indicate content filters will always apply.
    286                  * Prior to 4.8, this is a boolean value used to indicate whether or not wpautop should be
    287                  * applied. By re-using this property, downgrading WordPress from 4.8 to 4.7 will ensure
    288                  * that the content for Text widgets created with TinyMCE will continue to get wpautop.
    289                  */
    290                 if ( isset( $new_instance['legacy'] ) || isset( $old_instance['legacy'] ) || ( isset( $new_instance['filter'] ) && 'content' !== $new_instance['filter'] ) ) {
    291                         $instance['filter'] = ! empty( $new_instance['filter'] );
    292                         $instance['legacy'] = true;
    293                 } else {
    294                         $instance['filter'] = 'content';
    295                         unset( $instance['legacy'] );
     297                $instance['filter'] = ! empty( $new_instance['filter'] );
     298
     299                // Upgrade 4.8.0 format.
     300                if ( isset( $old_instance['filter'] ) && 'content' === $old_instance['filter'] ) {
     301                        $instance['visual'] = true;
     302                }
     303                if ( 'content' === $new_instance['filter'] ) {
     304                        $instance['visual'] = true;
     305                }
     306
     307                if ( isset( $new_instance['visual'] ) ) {
     308                        $instance['visual'] = ! empty( $new_instance['visual'] );
     309                }
     310
     311                // Filter is always true in visual mode.
     312                if ( ! empty( $instance['visual'] ) ) {
     313                        $instance['filter'] = true;
    296314                }
    297315
     
    334352                        <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
    335353                        <input id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text" type="hidden" value="<?php echo esc_attr( $instance['text'] ); ?>">
     354                        <input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" class="filter" type="hidden" value="on">
     355                        <input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="on">
    336356                <?php else : ?>
    337                         <input name="<?php echo $this->get_field_name( 'legacy' ); ?>" type="hidden" class="legacy" value="true">
     357                        <input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="">
    338358                        <p>
    339359                                <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
Note: See TracChangeset for help on using the changeset viewer.