WordPress.org

Make WordPress Core

Ticket #5003: 5003.diff

File 5003.diff, 4.1 KB (added by mdawaffe, 11 years ago)

replaced bad attachment

  • wp-includes/script-loader.php

     
    22class WP_Scripts {
    33        var $scripts = array();
    44        var $queue = array();
     5        var $to_print = array();
    56        var $printed = array();
    67        var $args = array();
    78
     
    154155         * @return array Scripts that have been printed
    155156         */
    156157        function print_scripts( $handles = false ) {
     158                global $wp_db_version;
     159
    157160                // Print the queue if nothing is passed.  If a string is passed, print that script.  If an array is passed, print those scripts.
    158161                $handles = false === $handles ? $this->queue : (array) $handles;
    159                 $handles = $this->all_deps( $handles );
    160                 $this->_print_scripts( $handles );
    161                 return $this->printed;
    162         }
     162                $this->all_deps( $handles );
    163163
    164         /**
    165          * Internally used helper function for printing script tags
    166          *
    167          * @param array handles Hierarchical array of scripts to be printed
    168          * @see WP_Scripts::all_deps()
    169          */
    170         function _print_scripts( $handles ) {
    171                 global $wp_db_version;
     164                $to_print = apply_filters( 'print_scripts_array', array_keys($this->to_print) );
    172165
    173                 foreach( array_keys($handles) as $handle ) {
    174                         if ( !$handles[$handle] )
    175                                 return;
    176                         elseif ( is_array($handles[$handle]) )
    177                                 $this->_print_scripts( $handles[$handle] );
     166                foreach( $to_print as $handle ) {
    178167                        if ( !in_array($handle, $this->printed) && isset($this->scripts[$handle]) ) {
    179168                                if ( $this->scripts[$handle]->src ) { // Else it defines a group.
    180169                                        $ver = $this->scripts[$handle]->ver ? $this->scripts[$handle]->ver : $wp_db_version;
     
    195184                                $this->printed[] = $handle;
    196185                        }
    197186                }
     187
     188                $this->to_print = array();
     189                return $this->printed;
    198190        }
    199191
    200192        function print_scripts_l10n( $handle ) {
     
    219211        /**
    220212         * Determines dependencies of scripts
    221213         *
    222          * Recursively builds hierarchical array of script dependencies.  Does NOT catch infinite loops.
     214         * Recursively builds array of scripts to print taking dependencies into account.  Does NOT catch infinite loops.
    223215         *
    224216         * @param mixed handles Accepts (string) script name or (array of strings) script names
    225217         * @param bool recursion Used internally when function calls itself
    226          * @return array Hierarchical array of dependencies
    227218         */
    228219        function all_deps( $handles, $recursion = false ) {
    229                 if ( ! $handles = (array) $handles )
    230                         return array();
    231                 $return = array();
     220                if ( !$handles = (array) $handles )
     221                        return false;
     222
    232223                foreach ( $handles as $handle ) {
    233224                        $handle = explode('?', $handle);
    234225                        if ( isset($handle[1]) )
    235226                                $this->args[$handle[0]] = $handle[1];
    236227                        $handle = $handle[0];
    237                         if ( is_null($return[$handle]) ) // Prime the return array with $handles
    238                                 $return[$handle] = true;
    239                         if ( $this->scripts[$handle]->deps ) {
    240                                 if ( false !== $return[$handle] && array_diff($this->scripts[$handle]->deps, array_keys($this->scripts)) )
    241                                         $return[$handle] = false; // Script required deps which don't exist
     228
     229                        if ( isset($this->to_print[$handle]) ) // Already grobbed it and its deps
     230                                continue;
     231
     232                        $keep_going = true;
     233                        if ( !isset($this->scripts[$handle]) )
     234                                $keep_going = false; // Script doesn't exist
     235                        elseif ( $this->scripts[$handle]->deps && array_diff($this->scripts[$handle]->deps, array_keys($this->scripts)) )
     236                                $keep_going = false; // Script requires deps which don't exist (not a necessary check.  efficiency?)
     237                        elseif ( $this->scripts[$handle]->deps && !$this->all_deps( $this->scripts[$handle]->deps, true ) )
     238                                $keep_going = false; // Script requires deps which don't exist
     239
     240                        if ( !$keep_going ) { // Either script or its deps don't exist.
     241                                if ( $recursion )
     242                                        return false; // Abort this branch.
    242243                                else
    243                                         $return[$handle] = $this->all_deps( $this->scripts[$handle]->deps, true ); // Build the hierarchy
    244                         }
    245                         if ( $recursion && false === $return[$handle] )
    246                                 return false; // Cut the branch
     244                                        continue; // We're at the top level.  Move on to the next one.
     245                        }                                       
     246
     247                        $this->to_print[$handle] = true;
    247248                }
    248                 return $return;
     249
     250                return true;
    249251        }
    250252
    251253        /**