WordPress.org

Make WordPress Core

Ticket #36791: add_enqueue_offset_ticket_36791.patch

File add_enqueue_offset_ticket_36791.patch, 9.1 KB (added by logistiker, 5 years ago)

Add offset parameter when enqueuing scripts and styles

  • src/wp-includes/class.wp-dependencies.php

     
    3535        public $queue = array();
    3636
    3737        /**
     38         * An array of reserved offsets.
     39         *
     40         * @access public
     41         * @var array
     42         */
     43        public $offsets = array();
     44
     45        /**
    3846         * An array of _WP_Dependency handle objects to queue.
    3947         *
    4048         * @access public
     
    291299         * @since 2.6.0 Moved from `WP_Scripts`.
    292300         *
    293301         * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings).
     302         * @param integer $offset offset within queue (increments to next available offset if already reserved).
    294303         */
    295         public function enqueue( $handles ) {
     304        public function enqueue( $handles, $offset = null ) {
    296305                foreach ( (array) $handles as $handle ) {
    297306                        $handle = explode('?', $handle);
    298307                        if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {
    299                                 $this->queue[] = $handle[0];
     308                                if ( $offset !== null ) {
     309                                        while ( array_key_exists($offset, $this->offsets) ) {
     310                                                $offset++;
     311                                        }
     312                                        $this->offsets[$offset] = $handle[0];
     313                                        ksort($this->offsets);
     314                                        if ( array_key_exists($offset, $this->queue) ) {
     315                                                array_splice($this->queue, $offset, 0, $handle[0]);
     316                                                // Make sure all reserved offsets positions remain the same even after a splice
     317                                                foreach ( $this->offsets as $queuedOffset => $queuedHandle ) {
     318                                                        if ( $this->queue[$queuedOffset] != $queuedHandle ) {
     319                                                                $queuedKey = array_search($queuedHandle, $this->queue);
     320                                                                unset($this->queue[$queuedKey]);
     321                                                                ksort($this->queue);
     322                                                                array_splice($this->queue, $queuedOffset, 0, $queuedHandle);
     323                                                        }
     324                                                }
     325                                        } else {
     326                                                $this->queue[$offset] = $handle[0];
     327                                                ksort($this->queue);
     328                                        }
     329                                } else {
     330                                        $this->queue[] = $handle[0];
     331                                }
    300332                                if ( isset($handle[1]) )
    301333                                        $this->args[$handle[0]] = $handle[1];
    302334                        }
     
    320352                        $handle = explode('?', $handle);
    321353                        $key = array_search($handle[0], $this->queue);
    322354                        if ( false !== $key ) {
     355                                if ( in_array($key, $this->offsets) ) {
     356                                        unset($this->offsets[$key]);
     357                                }
    323358                                unset($this->queue[$key]);
    324359                                unset($this->args[$handle[0]]);
    325360                        }
  • src/wp-includes/functions.wp-scripts.php

     
    254254 *                                    If set to null, no version is added.
    255255 * @param bool             $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>.
    256256 *                                    Default 'false'.
     257 * @param integer          $offset    Optional. Offset within queue (increments to next available offset if already reserved).
    257258 */
    258 function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) {
     259function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false, $offset = null ) {
    259260        $wp_scripts = wp_scripts();
    260261
    261262        _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );
     
    273274                }
    274275        }
    275276
    276         $wp_scripts->enqueue( $handle );
     277        $wp_scripts->enqueue( $handle, $offset );
    277278}
    278279
    279280/**
  • src/wp-includes/functions.wp-styles.php

     
    159159 * @param string           $media  Optional. The media for which this stylesheet has been defined.
    160160 *                                 Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
    161161 *                                 '(orientation: portrait)' and '(max-width: 640px)'.
     162 * @param integer          $offset Offset within queue (increments to next available offset if already reserved).
    162163 */
    163 function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) {
     164function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all', $offset = null ) {
    164165        _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );
    165166
    166167        $wp_styles = wp_styles();
     
    169170                $_handle = explode('?', $handle);
    170171                $wp_styles->add( $_handle[0], $src, $deps, $ver, $media );
    171172        }
    172         $wp_styles->enqueue( $handle );
     173        $wp_styles->enqueue( $handle, $offset );
    173174}
    174175
    175176/**
  • tests/phpunit/tests/dependencies/scripts.php

     
    2929                wp_enqueue_script('empty-deps-no-version', 'example.com' );
    3030                wp_enqueue_script('empty-deps-version', 'example.com', array(), 1.2);
    3131                wp_enqueue_script('empty-deps-null-version', 'example.com', array(), null);
     32                wp_enqueue_script('empty-deps-null-version-with-offset', 'example2.com', array(), null, false, 1);
     33                wp_enqueue_script('empty-deps-null-version-with-offset-and-new-key', 'example3.com', array(), null, false, 5);
    3234                $ver = get_bloginfo( 'version' );
    3335                $expected  = "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n";
     36                $expected .= "<script type='text/javascript' src='http://example2.com'></script>\n";
    3437                $expected .= "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n";
    3538                $expected .= "<script type='text/javascript' src='http://example.com?ver=1.2'></script>\n";
    3639                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
    37 
     40                $expected .= "<script type='text/javascript' src='http://example3.com'></script>\n";
    3841                $this->assertEquals($expected, get_echo('wp_print_scripts'));
    3942
    4043                // No scripts left to print
     
    724727
    725728                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
    726729        }
     730       
     731        /**
     732         * Test enqueue offsets
     733         * @ticket 36791
     734         */
     735        function test_wp_enqueue_script_with_offset_and_dependencies_in_head_and_footer() {
     736                wp_enqueue_script( 'child-head', '/child-head.js', array(), null, false ); // in head
     737                wp_enqueue_script( 'child-footer', '/child-footer.js', array(), null, true ); // in footer
     738                wp_enqueue_script( 'child-head2', '/child-head2.js', array(), null, false, 1); // second in head
     739                wp_enqueue_script( 'child-head1', '/child-head1.js', array(), null, false, 0); // first in head
     740                wp_enqueue_script( 'parent', '/parent.js', array( 'child-head', 'child-footer' ), null, true); // in footer
     741                wp_enqueue_script( 'parent1', '/parent1.js', array(), null, true, 1 ); // first in footer
     742                wp_enqueue_script( 'parent2', '/parent2.js', array(), null, true); // in footer
     743                wp_enqueue_script( 'parent3', '/parent3.js', array(), null, true, 0); // second in footer
     744
     745                $header = get_echo( 'wp_print_head_scripts' );
     746                $footer = get_echo( 'wp_print_footer_scripts' );
     747
     748                $expected_header  = "<script type='text/javascript' src='/child-head1.js'></script>\n";
     749                $expected_header .= "<script type='text/javascript' src='/child-head2.js'></script>\n";
     750                $expected_header .= "<script type='text/javascript' src='/child-head.js'></script>\n";
     751                $expected_footer  = "<script type='text/javascript' src='/parent1.js'></script>\n";
     752                $expected_footer .= "<script type='text/javascript' src='/parent3.js'></script>\n";
     753                $expected_footer .= "<script type='text/javascript' src='/child-footer.js'></script>\n";
     754                $expected_footer .= "<script type='text/javascript' src='/parent.js'></script>\n";
     755                $expected_footer .= "<script type='text/javascript' src='/parent2.js'></script>\n";
     756
     757                $this->assertEquals( $expected_header, $header );
     758                $this->assertEquals( $expected_footer, $footer );
     759        }
     760       
    727761}
  • tests/phpunit/tests/dependencies/styles.php

     
    3333                wp_enqueue_style('no-deps-version', 'example.com', array(), 1.2);
    3434                wp_enqueue_style('no-deps-null-version', 'example.com', array(), null);
    3535                wp_enqueue_style('no-deps-null-version-print-media', 'example.com', array(), null, 'print');
     36                wp_enqueue_style('no-deps-null-version-print-media-with-offset', 'example2.com', array(), null, 'print', 1);
     37               
    3638                $ver = get_bloginfo( 'version' );
    3739                $expected  = "<link rel='stylesheet' id='no-deps-no-version-css'  href='http://example.com?ver=$ver' type='text/css' media='all' />\n";
     40                $expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-with-offset-css'  href='http://example2.com' type='text/css' media='print' />\n";
    3841                $expected .= "<link rel='stylesheet' id='no-deps-version-css'  href='http://example.com?ver=1.2' type='text/css' media='all' />\n";
    3942                $expected .= "<link rel='stylesheet' id='no-deps-null-version-css'  href='http://example.com' type='text/css' media='all' />\n";
    4043                $expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-css'  href='http://example.com' type='text/css' media='print' />\n";