WordPress.org

Make WordPress Core

Ticket #36449: 36449.batch.patch

File 36449.batch.patch, 7.2 KB (added by gitlost, 5 years ago)

Demo of "batch" stuff for styles.

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

     
    6262         * @var string
    6363         */
    6464        public $concat = '';
     65        /**
     66         * If concatenating, holds arrays of data batched in dependency order.
     67         * 'concat' holds the handles to concatenate (comma-separated),
     68         * 'print_code' inline styles for handles in 'concat' (will be enclosed in '<style>' tags),
     69         * 'print_html' HTML markup of styles and additional data and inline styles not in 'print_code'.
     70         *
     71         * @since 4.5
     72         * @access public
     73         * @var array
     74         */
     75        public $concats = array( array( 'concat' => '', 'print_code' => '', 'print_html' => '' ) );
    6576
    6677        /**
    6778         * Holds a string which contains style handles and their version.
     
    8394        public $do_concat = false;
    8495
    8596        /**
    86          * Holds HTML markup of styles and additional data if concatenation
    87          * is enabled.
    88          *
    89          * @since 2.8.0
    90          * @access public
    91          * @var string
    92          */
    93         public $print_html = '';
    94 
    95         /**
    96          * Holds inline styles if concatenation is enabled.
    97          *
    98          * @since 3.3.0
    99          * @access public
    100          * @var string
    101          */
    102         public $print_code = '';
    103 
    104         /**
    10597         * List of default directories.
    10698         *
    10799         * @since 2.8.0
     
    152144                        $ver = $ver ? $ver . '&amp;' . $this->args[$handle] : $this->args[$handle];
    153145
    154146                if ( $this->do_concat ) {
    155                         if ( $this->in_default_dir($obj->src) && !isset($obj->extra['conditional']) && !isset($obj->extra['alt']) ) {
    156                                 $this->concat .= "$handle,";
     147
     148                        $in_default_dir = $this->in_default_dir( $obj->src );
     149
     150                        if ( $in_default_dir && ! isset( $obj->extra['conditional'] ) && ! isset( $obj->extra['alt'] ) ) {
     151                                $concat_idx = count( $this->concats ) - 1;
     152                                $this->concats[$concat_idx]['concat'] .= "$handle,";
     153                                $this->concats[$concat_idx]['print_code'] .= $this->print_inline_style( $handle, false );
    157154                                $this->concat_version .= "$handle$ver";
    158155
    159                                 $this->print_code .= $this->print_inline_style( $handle, false );
    160 
    161156                                return true;
    162157                        }
    163158                }
     
    172167                        if ( $inline_style = $this->print_inline_style( $handle, false ) ) {
    173168                                $inline_style = sprintf( "<style id='%s-inline-css' type='text/css'>\n%s\n</style>\n", esc_attr( $handle ), $inline_style );
    174169                                if ( $this->do_concat ) {
    175                                         $this->print_html .= $inline_style;
     170                                        $concat_idx = count( $this->concats ) - 1;
     171                                        $this->concats[$concat_idx]['print_html'] .= $inline_style;
    176172                                } else {
    177173                                        echo $inline_style;
    178174                                }
     
    226222                }
    227223
    228224                if ( $this->do_concat ) {
    229                         $this->print_html .= $conditional_pre;
    230                         $this->print_html .= $tag;
     225                        $concat_idx = count( $this->concats ) - 1;
     226                        $this->concats[$concat_idx]['print_html'] .= $conditional_pre;
     227                        $this->concats[$concat_idx]['print_html'] .= $tag;
    231228                        if ( $inline_style = $this->print_inline_style( $handle, false ) ) {
    232                                 $this->print_html .= sprintf( "<style id='%s-inline-css' type='text/css'>\n%s\n</style>\n", esc_attr( $handle ), $inline_style );
     229                                $this->concats[$concat_idx]['print_html'] .= sprintf( "<style id='%s-inline-css' type='text/css'>\n%s\n</style>\n", esc_attr( $handle ), $inline_style );
    233230                        }
    234                         $this->print_html .= $conditional_post;
     231                        $this->concats[$concat_idx]['print_html'] .= $conditional_post;
     232                        // To maintain dependency order, need to bump batch to next level if wasn't concatenated above.
     233                        if ( ! ( $in_default_dir && ! isset( $obj->extra['conditional'] ) && ! isset( $obj->extra['alt'] ) ) ) {
     234                                $this->concats[] = array( 'concat' => '', 'print_code' => '', 'print_html' => '' );
     235                        }
    235236                } else {
    236237                        echo $conditional_pre;
    237238                        echo $tag;
     
    400401         */
    401402        public function reset() {
    402403                $this->do_concat = false;
    403                 $this->concat = '';
     404                $this->concats = array( array( 'concat' => '', 'print_code' => '', 'print_html' => '' ) );
    404405                $this->concat_version = '';
    405                 $this->print_html = '';
    406406        }
    407407}
  • src/wp-includes/script-loader.php

     
    11661166        if ( $zip && defined('ENFORCE_GZIP') && ENFORCE_GZIP )
    11671167                $zip = 'gzip';
    11681168
    1169         if ( $concat = trim( $wp_styles->concat, ', ' ) ) {
    1170                 $dir = $wp_styles->text_direction;
    1171                 $ver = $wp_styles->default_version;
     1169        foreach ( $wp_styles->concats as $concat_entry ) {
     1170                $concat = trim( $concat_entry['concat'], ', ' );
     1171                if ( '' !== $concat ) {
     1172                        $dir = $wp_styles->text_direction;
     1173                        $ver = $wp_styles->default_version;
    11721174
    1173                 $concat = str_split( $concat, 128 );
    1174                 $concat = 'load%5B%5D=' . implode( '&load%5B%5D=', $concat );
     1175                        $concat = str_split( $concat, 128 );
     1176                        $concat = 'load%5B%5D=' . implode( '&load%5B%5D=', $concat );
    11751177
    1176                 $href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}&" . $concat . '&ver=' . $ver;
    1177                 echo "<link rel='stylesheet' href='" . esc_attr($href) . "' type='text/css' media='all' />\n";
     1178                        $href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}&" . $concat . '&ver=' . $ver;
     1179                        echo "<link rel='stylesheet' href='" . esc_attr($href) . "' type='text/css' media='all' />\n";
     1180                }
    11781181
    1179                 if ( !empty($wp_styles->print_code) ) {
     1182                if ( '' !== $concat_entry['print_code'] ) {
    11801183                        echo "<style type='text/css'>\n";
    1181                         echo $wp_styles->print_code;
     1184                        echo $concat_entry['print_code'];
    11821185                        echo "\n</style>\n";
    11831186                }
     1187
     1188                if ( '' !== $concat_entry['print_html'] ) {
     1189                        echo $concat_entry['print_html'];
     1190                }
    11841191        }
    1185 
    1186         if ( !empty($wp_styles->print_html) )
    1187                 echo $wp_styles->print_html;
    11881192}
    11891193
    11901194/**
  • tests/phpunit/tests/dependencies/styles.php

     
    136136                wp_add_inline_style( 'handle', $style );
    137137
    138138                wp_print_styles();
    139                 $this->assertEquals( $expected, $wp_styles->print_html );
     139                $print_styles = get_echo( '_print_styles' );
     140                $this->assertEquals( $expected, $print_styles );
    140141
    141142        }
    142143
     
    298299                        ),
    299300                );
    300301        }
     302
     303        /**
     304         * @ticket wp_style_conditional_concat_dependency
     305         */
     306        public function test_wp_style_conditional_concat_dependency() {
     307                global $wp_styles;
     308
     309                $wp_styles->do_concat = true;
     310                $wp_styles->default_dirs = array( '/directory/' );
     311                $wp_styles->default_version = 1;
     312
     313                wp_enqueue_style( 'one', '/directory/one.js', array(), 1 );
     314                wp_enqueue_style( 'two', '/directory/two.js', array(), 1 );
     315                wp_enqueue_style( 'three', '/directory/three.js', array( 'one' ), 1 );
     316
     317                wp_style_add_data( 'one', 'conditional', 'blah' );
     318
     319                $wp_print_styles = get_echo( 'wp_print_styles' );
     320                $print_styles = get_echo( '_print_styles' );
     321
     322                $expected  = "<!--[if blah]>\n";
     323                $expected .= "<link rel='stylesheet' id='one-css'  href='/directory/one.js?ver=1' type='text/css' media='all' />\n";
     324                $expected .= "<![endif]-->\n";
     325                $expected .= "<link rel='stylesheet' href='/wp-admin/load-styles.php?c=0&amp;dir=ltr&amp;load%5B%5D=two,three&amp;ver=1' type='text/css' media='all' />\n";
     326
     327                $this->assertEquals( $expected, $print_styles );
     328                $this->assertEquals( '', $wp_print_styles );
     329        }
    301330}