WordPress.org

Make WordPress Core

Ticket #44427: 44427.6.diff

File 44427.6.diff, 8.3 KB (added by spacedmonkey, 3 months ago)
  • src/wp-includes/default-filters.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    260260add_filter( 'xmlrpc_pingback_error', 'xmlrpc_pingback_error' );
    261261add_filter( 'title_save_pre', 'trim' );
    262262
     263// Add lazy loading attrs to core functions.
     264foreach ( array( 'get_avatar', 'wp_get_attachment_image', 'smilies_html', 'the_content', 'the_excerpt', 'comment_text', 'widget_text_content' ) as $filter ) {
     265        add_filter( $filter, 'wp_lazy_load_content_media' );
     266}
     267
    263268add_action( 'transition_comment_status', '_clear_modified_cache_on_transition_comment_status', 10, 2 );
    264269
    265270add_filter( 'http_request_host_is_external', 'allowed_http_request_hosts', 10, 2 );
  • src/wp-includes/formatting.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    33073307         */
    33083308        $src_url = apply_filters( 'smilies_src', includes_url( "images/smilies/$img" ), $img, site_url() );
    33093309
    3310         return sprintf( '<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', esc_url( $src_url ), esc_attr( $smiley ) );
     3310        $html = sprintf( '<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', esc_url( $src_url ), esc_attr( $smiley ) );
     3311
     3312        /**
     3313         * Filters the Smiley image markup.
     3314         *
     3315         * @since 5.4.0
     3316         *
     3317         * @param string $html       HTML markup for the smiley image.
     3318         * @param string $smiley_url URL for the smiley image.
     3319         * @param string $img        Filename for the smiley image.
     3320         * @param string $site_url   Site URL, as returned by site_url().
     3321         */
     3322        $html = apply_filters( 'smilies_html', $html, $src_url, $img, site_url() );
     3323
     3324        return $html;
    33113325}
    33123326
    33133327/**
  • src/wp-includes/media.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    10531053                $html .= ' />';
    10541054        }
    10551055
     1056        /**
     1057         * Filters the markup of image attachments.
     1058         *
     1059         * @since 5.4.0
     1060         *
     1061         * @param string       $html       The markup for image attachments.
     1062         * @param string[]     $attr       Array of attribute values for the image markup, keyed by attribute name.
     1063         * @param WP_Post      $attachment Image attachment post.
     1064         * @param string|array $size       Requested size. Image size or array of width and height values
     1065         *                                 (in that order). Default 'thumbnail'.
     1066         */
     1067        $html = apply_filters( 'wp_get_attachment_image', $html, $attr, $attachment, $size );
     1068
    10561069        return $html;
    10571070}
    10581071
     
    15931606        return $image;
    15941607}
    15951608
     1609/**
     1610 * Filters 'img' and 'iframe' elements in post content to add 'loading' attributes.
     1611 *
     1612 * @since 5.4.0
     1613 *
     1614 * @param string $content The raw post content to be filtered.
     1615 * @return string Converted content with 'loading' attributes added to images.
     1616 */
     1617function wp_lazy_load_content_media( $content ) {
     1618        $tags = array( 'img', 'iframe' );
     1619
     1620        /**
     1621         * Filters whether media in post content should be lazy-loaded with 'loading' attributes.
     1622         *
     1623         * @since 5.4.0
     1624         *
     1625         * @param bool   $enabled Whether to lazy-load content media. Default true.
     1626         * @param string $content The raw post content to be filtered.
     1627         */
     1628        if ( ! apply_filters( 'wp_lazy_load_content_media', true, $content ) ) {
     1629                return $content;
     1630        }
     1631
     1632        return preg_replace_callback(
     1633                '/<(' . implode( '|', $tags ) . ') [^>]+>/',
     1634                function( array $matches ) {
     1635                        if ( false === strpos( $matches[0], ' loading=' ) ) {
     1636                                $tag = $matches[1];
     1637                                return str_replace( '<' . $tag . ' ', '<' . $tag . ' loading="lazy" ', $matches[0] );
     1638                        }
     1639                        return $matches[0];
     1640                },
     1641                $content
     1642        );
     1643}
     1644
    15961645/**
    15971646 * Adds a 'wp-post-image' class to post thumbnails. Internal use only.
    15981647 *
  • tests/phpunit/tests/media.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    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/**