diff --git a/src/wp-includes/class.wp-dependencies.php b/src/wp-includes/class.wp-dependencies.php index e9f701b727bc..649bf172c3b9 100644 --- a/src/wp-includes/class.wp-dependencies.php +++ b/src/wp-includes/class.wp-dependencies.php @@ -94,6 +94,15 @@ class WP_Dependencies { */ private $all_queued_deps; + /** + * List of assets enqueued before details were registered. + * + * @since 5.9.0 + * + * @var array + */ + private $queued_before_register = array(); + /** * Processes the items and dependencies. * @@ -248,6 +257,18 @@ public function add( $handle, $src, $deps = array(), $ver = false, $args = null return false; } $this->registered[ $handle ] = new _WP_Dependency( $handle, $src, $deps, $ver, $args ); + + // If the item was enqueued before the details were registered, enqueue it now. + if ( array_key_exists( $handle, $this->queued_before_register ) ) { + if ( ! is_null( $this->queued_before_register[ $handle ] ) ) { + $this->enqueue( $handle . '?' . $this->queued_before_register[ $handle ] ); + } else { + $this->enqueue( $handle ); + } + + unset( $this->queued_before_register[ $handle ] ); + } + return true; } @@ -334,6 +355,12 @@ public function enqueue( $handles ) { if ( isset( $handle[1] ) ) { $this->args[ $handle[0] ] = $handle[1]; } + } else if ( ! isset( $this->registered[ $handle[0] ] ) ) { + $this->queued_before_register[ $handle[0] ] = null; // $args + + if ( isset( $handle[1] ) ) { + $this->queued_before_register[ $handle[0] ] = $handle[1]; + } } } } @@ -360,6 +387,8 @@ public function dequeue( $handles ) { unset( $this->queue[ $key ] ); unset( $this->args[ $handle[0] ] ); + } else if ( array_key_exists( $handle[0], $this->queued_before_register ) ) { + unset( $this->queued_before_register[ $handle[0] ] ); } } } diff --git a/tests/phpunit/tests/dependencies.php b/tests/phpunit/tests/dependencies.php index 354bfd376ef0..0087a0c143d6 100644 --- a/tests/phpunit/tests/dependencies.php +++ b/tests/phpunit/tests/dependencies.php @@ -136,4 +136,18 @@ public function test_query_and_registered_enqueued() { $this->assertFalse( $dep->query( 'one' ) ); } + + function test_enqueue_before_register() { + $dep = new WP_Dependencies; + + $this->assertArrayNotHasKey( 'one', $dep->registered ); + + $dep->enqueue( 'one' ); + + $this->assertNotContains( 'one', $dep->queue ); + + $this->assertTrue( $dep->add( 'one', '' ) ); + + $this->assertContains( 'one', $dep->queue ); + } }