Make WordPress Core

Changeset 56651


Ignore:
Timestamp:
09/21/2023 04:35:30 PM (3 years ago)
Author:
flixos90
Message:

Media: Introduce filters to customize the results from wp_get_loading_optimization_attributes().

This changeset introduces two filters that allow customizing the loading optimization attributes array returned from wp_get_loading_optimization_attributes() for individual HTML tags:

  • The wp_get_loading_optimization_attributes filter can be used to modify the results from the WordPress core logic.
  • The pre_wp_get_loading_optimization_attributes filter can be used to use entirely custom logic and effectively short-circuit the core function.

Props pereirinha, mukesh27, spacedmonkey, joemcgill.
Fixes #58893.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/media.php

    r56612 r56651  
    56265626        global $wp_query;
    56275627
     5628        /**
     5629         * Filters whether to short-circuit loading optimization attributes.
     5630         *
     5631         * Returning an array from the filter will effectively short-circuit the loading of optimization attributes,
     5632         * returning that value instead.
     5633         *
     5634         * @since 6.4.0
     5635         *
     5636         * @param array|false $loading_attrs False by default, or array of loading optimization attributes to short-circuit.
     5637         * @param string      $tag_name      The tag name.
     5638         * @param array       $attr          Array of the attributes for the tag.
     5639         * @param string      $context       Context for the element for which the loading optimization attribute is requested.
     5640         */
     5641        $loading_attrs = apply_filters( 'pre_wp_get_loading_optimization_attributes', false, $tag_name, $attr, $context );
     5642
     5643        if ( is_array( $loading_attrs ) ) {
     5644                return $loading_attrs;
     5645        }
     5646
    56285647        $loading_attrs = array();
    56295648
     
    56335652         */
    56345653        if ( 'template' === $context ) {
    5635                 return $loading_attrs;
     5654                /** This filter is documented in wp-includes/media.php */
     5655                return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
    56365656        }
    56375657
    56385658        // For now this function only supports images and iframes.
    56395659        if ( 'img' !== $tag_name && 'iframe' !== $tag_name ) {
    5640                 return $loading_attrs;
     5660                /** This filter is documented in wp-includes/media.php */
     5661                return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
    56415662        }
    56425663
    56435664        // For any resources, width and height must be provided, to avoid layout shifts.
    56445665        if ( ! isset( $attr['width'], $attr['height'] ) ) {
    5645                 return $loading_attrs;
     5666                /** This filter is documented in wp-includes/media.php */
     5667                return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
    56465668        }
    56475669
     
    56555677        // TODO: Handle shortcode images together with the content (see https://core.trac.wordpress.org/ticket/58853).
    56565678        if ( 'the_content' !== $context && 'do_shortcode' !== $context && doing_filter( 'the_content' ) ) {
    5657                 return $loading_attrs;
     5679                /** This filter is documented in wp-includes/media.php */
     5680                return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
    56585681        }
    56595682
     
    57905813        }
    57915814
    5792         return $loading_attrs;
     5815        /**
     5816         * Filters the loading optimization attributes.
     5817         *
     5818         * @since 6.4.0
     5819         *
     5820         * @param array  $loading_attrs The loading optimization attributes.
     5821         * @param string $tag_name      The tag name.
     5822         * @param array  $attr          Array of the attributes for the tag.
     5823         * @param string $context       Context for the element for which the loading optimization attribute is requested.
     5824         */
     5825        return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
    57935826}
    57945827
  • trunk/tests/phpunit/tests/media.php

    r56616 r56651  
    54425442
    54435443        /**
     5444         * Tests for pre_wp_get_loading_optimization_attributes filter.
     5445         *
     5446         * @ticket 58893
     5447         */
     5448        public function test_pre_wp_get_loading_optimization_attributes_filter() {
     5449                add_filter(
     5450                        'pre_wp_get_loading_optimization_attributes',
     5451                        static function ( $loading_attrs ) {
     5452                                if ( false === $loading_attrs ) {
     5453                                        // Initialize as an empty array.
     5454                                        $loading_attrs = array();
     5455                                }
     5456                                $loading_attrs['fetchpriority'] = 'high';
     5457
     5458                                return $loading_attrs;
     5459                        },
     5460                        10,
     5461                        1
     5462                );
     5463
     5464                $attr = $this->get_width_height_for_high_priority();
     5465
     5466                $this->assertSame(
     5467                        array( 'fetchpriority' => 'high' ),
     5468                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5469                        'The filter did not return early fetchpriority attribute'
     5470                );
     5471
     5472                // Clean up the filter.
     5473                add_filter( 'pre_wp_get_loading_optimization_attributes', '__return_false' );
     5474
     5475                $this->assertSameSets(
     5476                        array( 'loading' => 'lazy' ),
     5477                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5478                        'The filter did not return the default attributes.'
     5479                );
     5480
     5481                // Return no loading attributes.
     5482                add_filter( 'pre_wp_get_loading_optimization_attributes', '__return_empty_array' );
     5483
     5484                $this->assertSameSets(
     5485                        array(),
     5486                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5487                        'The filter did not clean up all attributes.'
     5488                );
     5489
     5490                // Modify the loading attributes with any custom attributes.
     5491                add_filter(
     5492                        'pre_wp_get_loading_optimization_attributes',
     5493                        static function ( $loading_attrs ) {
     5494                                if ( false === $loading_attrs ) {
     5495                                        // Initialize as an empty array.
     5496                                        $loading_attrs = array();
     5497                                }
     5498                                $loading_attrs['custom_attr'] = 'custom_value';
     5499
     5500                                return $loading_attrs;
     5501                        },
     5502                        10,
     5503                        1
     5504                );
     5505
     5506                $this->assertSameSets(
     5507                        array( 'custom_attr' => 'custom_value' ),
     5508                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5509                        'The filter did not return custom attributes.'
     5510                );
     5511        }
     5512
     5513        /**
     5514         * Tests for wp_get_loading_optimization_attributes filter.
     5515         *
     5516         * @ticket 58893
     5517         */
     5518        public function test_wp_get_loading_optimization_attributes_filter() {
     5519                $attr = $this->get_width_height_for_high_priority();
     5520
     5521                $this->assertSameSets(
     5522                        array( 'loading' => 'lazy' ),
     5523                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5524                        'Before the filter it will not return the loading attribute.'
     5525                );
     5526
     5527                add_filter(
     5528                        'wp_get_loading_optimization_attributes',
     5529                        static function ( $loading_attrs ) {
     5530                                unset( $loading_attrs['loading'] );
     5531                                $loading_attrs['fetchpriority'] = 'high';
     5532
     5533                                return $loading_attrs;
     5534                        },
     5535                        10,
     5536                        1
     5537                );
     5538
     5539                $this->assertSameSets(
     5540                        array( 'fetchpriority' => 'high' ),
     5541                        wp_get_loading_optimization_attributes( 'img', $attr, 'the_content' ),
     5542                        'After the filter it will not return the fetchpriority attribute.'
     5543                );
     5544        }
     5545
     5546        /**
    54445547         * Helper method to keep track of the last context returned by the 'wp_get_attachment_image_context' filter.
    54455548         *
Note: See TracChangeset for help on using the changeset viewer.