Make WordPress Core

Ticket #42548: 42548.8.diff

File 42548.8.diff, 4.9 KB (added by westonruter, 7 years ago)

https://github.com/xwp/wordpress-develop/pull/302/commits/824c3faafcdf9d94491ead42981cde284dd5ad4a

  • src/wp-includes/widgets/class-wp-widget-custom-html.php

    diff --git src/wp-includes/widgets/class-wp-widget-custom-html.php src/wp-includes/widgets/class-wp-widget-custom-html.php
    index 855c3c5895..c01419c351 100644
    class WP_Widget_Custom_HTML extends WP_Widget { 
    8080                add_action( 'admin_head-widgets.php', array( 'WP_Widget_Custom_HTML', 'add_help_text' ) );
    8181        }
    8282
     83        /**
     84         * Filter gallery shortcode attributes.
     85         *
     86         * Prevents all of a site's attachments from being shown in a gallery displayed on a
     87         * non-singular template where a $post context is not available.
     88         *
     89         * @since 4.9.0
     90         *
     91         * @param array $attrs Attributes.
     92         * @return array Attributes.
     93         */
     94        public function _filter_gallery_shortcode_attrs( $attrs ) {
     95                if ( ! is_singular() && empty( $attrs['id'] ) && empty( $attrs['include'] ) ) {
     96                        $attrs['id'] = -1;
     97                }
     98                return $attrs;
     99        }
     100
    83101        /**
    84102         * Outputs the content for the current Custom HTML widget instance.
    85103         *
    86104         * @since 4.8.1
    87105         *
     106         * @global WP_Post $post
    88107         * @param array $args     Display arguments including 'before_title', 'after_title',
    89108         *                        'before_widget', and 'after_widget'.
    90109         * @param array $instance Settings for the current Custom HTML widget instance.
    91110         */
    92111        public function widget( $args, $instance ) {
     112                global $post;
     113
     114                // Override global $post so filters (and shortcodes) apply in a consistent context.
     115                $original_post = $post;
     116                if ( is_singular() ) {
     117                        // Make sure post is always the queried object on singular queries (not from another sub-query that failed to clean up the global $post).
     118                        $post = get_queried_object();
     119                } else {
     120                        // Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context on archive queries.
     121                        $post = null;
     122                }
     123
     124                // Prevent dumping out all attachments from the media library.
     125                add_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );
    93126
    94127                $instance = array_merge( $this->default_instance, $instance );
    95128
    class WP_Widget_Custom_HTML extends WP_Widget { 
    118151                 */
    119152                $content = apply_filters( 'widget_custom_html_content', $content, $instance, $this );
    120153
     154                // Restore post global.
     155                $post = $original_post;
     156                remove_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );
     157
    121158                // Inject the Text widget's container class name alongside this widget's class name for theme styling compatibility.
    122159                $args['before_widget'] = preg_replace( '/(?<=\sclass=["\'])/', 'widget_text ', $args['before_widget'] );
    123160
  • src/wp-includes/widgets/class-wp-widget-text.php

    diff --git src/wp-includes/widgets/class-wp-widget-text.php src/wp-includes/widgets/class-wp-widget-text.php
    index ffcfe0cd09..b62885dabb 100644
    class WP_Widget_Text extends WP_Widget { 
    178178                return false;
    179179        }
    180180
     181        /**
     182         * Filter gallery shortcode attributes.
     183         *
     184         * Prevents all of a site's attachments from being shown in a gallery displayed on a
     185         * non-singular template where a $post context is not available.
     186         *
     187         * @since 4.9.0
     188         *
     189         * @param array $attrs Attributes.
     190         * @return array Attributes.
     191         */
     192        public function _filter_gallery_shortcode_attrs( $attrs ) {
     193                if ( ! is_singular() && empty( $attrs['id'] ) && empty( $attrs['include'] ) ) {
     194                        $attrs['id'] = -1;
     195                }
     196                return $attrs;
     197        }
     198
    181199        /**
    182200         * Outputs the content for the current Text widget instance.
    183201         *
    class WP_Widget_Text extends WP_Widget { 
    221239                        remove_filter( 'widget_text', 'do_shortcode', $widget_text_do_shortcode_priority );
    222240                }
    223241
    224                 // Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context.
    225                 $suspended_post = null;
    226                 if ( isset( $post ) ) {
    227                         $suspended_post = $post;
     242                // Override global $post so filters (and shortcodes) apply in a consistent context.
     243                $original_post = $post;
     244                if ( is_singular() ) {
     245                        // Make sure post is always the queried object on singular queries (not from another sub-query that failed to clean up the global $post).
     246                        $post = get_queried_object();
     247                } else {
     248                        // Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context on archive queries.
    228249                        $post = null;
    229250                }
    230251
     252                // Prevent dumping out all attachments from the media library.
     253                add_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );
     254
    231255                /**
    232256                 * Filters the content of the Text widget.
    233257                 *
    class WP_Widget_Text extends WP_Widget { 
    278302                }
    279303
    280304                // Restore post global.
    281                 if ( isset( $suspended_post ) ) {
    282                         $post = $suspended_post;
    283                 }
     305                $post = $original_post;
     306                remove_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );
    284307
    285308                // Undo suspension of legacy plugin-supplied shortcode handling.
    286309                if ( $should_suspend_legacy_shortcode_support ) {