Make WordPress Core

Ticket #25650: 25650-wp_upload_dir-fix-after-switch_to_blog.patch

File 25650-wp_upload_dir-fix-after-switch_to_blog.patch, 7.7 KB (added by ideag, 2 years ago)

approach 3

  • src/wp-includes/default-constants.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/wp-includes/default-constants.php b/src/wp-includes/default-constants.php
    a b  
    154154function wp_plugin_directory_constants() {
    155155        if ( ! defined( 'WP_CONTENT_URL' ) ) {
    156156                define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' ); // Full URL - WP_CONTENT_DIR is defined further up.
     157                define( 'WP_DYNAMIC_CONTENT_URL', true ); // Flag to differentiate if WP_CONTENT_URL was explicitly set in wp-config.php or not
    157158        }
    158159
    159160        /**
  • src/wp-includes/functions.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
    a b  
    23882388        } else {
    23892389                $dir = $upload_path;
    23902390        }
    2391 
    23922391        $url = get_option( 'upload_url_path' );
    23932392        if ( ! $url ) {
    23942393                if ( empty( $upload_path ) || ( 'wp-content/uploads' === $upload_path ) || ( $upload_path == $dir ) ) {
    2395                         $url = WP_CONTENT_URL . '/uploads';
     2394                        $url = content_url() . '/uploads';
    23962395                } else {
    23972396                        $url = trailingslashit( $siteurl ) . $upload_path;
    23982397                }
  • src/wp-includes/link-template.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php
    a b  
    34873487 * @return string Content URL link with optional path appended.
    34883488 */
    34893489function content_url( $path = '' ) {
    3490         $url = set_url_scheme( WP_CONTENT_URL );
     3490        if ( ms_is_switched() && defined( 'WP_DYNAMIC_CONTENT_URL' ) && WP_DYNAMIC_CONTENT_URL ) {
     3491                $url = get_option( 'siteurl' ) . '/wp-content';
     3492        } else {
     3493                $url = WP_CONTENT_URL;
     3494        }
     3495        $url = set_url_scheme( $url );
    34913496
    34923497        if ( $path && is_string( $path ) ) {
    34933498                $url .= '/' . ltrim( $path, '/' );
  • tests/phpunit/tests/multisite/site.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/tests/phpunit/tests/multisite/site.php b/tests/phpunit/tests/multisite/site.php
    a b  
    834834                        restore_current_blog();
    835835                }
    836836
    837                 public function test_switch_upload_dir() {
     837                /**
     838                 * Test wp_upload_dir() output when WP_UPLOAD_URL is explicitly defined in wp-config.php
     839                 */
     840                public function test_defined_wp_content_url() {
     841                        /*
     842                         * Global constants can't be mocked in PHPUnit, so this can only run with the expected
     843                         * values already set in `wp-tests-config.php`. Unfortunately, that means it won't run in
     844                         * automated workflows, but it's still useful when testing locally.
     845                         *
     846                         * It may be possible to enable automated workflows by mocking `define()`, or by setting up
     847                         * addition automated flows that initialize the tests with different values for the constants.
     848                         * At the moment, though, neither of those seem to provide enough benefit to justify the time
     849                         * investment.
     850                         *
     851                         * @link https://theaveragedev.com/mocking-constants-in-tests/
     852                         */
     853                        if ( defined( 'WP_DYNAMIC_CONTENT_URL' ) && WP_DYNAMIC_CONTENT_URL ) {
     854                                $this->markTestSkipped( 'Test requires setting `WP_CONTENT_URL` constant explicitly in `wp-tests-config.php` to expected values.' );
     855                        }
     856
    838857                        $this->assertTrue( is_main_site() );
    839858
    840                         $site = get_current_site();
    841859                        $date = date_format( date_create( 'now' ), 'Y/m' );
    842860
    843861                        $info = wp_upload_dir();
    844                         $this->assertSame( 'http://' . $site->domain . '/wp-content/uploads/' . $date, $info['url'] );
     862                        $this->assertSame( WP_CONTENT_URL . '/uploads/' . $date, $info['url'] );
    845863                        $this->assertSame( ABSPATH . 'wp-content/uploads/' . $date, $info['path'] );
    846864                        $this->assertSame( '/' . $date, $info['subdir'] );
    847865                        $this->assertFalse( $info['error'] );
    848866
     867                        $date = date_format( date_create( 'now' ), 'Y/m' );
     868                        $this->assertFalse( defined( 'WP_DYNAMIC_CONTENT_URL' ) );
     869
    849870                        $blog_id = self::factory()->blog->create();
    850871
    851872                        switch_to_blog( $blog_id );
    852873                        $info = wp_upload_dir();
    853                         $this->assertSame( 'http://' . $site->domain . '/wp-content/uploads/sites/' . get_current_blog_id() . '/' . $date, $info['url'] );
     874                        $this->assertSame( WP_CONTENT_URL . '/uploads/sites/' . get_current_blog_id() . '/' . $date, $info['url'] );
    854875                        $this->assertSame( ABSPATH . 'wp-content/uploads/sites/' . get_current_blog_id() . '/' . $date, $info['path'] );
    855876                        $this->assertSame( '/' . $date, $info['subdir'] );
    856877                        $this->assertFalse( $info['error'] );
    857878                        restore_current_blog();
    858879
     880                }
     881
     882                /**
     883                 * Test wp_upload_dir() output when WP_UPLOAD_URL is defined dynamically in default-constants.php
     884                 */
     885                public function test_dynamic_wp_content_url() {
     886                        /*
     887                         * Global constants can't be mocked in PHPUnit, so this can only run with the expected
     888                         * values already set in `wp-tests-config.php`. Unfortunately, that means it won't run in
     889                         * automated workflows, but it's still useful when testing locally.
     890                         *
     891                         * It may be possible to enable automated workflows by mocking `define()`, or by setting up
     892                         * addition automated flows that initialize the tests with different values for the constants.
     893                         * At the moment, though, neither of those seem to provide enough benefit to justify the time
     894                         * investment.
     895                         *
     896                         * @link https://theaveragedev.com/mocking-constants-in-tests/
     897                         */
     898                        if ( ! defined( 'WP_DYNAMIC_CONTENT_URL' ) || ! WP_DYNAMIC_CONTENT_URL ) {
     899                                $this->markTestSkipped( 'Test requires not setting `WP_CONTENT_URL` constant explicitly in `wp-tests-config.php`.' );
     900                        }
     901
     902                        $this->assertTrue( is_main_site() );
     903
     904                        $site = get_current_site();
     905                        $date = date_format( date_create( 'now' ), 'Y/m' );
     906
    859907                        $info = wp_upload_dir();
    860908                        $this->assertSame( 'http://' . $site->domain . '/wp-content/uploads/' . $date, $info['url'] );
    861909                        $this->assertSame( ABSPATH . 'wp-content/uploads/' . $date, $info['path'] );
    862910                        $this->assertSame( '/' . $date, $info['subdir'] );
    863911                        $this->assertFalse( $info['error'] );
     912
     913                        $blog_ids = array(
     914                                'subdirectory' => array(
     915                                        'domain' => WP_TESTS_DOMAIN,
     916                                        'path'   => '/foo/',
     917                                ),
     918                                'subdomain' => array(
     919                                        'domain' => 'foo' . WP_TESTS_DOMAIN,
     920                                        'path'   => '/',
     921                                ),
     922                                'domain' => array(
     923                                        'domain' => 'wordpress.org',
     924                                        'path'   => '/',
     925                                )
     926                        );
     927
     928                        foreach( $blog_ids as $blog_id ) {
     929                                $blog_id = self::factory()->blog->create( $blog_id );
     930
     931                                switch_to_blog( $blog_id );
     932                                $site = get_site( $blog_id );
     933                                $info = wp_upload_dir();
     934                                $this->assertSame( 'http://' . $site->domain . $site->path .  'wp-content/uploads/sites/' . get_current_blog_id() . '/' . $date, $info['url'] );
     935                                $this->assertSame( ABSPATH . 'wp-content/uploads/sites/' . get_current_blog_id() . '/' . $date, $info['path'] );
     936                                $this->assertSame( '/' . $date, $info['subdir'] );
     937                                $this->assertFalse( $info['error'] );
     938                                restore_current_blog();
     939                        }
    864940                }
    865941
    866942                /**