WordPress.org

Make WordPress Core

Ticket #44427: 44427.4.diff

File 44427.4.diff, 6.9 KB (added by flixos90, 8 months ago)
  • src/wp-includes/default-filters.php

     
    176176add_filter( 'the_content', 'shortcode_unautop' );
    177177add_filter( 'the_content', 'prepend_attachment' );
    178178add_filter( 'the_content', 'wp_make_content_images_responsive' );
     179add_filter( 'the_content', 'wp_lazy_load_content_media' );
    179180
    180181add_filter( 'the_excerpt', 'wptexturize' );
    181182add_filter( 'the_excerpt', 'convert_smilies' );
  • src/wp-includes/media.php

     
    10131013                        'alt'   => trim( strip_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) ) ),
    10141014                );
    10151015
     1016                /** This filter is documented in wp-includes/media.php */
     1017                if ( apply_filters( 'wp_lazy_load_content_media', true ) ) {
     1018                        $default_attr['loading'] = 'lazy';
     1019                }
     1020
    10161021                $attr = wp_parse_args( $attr, $default_attr );
    10171022
    10181023                // Generate 'srcset' and 'sizes' if not already present.
     
    15951600}
    15961601
    15971602/**
     1603 * Filters 'img' and 'iframe' elements in post content to add 'loading' attributes.
     1604 *
     1605 * @since 5.4.0
     1606 *
     1607 * @param string $content The raw post content to be filtered.
     1608 * @return string Converted content with 'loading' attributes added to images.
     1609 */
     1610function wp_lazy_load_content_media( $content ) {
     1611        $tags = array( 'img', 'iframe' );
     1612
     1613        /**
     1614         * Filters whether media in post content should be lazy-loaded with 'loading' attributes.
     1615         *
     1616         * @since 5.4.0
     1617         *
     1618         * @param bool $enabled Whether to lazy-load content media. Default true.
     1619         */
     1620        if ( ! apply_filters( 'wp_lazy_load_content_media', true ) ) {
     1621                return $content;
     1622        }
     1623
     1624        return preg_replace_callback(
     1625                '/<(' . implode( '|', $tags ) . ') [^>]+>/',
     1626                function( array $matches ) {
     1627                        if ( false === strpos( $matches[0], ' loading=' ) ) {
     1628                                $tag = $matches[1];
     1629                                return str_replace( '<' . $tag . ' ', '<' . $tag . ' loading="lazy" ', $matches[0] );
     1630                        }
     1631                        return $matches[0];
     1632                },
     1633                $content
     1634        );
     1635}
     1636
     1637/**
    15981638 * Adds a 'wp-post-image' class to post thumbnails. Internal use only.
    15991639 *
    16001640 * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'}
  • src/wp-includes/pluggable.php

     
    25912591                        'extra_attr'    => '',
    25922592                );
    25932593
     2594                /** This filter is documented in wp-includes/media.php */
     2595                if ( apply_filters( 'wp_lazy_load_content_media', true ) ) {
     2596                        $defaults['loading'] = 'lazy';
     2597                }
     2598
    25942599                if ( empty( $args ) ) {
    25952600                        $args = array();
    25962601                }
  • tests/phpunit/tests/media.php

     
    13011301         * Tests the default output of `wp_get_attachment_image()`.
    13021302         *
    13031303         * @ticket 34635
     1304         * @ticket 44427
    13041305         */
    13051306        function test_wp_get_attachment_image_defaults() {
    13061307                $image    = image_downsize( self::$large_id, 'thumbnail' );
    13071308                $expected = sprintf( '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="" />', $image[1], $image[2], $image[0] );
    13081309
     1310                add_filter( 'wp_lazy_load_content_media', '__return_false' );
     1311                $this->assertEquals( $expected, wp_get_attachment_image( self::$large_id ) );
     1312
     1313                $expected = str_replace( ' alt=""', ' alt="" loading="lazy"', $expected );
     1314
     1315                remove_filter( 'wp_lazy_load_content_media', '__return_false' );
    13091316                $this->assertEquals( $expected, wp_get_attachment_image( self::$large_id ) );
    13101317        }
    13111318
     
    13191326                update_post_meta( self::$large_id, '_wp_attachment_image_alt', 'Some very clever alt text', true );
    13201327
    13211328                $image    = image_downsize( self::$large_id, 'thumbnail' );
    1322                 $expected = sprintf( '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="Some very clever alt text" />', $image[1], $image[2], $image[0] );
     1329                $expected = sprintf( '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="Some very clever alt text" loading="lazy" />', $image[1], $image[2], $image[0] );
    13231330
    13241331                $this->assertEquals( $expected, wp_get_attachment_image( self::$large_id ) );
    13251332
     
    22322239                $month  = gmdate( 'm' );
    22332240
    22342241                $expected = '<img width="999" height="999" src="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $year . '/' . $month . '/test-image-testsize-999x999.png"' .
    2235                         ' class="attachment-testsize size-testsize" alt=""' .
     2242                        ' class="attachment-testsize size-testsize" alt="" loading="lazy"' .
    22362243                        ' srcset="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $year . '/' . $month . '/test-image-testsize-999x999.png 999w,' .
    22372244                                ' http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . $year . '/' . $month . '/test-image-large-150x150.png 150w"' .
    22382245                                ' sizes="(max-width: 999px) 100vw, 999px" />';
     
    24952502
    24962503                $this->assertSame( $expected, $url );
    24972504        }
     2505
     2506        /**
     2507         * @ticket 44427
     2508         */
     2509        function test_wp_lazy_load_content_media() {
     2510                $img       = get_image_tag( self::$large_id, '', '', '', 'medium' );
     2511                $img_xhtml = str_replace( ' />', '/>', $img );
     2512                $img_html5 = str_replace( ' />', '>', $img );
     2513                $iframe    = '<iframe src="https://www.example.com"></iframe>';
     2514
     2515                $lazy_img       = str_replace( '<img ', '<img loading="lazy" ', $img );
     2516                $lazy_img_xhtml = str_replace( '<img ', '<img loading="lazy" ', $img_xhtml );
     2517                $lazy_img_html5 = str_replace( '<img ', '<img loading="lazy" ', $img_html5 );
     2518                $lazy_iframe    = str_replace( '<iframe ', '<iframe loading="lazy" ', $iframe );
     2519
     2520                // The following should not be modified because there already is a 'loading' attribute.
     2521                $img_eager = str_replace( ' />', ' loading="eager" />', $img );
     2522
     2523                $content = '
     2524                        <p>Image, standard.</p>
     2525                        %1$s
     2526
     2527                        <p>Image, XHTML 1.0 style (no space before the closing slash).</p>
     2528                        %2$s
     2529
     2530                        <p>Image, HTML 5.0 style.</p>
     2531                        %3$s
     2532
     2533                        <p>Image, with pre-existing "loading" attribute.</p>
     2534                        %5$s
     2535
     2536                        <p>Iframe, standard.</p>
     2537                        %4$s';
     2538
     2539                $content_unfiltered = sprintf( $content, $img, $img_xhtml, $img_html5, $iframe, $img_eager );
     2540                $content_filtered   = sprintf( $content, $lazy_img, $lazy_img_xhtml, $lazy_img_html5, $lazy_iframe, $img_eager );
     2541
     2542                $this->assertSame( $content_filtered, wp_lazy_load_content_media( $content_unfiltered ) );
     2543        }
     2544
     2545        /**
     2546         * @ticket 44427
     2547         */
     2548        function test_wp_lazy_load_content_media_opted_out() {
     2549                $img = get_image_tag( self::$large_id, '', '', '', 'medium' );
     2550
     2551                $content = '
     2552                        <p>Image, standard.</p>
     2553                        %1$s';
     2554                $content = sprintf( $content, $img );
     2555
     2556                add_filter( 'wp_lazy_load_content_media', '__return_false' );
     2557                $this->assertSame( $content, wp_lazy_load_content_media( $content ) );
     2558        }
    24982559}
    24992560
    25002561/**