WordPress.org

Make WordPress Core

Ticket #22249: 22249-2.diff

File 22249-2.diff, 9.4 KB (added by jtsternberg, 6 years ago)

Modifications based on feedback from boonebgorges and jeremyfelt

  • src/wp-includes/functions.wp-scripts.php

    Property changes on: src
    ___________________________________________________________________
    Modified: svn:ignore
       - .wp-tests-version
    .htaccess
    
       + .wp-tests-version
    .htaccess
    wp-config.php
    
    
     
    6767 *                               to end of path as a query string. If no version is specified or set to false, a version
    6868 *                               number is automatically added equal to current installed WordPress version.
    6969 *                               If set to null, no version is added. Default 'false'. Accepts 'false', 'null', or 'string'.
    70  * @param bool        $in_footer Optional. Whether to enqueue the script before </head> or before </body>.
    71  *                               Default 'false'. Accepts 'false' or 'true'.
     70 * @param array       $args      Optional script arguments.
     71 * - bool  - in_footer  - Whether to enqueue the script before </head> or before </body>. Default 'false'. Accepts 'false' or 'true'.
     72 * - array - attributes - Array of script tag attributes. Default: array( 'type' => 'text/javascript' )
    7273 */
    73 function wp_register_script( $handle, $src, $deps = array(), $ver = false, $in_footer = false ) {
     74function wp_register_script( $handle, $src, $deps = array(), $ver = false, $args = array() ) {
    7475        global $wp_scripts;
     76
     77        // For back-compat. If it's not an array, convert to boolean.
     78        $args = ! is_array( $args ) ? array( 'in_footer' => (bool) $args ) : $args;
     79        $args = wp_parse_args( $args, array(
     80                'in_footer'  => false,
     81                'attributes' => array(),
     82        ) );
     83
     84        $attributes = wp_parse_args( $args['attributes'], array( 'type' => 'text/javascript' ) );
     85
    7586        if ( ! is_a( $wp_scripts, 'WP_Scripts' ) ) {
    7687                if ( ! did_action( 'init' ) )
    7788                        _doing_it_wrong( __FUNCTION__, sprintf( __( 'Scripts and styles should not be registered or enqueued until the %1$s, %2$s, or %3$s hooks.' ),
     
    7990                $wp_scripts = new WP_Scripts();
    8091        }
    8192
    82         $wp_scripts->add( $handle, $src, $deps, $ver );
    83         if ( $in_footer )
     93        $wp_scripts->add( $handle, $src, $deps, $ver, array( 'attributes' => $attributes ) );
     94        if ( $args['in_footer'] ) {
    8495                $wp_scripts->add_data( $handle, 'group', 1 );
     96        }
    8597}
    8698
    8799/**
     
    189201 * @param string|bool $ver       Optional. String specifying the script version number, if it has one. This parameter
    190202 *                               is used to ensure that the correct version is sent to the client regardless of caching,
    191203 *                               and so should be included if a version number is available and makes sense for the script.
    192  * @param bool        $in_footer Optional. Whether to enqueue the script before </head> or before </body>.
    193  *                               Default 'false'. Accepts 'false' or 'true'.
     204 * @param array       $args      Optional script arguments.
     205 * - bool  - in_footer  - Whether to enqueue the script before </head> or before </body>. Default 'false'. Accepts 'false' or 'true'.
     206 * - array - attributes - Array of script tag attributes. Default: array( 'type' => 'text/javascript' )
    194207 */
    195 function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) {
     208function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $args = array() ) {
    196209        global $wp_scripts;
     210
     211        // For back-compat. If it's not an array, convert to boolean.
     212        $args = ! is_array( $args ) ? array( 'in_footer' => (bool) $args ) : $args;
     213        $args = wp_parse_args( $args, array(
     214                'in_footer'  => false,
     215                'attributes' => array(),
     216        ) );
     217
     218        $attributes = wp_parse_args( $args['attributes'], array( 'type' => 'text/javascript' ) );
     219
    197220        if ( ! is_a( $wp_scripts, 'WP_Scripts' ) ) {
    198221                if ( ! did_action( 'init' ) )
    199222                        _doing_it_wrong( __FUNCTION__, sprintf( __( 'Scripts and styles should not be registered or enqueued until the %1$s, %2$s, or %3$s hooks.' ),
     
    203226
    204227        if ( $src ) {
    205228                $_handle = explode('?', $handle);
    206                 $wp_scripts->add( $_handle[0], $src, $deps, $ver );
    207                 if ( $in_footer )
     229                $wp_scripts->add( $_handle[0], $src, $deps, $ver, array( 'attributes' => $attributes ) );
     230                if ( $args['in_footer'] ) {
    208231                        $wp_scripts->add_data( $_handle[0], 'group', 1 );
     232                }
    209233        }
    210234        $wp_scripts->enqueue( $handle );
    211235}
  • src/wp-includes/class.wp-scripts.php

     
    8282        }
    8383
    8484        public function do_item( $handle, $group = false ) {
    85                 if ( !parent::do_item($handle) )
     85                if ( !parent::do_item( $handle ) ) {
    8686                        return false;
     87                }
    8788
    88                 if ( 0 === $group && $this->groups[$handle] > 0 ) {
     89                if ( 0 === $group && $this->groups[ $handle ] > 0 ) {
    8990                        $this->in_footer[] = $handle;
    9091                        return false;
    9192                }
    9293
    93                 if ( false === $group && in_array($handle, $this->in_footer, true) )
     94                if ( false === $group && in_array($handle, $this->in_footer, true) ) {
    9495                        $this->in_footer = array_diff( $this->in_footer, (array) $handle );
     96                }
    9597
    96                 if ( null === $this->registered[$handle]->ver )
     98                if ( null === $this->registered[ $handle ]->ver ) {
    9799                        $ver = '';
    98                 else
    99                         $ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version;
     100                } else {
     101                        $ver = $this->registered[ $handle ]->ver ? $this->registered[ $handle ]->ver : $this->default_version;
     102                }
    100103
    101                 if ( isset($this->args[$handle]) )
    102                         $ver = $ver ? $ver . '&amp;' . $this->args[$handle] : $this->args[$handle];
     104                if ( isset( $this->args[ $handle ] ) ) {
     105                        $ver = $ver ? $ver . '&amp;' . $this->args[ $handle ] : $this->args[ $handle ];
     106                }
    103107
    104                 $src = $this->registered[$handle]->src;
     108                $src = $this->registered[ $handle ]->src;
    105109
    106110                if ( $this->do_concat ) {
    107111                        /**
     
    113117                         * @param string $handle Script handle.
    114118                         */
    115119                        $srce = apply_filters( 'script_loader_src', $src, $handle );
    116                         if ( $this->in_default_dir($srce) ) {
     120                        if ( $this->in_default_dir( $srce ) ) {
    117121                                $this->print_code .= $this->print_extra_script( $handle, false );
    118122                                $this->concat .= "$handle,";
    119123                                $this->concat_version .= "$handle$ver";
     
    124128                        }
    125129                }
    126130
    127                 $this->print_extra_script( $handle );
    128                 if ( !preg_match('|^(https?:)?//|', $src) && ! ( $this->content_url && 0 === strpos($src, $this->content_url) ) ) {
    129                         $src = $this->base_url . $src;
     131                $this->print_extra_script( $handle );
     132                if ( !preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) {
     133                        $src = $this->base_url . $src;
     134                }
     135
     136                if ( !empty( $ver ) ) {
     137                        $src = add_query_arg( 'ver', $ver, $src );
    130138                }
    131139
    132                 if ( !empty($ver) )
    133                         $src = add_query_arg('ver', $ver, $src);
    134 
    135140                /** This filter is documented in wp-includes/class.wp-scripts.php */
    136141                $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) );
    137142
    138                 if ( ! $src )
     143                if ( ! $src ) {
    139144                        return true;
     145                }
    140146
    141                 $tag = "<script type='text/javascript' src='$src'></script>\n";
    142147
    143                 /**
     148                $attributes = $this->get_script_attributes( $handle, $src );
     149                $script_tag = "<script$attributes></script>\n";
     150
     151                /**
    144152                 * Filter the HTML script tag of an enqueued script.
    145153                 *
    146154                 * @since 4.1.0
    147155                 *
    148                  * @param string $tag    The `<script>` tag for the enqueued script.
    149                  * @param string $handle The script's registered handle.
    150                  * @param string $src    The script's source URL.
     156                 * @param string $script_tag The `<script>` tag for the enqueued script.
     157                 * @param string $handle     The script's registered handle.
     158                 * @param string $src        The script's source URL.
    151159                 */
    152                 $tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );
     160                $script_tag = apply_filters( 'script_loader_tag', $script_tag, $handle, $src );
    153161
    154162                if ( $this->do_concat ) {
    155                         $this->print_html .= $tag;
     163                        $this->print_html .= $script_tag;
    156164                } else {
    157                         echo $tag;
     165                        echo $script_tag;
    158166                }
    159167
    160                 return true;
     168                return true;
    161169        }
    162170
     171        /**
     172         * Concatenates attributes for the script tag
     173         *
     174         * @since  4.0.0
     175         *
     176         * @param  string $handle Script registered handle
     177         * @param  string $src    Script registered src
     178         *
     179         * @return string         Concatenated attributes string
     180         */
     181        public function get_script_attributes( $handle, $src ) {
     182
     183                $default_attributes = array(
     184                        'type' => 'text/javascript',
     185                        'src'  => $src
     186                );
     187
     188                $attributes = isset( $this->registered[ $handle ]->args['attributes'] )
     189                        ? (array) $this->registered[ $handle ]->args['attributes']
     190                        : array();
     191
     192                $attributes = wp_parse_args( $attributes, $default_attributes );
     193
     194                /**
     195                 * Filter the script loader attributes.
     196                 *
     197                 * @since 4.1.0
     198                 *
     199                 * @param array  $attributes Array of script tag attributes.
     200                 * @param string $handle     Script handle.
     201                 * @param string $src        Script loader source path.
     202                 */
     203                $attributes = apply_filters( 'script_loader_attributes', $attributes, $handle, $src );
     204                // Ensure source is set
     205                $attributes['src'] = isset( $attributes['src'] ) ? $attributes['src'] : $src;
     206
     207                $concat_attributes = '';
     208                foreach ( $attributes as $attribute => $attribute_value ) {
     209                        if ( ! is_null( $attribute ) && ! is_null( $attribute_value ) ) {
     210                                $concat_attributes .= ' '. esc_attr( $attribute ) .'="'. esc_attr( $attribute_value ) .'"';
     211                        }
     212                }
     213
     214                return $concat_attributes;
     215        }
     216
    163217        /**
    164218         * Localizes a script
    165219         *