script-loader.php (108457B)
1 <?php 2 /** 3 * WordPress scripts and styles default loader. 4 * 5 * Several constants are used to manage the loading, concatenating and compression of scripts and CSS: 6 * define('SCRIPT_DEBUG', true); loads the development (non-minified) versions of all scripts and CSS, and disables compression and concatenation, 7 * define('CONCATENATE_SCRIPTS', false); disables compression and concatenation of scripts and CSS, 8 * define('COMPRESS_SCRIPTS', false); disables compression of scripts, 9 * define('COMPRESS_CSS', false); disables compression of CSS, 10 * define('ENFORCE_GZIP', true); forces gzip for compression (default is deflate). 11 * 12 * The globals $concatenate_scripts, $compress_scripts and $compress_css can be set by plugins 13 * to temporarily override the above settings. Also a compression test is run once and the result is saved 14 * as option 'can_compress_scripts' (0/1). The test will run again if that option is deleted. 15 * 16 * @package WordPress 17 */ 18 19 /** WordPress Dependency Class */ 20 require ABSPATH . WPINC . '/class-wp-dependency.php'; 21 22 /** WordPress Dependencies Class */ 23 require ABSPATH . WPINC . '/class.wp-dependencies.php'; 24 25 /** WordPress Scripts Class */ 26 require ABSPATH . WPINC . '/class.wp-scripts.php'; 27 28 /** WordPress Scripts Functions */ 29 require ABSPATH . WPINC . '/functions.wp-scripts.php'; 30 31 /** WordPress Styles Class */ 32 require ABSPATH . WPINC . '/class.wp-styles.php'; 33 34 /** WordPress Styles Functions */ 35 require ABSPATH . WPINC . '/functions.wp-styles.php'; 36 37 /** 38 * Registers TinyMCE scripts. 39 * 40 * @since 5.0.0 41 * 42 * @param WP_Scripts $scripts WP_Scripts object. 43 * @param bool $force_uncompressed Whether to forcibly prevent gzip compression. Default false. 44 */ 45 function wp_register_tinymce_scripts( $scripts, $force_uncompressed = false ) { 46 global $tinymce_version, $concatenate_scripts, $compress_scripts; 47 $suffix = wp_scripts_get_suffix(); 48 $dev_suffix = wp_scripts_get_suffix( 'dev' ); 49 50 script_concat_settings(); 51 52 $compressed = $compress_scripts && $concatenate_scripts && isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) 53 && false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && ! $force_uncompressed; 54 55 // Load tinymce.js when running from /src, otherwise load wp-tinymce.js.gz (in production) 56 // or tinymce.min.js (when SCRIPT_DEBUG is true). 57 if ( $compressed ) { 58 $scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . 'wp-tinymce.js', array(), $tinymce_version ); 59 } else { 60 $scripts->add( 'wp-tinymce-root', includes_url( 'js/tinymce/' ) . "tinymce$dev_suffix.js", array(), $tinymce_version ); 61 $scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . "plugins/compat3x/plugin$dev_suffix.js", array( 'wp-tinymce-root' ), $tinymce_version ); 62 } 63 64 $scripts->add( 'wp-tinymce-lists', includes_url( "js/tinymce/plugins/lists/plugin$suffix.js" ), array( 'wp-tinymce' ), $tinymce_version ); 65 } 66 67 /** 68 * Registers all the WordPress vendor scripts that are in the standardized 69 * `js/dist/vendor/` location. 70 * 71 * For the order of `$scripts->add` see `wp_default_scripts`. 72 * 73 * @since 5.0.0 74 * 75 * @param WP_Scripts $scripts WP_Scripts object. 76 */ 77 function wp_default_packages_vendor( $scripts ) { 78 global $wp_locale; 79 80 $suffix = wp_scripts_get_suffix(); 81 82 $vendor_scripts = array( 83 'react' => array( 'wp-polyfill' ), 84 'react-dom' => array( 'react' ), 85 'regenerator-runtime', 86 'moment', 87 'lodash', 88 'wp-polyfill-fetch', 89 'wp-polyfill-formdata', 90 'wp-polyfill-node-contains', 91 'wp-polyfill-url', 92 'wp-polyfill-dom-rect', 93 'wp-polyfill-element-closest', 94 'wp-polyfill-object-fit', 95 'wp-polyfill' => array( 'regenerator-runtime' ), 96 ); 97 98 $vendor_scripts_versions = array( 99 'react' => '16.13.1', 100 'react-dom' => '16.13.1', 101 'regenerator-runtime' => '0.13.7', 102 'moment' => '2.29.1', 103 'lodash' => '4.17.19', 104 'wp-polyfill-fetch' => '3.0.0', 105 'wp-polyfill-formdata' => '4.0.0', 106 'wp-polyfill-node-contains' => '3.105.0', 107 'wp-polyfill-url' => '3.6.4', 108 'wp-polyfill-dom-rect' => '3.104.0', 109 'wp-polyfill-element-closest' => '2.0.2', 110 'wp-polyfill-object-fit' => '2.3.5', 111 'wp-polyfill' => '3.15.0', 112 ); 113 114 foreach ( $vendor_scripts as $handle => $dependencies ) { 115 if ( is_string( $dependencies ) ) { 116 $handle = $dependencies; 117 $dependencies = array(); 118 } 119 120 $path = "/wp-includes/js/dist/vendor/$handle$suffix.js"; 121 $version = $vendor_scripts_versions[ $handle ]; 122 123 $scripts->add( $handle, $path, $dependencies, $version, 1 ); 124 } 125 126 did_action( 'init' ) && $scripts->add_inline_script( 'lodash', 'window.lodash = _.noConflict();' ); 127 128 did_action( 'init' ) && $scripts->add_inline_script( 129 'moment', 130 sprintf( 131 "moment.updateLocale( '%s', %s );", 132 get_user_locale(), 133 wp_json_encode( 134 array( 135 'months' => array_values( $wp_locale->month ), 136 'monthsShort' => array_values( $wp_locale->month_abbrev ), 137 'weekdays' => array_values( $wp_locale->weekday ), 138 'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ), 139 'week' => array( 140 'dow' => (int) get_option( 'start_of_week', 0 ), 141 ), 142 'longDateFormat' => array( 143 'LT' => get_option( 'time_format', __( 'g:i a' ) ), 144 'LTS' => null, 145 'L' => null, 146 'LL' => get_option( 'date_format', __( 'F j, Y' ) ), 147 'LLL' => __( 'F j, Y g:i a' ), 148 'LLLL' => null, 149 ), 150 ) 151 ) 152 ), 153 'after' 154 ); 155 } 156 157 /** 158 * Returns contents of an inline script used in appending polyfill scripts for 159 * browsers which fail the provided tests. The provided array is a mapping from 160 * a condition to verify feature support to its polyfill script handle. 161 * 162 * @since 5.0.0 163 * 164 * @param WP_Scripts $scripts WP_Scripts object. 165 * @param array $tests Features to detect. 166 * @return string Conditional polyfill inline script. 167 */ 168 function wp_get_script_polyfill( $scripts, $tests ) { 169 $polyfill = ''; 170 foreach ( $tests as $test => $handle ) { 171 if ( ! array_key_exists( $handle, $scripts->registered ) ) { 172 continue; 173 } 174 175 $src = $scripts->registered[ $handle ]->src; 176 $ver = $scripts->registered[ $handle ]->ver; 177 178 if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $scripts->content_url && 0 === strpos( $src, $scripts->content_url ) ) ) { 179 $src = $scripts->base_url . $src; 180 } 181 182 if ( ! empty( $ver ) ) { 183 $src = add_query_arg( 'ver', $ver, $src ); 184 } 185 186 /** This filter is documented in wp-includes/class.wp-scripts.php */ 187 $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) ); 188 189 if ( ! $src ) { 190 continue; 191 } 192 193 $polyfill .= ( 194 // Test presence of feature... 195 '( ' . $test . ' ) || ' . 196 /* 197 * ...appending polyfill on any failures. Cautious viewers may balk 198 * at the `document.write`. Its caveat of synchronous mid-stream 199 * blocking write is exactly the behavior we need though. 200 */ 201 'document.write( \'<script src="' . 202 $src . 203 '"></scr\' + \'ipt>\' );' 204 ); 205 } 206 207 return $polyfill; 208 } 209 210 /** 211 * Registers all the WordPress packages scripts that are in the standardized 212 * `js/dist/` location. 213 * 214 * For the order of `$scripts->add` see `wp_default_scripts`. 215 * 216 * @since 5.0.0 217 * 218 * @param WP_Scripts $scripts WP_Scripts object. 219 */ 220 function wp_default_packages_scripts( $scripts ) { 221 $suffix = wp_scripts_get_suffix(); 222 223 // Expects multidimensional array like: 224 // 'a11y.js' => array('dependencies' => array(...), 'version' => '...'), 225 // 'annotations.js' => array('dependencies' => array(...), 'version' => '...'), 226 // 'api-fetch.js' => array(... 227 $assets = include ABSPATH . WPINC . '/assets/script-loader-packages.php'; 228 229 foreach ( $assets as $package_name => $package_data ) { 230 $basename = basename( $package_name, '.js' ); 231 $handle = 'wp-' . $basename; 232 $path = "/wp-includes/js/dist/{$basename}{$suffix}.js"; 233 234 if ( ! empty( $package_data['dependencies'] ) ) { 235 $dependencies = $package_data['dependencies']; 236 } else { 237 $dependencies = array(); 238 } 239 240 // Add dependencies that cannot be detected and generated by build tools. 241 switch ( $handle ) { 242 case 'wp-block-library': 243 array_push( $dependencies, 'editor' ); 244 break; 245 case 'wp-edit-post': 246 array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' ); 247 break; 248 } 249 250 $scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 ); 251 252 if ( in_array( 'wp-i18n', $dependencies, true ) ) { 253 $scripts->set_translations( $handle ); 254 } 255 256 /* 257 * Manually set the text direction localization after wp-i18n is printed. 258 * This ensures that wp.i18n.isRTL() returns true in RTL languages. 259 * We cannot use $scripts->set_translations( 'wp-i18n' ) to do this 260 * because WordPress prints a script's translations *before* the script, 261 * which means, in the case of wp-i18n, that wp.i18n.setLocaleData() 262 * is called before wp.i18n is defined. 263 */ 264 if ( 'wp-i18n' === $handle ) { 265 $ltr = _x( 'ltr', 'text direction' ); 266 $script = sprintf( "wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ '%s' ] } );", $ltr ); 267 $scripts->add_inline_script( $handle, $script, 'after' ); 268 } 269 } 270 } 271 272 /** 273 * Adds inline scripts required for the WordPress JavaScript packages. 274 * 275 * @since 5.0.0 276 * 277 * @param WP_Scripts $scripts WP_Scripts object. 278 */ 279 function wp_default_packages_inline_scripts( $scripts ) { 280 global $wp_locale; 281 282 if ( isset( $scripts->registered['wp-api-fetch'] ) ) { 283 $scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks'; 284 } 285 $scripts->add_inline_script( 286 'wp-api-fetch', 287 sprintf( 288 'wp.apiFetch.use( wp.apiFetch.createRootURLMiddleware( "%s" ) );', 289 esc_url_raw( get_rest_url() ) 290 ), 291 'after' 292 ); 293 $scripts->add_inline_script( 294 'wp-api-fetch', 295 implode( 296 "\n", 297 array( 298 sprintf( 299 'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );', 300 ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ) 301 ), 302 'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );', 303 'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );', 304 sprintf( 305 'wp.apiFetch.nonceEndpoint = "%s";', 306 admin_url( 'admin-ajax.php?action=rest-nonce' ) 307 ), 308 ) 309 ), 310 'after' 311 ); 312 $scripts->add_inline_script( 313 'wp-data', 314 implode( 315 "\n", 316 array( 317 '( function() {', 318 ' var userId = ' . get_current_user_ID() . ';', 319 ' var storageKey = "WP_DATA_USER_" + userId;', 320 ' wp.data', 321 ' .use( wp.data.plugins.persistence, { storageKey: storageKey } );', 322 ' wp.data.plugins.persistence.__unstableMigrate( { storageKey: storageKey } );', 323 '} )();', 324 ) 325 ) 326 ); 327 328 // Calculate the timezone abbr (EDT, PST) if possible. 329 $timezone_string = get_option( 'timezone_string', 'UTC' ); 330 $timezone_abbr = ''; 331 332 if ( ! empty( $timezone_string ) ) { 333 $timezone_date = new DateTime( null, new DateTimeZone( $timezone_string ) ); 334 $timezone_abbr = $timezone_date->format( 'T' ); 335 } 336 337 $scripts->add_inline_script( 338 'wp-date', 339 sprintf( 340 'wp.date.setSettings( %s );', 341 wp_json_encode( 342 array( 343 'l10n' => array( 344 'locale' => get_user_locale(), 345 'months' => array_values( $wp_locale->month ), 346 'monthsShort' => array_values( $wp_locale->month_abbrev ), 347 'weekdays' => array_values( $wp_locale->weekday ), 348 'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ), 349 'meridiem' => (object) $wp_locale->meridiem, 350 'relative' => array( 351 /* translators: %s: Duration. */ 352 'future' => __( '%s from now' ), 353 /* translators: %s: Duration. */ 354 'past' => __( '%s ago' ), 355 ), 356 ), 357 'formats' => array( 358 /* translators: Time format, see https://www.php.net/manual/datetime.format.php */ 359 'time' => get_option( 'time_format', __( 'g:i a' ) ), 360 /* translators: Date format, see https://www.php.net/manual/datetime.format.php */ 361 'date' => get_option( 'date_format', __( 'F j, Y' ) ), 362 /* translators: Date/Time format, see https://www.php.net/manual/datetime.format.php */ 363 'datetime' => __( 'F j, Y g:i a' ), 364 /* translators: Abbreviated date/time format, see https://www.php.net/manual/datetime.format.php */ 365 'datetimeAbbreviated' => __( 'M j, Y g:i a' ), 366 ), 367 'timezone' => array( 368 'offset' => get_option( 'gmt_offset', 0 ), 369 'string' => $timezone_string, 370 'abbr' => $timezone_abbr, 371 ), 372 ) 373 ) 374 ), 375 'after' 376 ); 377 378 // Loading the old editor and its config to ensure the classic block works as expected. 379 $scripts->add_inline_script( 380 'editor', 381 'window.wp.oldEditor = window.wp.editor;', 382 'after' 383 ); 384 385 /* 386 * wp-editor module is exposed as window.wp.editor. 387 * Problem: there is quite some code expecting window.wp.oldEditor object available under window.wp.editor. 388 * Solution: fuse the two objects together to maintain backward compatibility. 389 * For more context, see https://github.com/WordPress/gutenberg/issues/33203. 390 */ 391 $scripts->add_inline_script( 392 'wp-editor', 393 'Object.assign( window.wp.editor, window.wp.oldEditor );', 394 'after' 395 ); 396 } 397 398 /** 399 * Adds inline scripts required for the TinyMCE in the block editor. 400 * 401 * These TinyMCE init settings are used to extend and override the default settings 402 * from `_WP_Editors::default_settings()` for the Classic block. 403 * 404 * @since 5.0.0 405 * 406 * @global WP_Scripts $wp_scripts 407 */ 408 function wp_tinymce_inline_scripts() { 409 global $wp_scripts; 410 411 /** This filter is documented in wp-includes/class-wp-editor.php */ 412 $editor_settings = apply_filters( 'wp_editor_settings', array( 'tinymce' => true ), 'classic-block' ); 413 414 $tinymce_plugins = array( 415 'charmap', 416 'colorpicker', 417 'hr', 418 'lists', 419 'media', 420 'paste', 421 'tabfocus', 422 'textcolor', 423 'fullscreen', 424 'wordpress', 425 'wpautoresize', 426 'wpeditimage', 427 'wpemoji', 428 'wpgallery', 429 'wplink', 430 'wpdialogs', 431 'wptextpattern', 432 'wpview', 433 ); 434 435 /** This filter is documented in wp-includes/class-wp-editor.php */ 436 $tinymce_plugins = apply_filters( 'tiny_mce_plugins', $tinymce_plugins, 'classic-block' ); 437 $tinymce_plugins = array_unique( $tinymce_plugins ); 438 439 $disable_captions = false; 440 // Runs after `tiny_mce_plugins` but before `mce_buttons`. 441 /** This filter is documented in wp-admin/includes/media.php */ 442 if ( apply_filters( 'disable_captions', '' ) ) { 443 $disable_captions = true; 444 } 445 446 $toolbar1 = array( 447 'formatselect', 448 'bold', 449 'italic', 450 'bullist', 451 'numlist', 452 'blockquote', 453 'alignleft', 454 'aligncenter', 455 'alignright', 456 'link', 457 'unlink', 458 'wp_more', 459 'spellchecker', 460 'wp_add_media', 461 'wp_adv', 462 ); 463 464 /** This filter is documented in wp-includes/class-wp-editor.php */ 465 $toolbar1 = apply_filters( 'mce_buttons', $toolbar1, 'classic-block' ); 466 467 $toolbar2 = array( 468 'strikethrough', 469 'hr', 470 'forecolor', 471 'pastetext', 472 'removeformat', 473 'charmap', 474 'outdent', 475 'indent', 476 'undo', 477 'redo', 478 'wp_help', 479 ); 480 481 /** This filter is documented in wp-includes/class-wp-editor.php */ 482 $toolbar2 = apply_filters( 'mce_buttons_2', $toolbar2, 'classic-block' ); 483 /** This filter is documented in wp-includes/class-wp-editor.php */ 484 $toolbar3 = apply_filters( 'mce_buttons_3', array(), 'classic-block' ); 485 /** This filter is documented in wp-includes/class-wp-editor.php */ 486 $toolbar4 = apply_filters( 'mce_buttons_4', array(), 'classic-block' ); 487 /** This filter is documented in wp-includes/class-wp-editor.php */ 488 $external_plugins = apply_filters( 'mce_external_plugins', array(), 'classic-block' ); 489 490 $tinymce_settings = array( 491 'plugins' => implode( ',', $tinymce_plugins ), 492 'toolbar1' => implode( ',', $toolbar1 ), 493 'toolbar2' => implode( ',', $toolbar2 ), 494 'toolbar3' => implode( ',', $toolbar3 ), 495 'toolbar4' => implode( ',', $toolbar4 ), 496 'external_plugins' => wp_json_encode( $external_plugins ), 497 'classic_block_editor' => true, 498 ); 499 500 if ( $disable_captions ) { 501 $tinymce_settings['wpeditimage_disable_captions'] = true; 502 } 503 504 if ( ! empty( $editor_settings['tinymce'] ) && is_array( $editor_settings['tinymce'] ) ) { 505 array_merge( $tinymce_settings, $editor_settings['tinymce'] ); 506 } 507 508 /** This filter is documented in wp-includes/class-wp-editor.php */ 509 $tinymce_settings = apply_filters( 'tiny_mce_before_init', $tinymce_settings, 'classic-block' ); 510 511 // Do "by hand" translation from PHP array to js object. 512 // Prevents breakage in some custom settings. 513 $init_obj = ''; 514 foreach ( $tinymce_settings as $key => $value ) { 515 if ( is_bool( $value ) ) { 516 $val = $value ? 'true' : 'false'; 517 $init_obj .= $key . ':' . $val . ','; 518 continue; 519 } elseif ( ! empty( $value ) && is_string( $value ) && ( 520 ( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) || 521 ( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) || 522 preg_match( '/^\(?function ?\(/', $value ) ) ) { 523 $init_obj .= $key . ':' . $value . ','; 524 continue; 525 } 526 $init_obj .= $key . ':"' . $value . '",'; 527 } 528 529 $init_obj = '{' . trim( $init_obj, ' ,' ) . '}'; 530 531 $script = 'window.wpEditorL10n = { 532 tinymce: { 533 baseURL: ' . wp_json_encode( includes_url( 'js/tinymce' ) ) . ', 534 suffix: ' . ( SCRIPT_DEBUG ? '""' : '".min"' ) . ', 535 settings: ' . $init_obj . ', 536 } 537 }'; 538 539 $wp_scripts->add_inline_script( 'wp-block-library', $script, 'before' ); 540 } 541 542 /** 543 * Registers all the WordPress packages scripts. 544 * 545 * @since 5.0.0 546 * 547 * @param WP_Scripts $scripts WP_Scripts object. 548 */ 549 function wp_default_packages( $scripts ) { 550 wp_default_packages_vendor( $scripts ); 551 wp_register_tinymce_scripts( $scripts ); 552 wp_default_packages_scripts( $scripts ); 553 554 if ( did_action( 'init' ) ) { 555 wp_default_packages_inline_scripts( $scripts ); 556 } 557 } 558 559 /** 560 * Returns the suffix that can be used for the scripts. 561 * 562 * There are two suffix types, the normal one and the dev suffix. 563 * 564 * @since 5.0.0 565 * 566 * @param string $type The type of suffix to retrieve. 567 * @return string The script suffix. 568 */ 569 function wp_scripts_get_suffix( $type = '' ) { 570 static $suffixes; 571 572 if ( null === $suffixes ) { 573 // Include an unmodified $wp_version. 574 require ABSPATH . WPINC . '/version.php'; 575 576 $develop_src = false !== strpos( $wp_version, '-src' ); 577 578 if ( ! defined( 'SCRIPT_DEBUG' ) ) { 579 define( 'SCRIPT_DEBUG', $develop_src ); 580 } 581 $suffix = SCRIPT_DEBUG ? '' : '.min'; 582 $dev_suffix = $develop_src ? '' : '.min'; 583 584 $suffixes = array( 585 'suffix' => $suffix, 586 'dev_suffix' => $dev_suffix, 587 ); 588 } 589 590 if ( 'dev' === $type ) { 591 return $suffixes['dev_suffix']; 592 } 593 594 return $suffixes['suffix']; 595 } 596 597 /** 598 * Register all WordPress scripts. 599 * 600 * Localizes some of them. 601 * args order: `$scripts->add( 'handle', 'url', 'dependencies', 'query-string', 1 );` 602 * when last arg === 1 queues the script for the footer 603 * 604 * @since 2.6.0 605 * 606 * @param WP_Scripts $scripts WP_Scripts object. 607 */ 608 function wp_default_scripts( $scripts ) { 609 $suffix = wp_scripts_get_suffix(); 610 $dev_suffix = wp_scripts_get_suffix( 'dev' ); 611 $guessurl = site_url(); 612 613 if ( ! $guessurl ) { 614 $guessed_url = true; 615 $guessurl = wp_guess_url(); 616 } 617 618 $scripts->base_url = $guessurl; 619 $scripts->content_url = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : ''; 620 $scripts->default_version = get_bloginfo( 'version' ); 621 $scripts->default_dirs = array( '/wp-admin/js/', '/wp-includes/js/' ); 622 623 $scripts->add( 'utils', "/wp-includes/js/utils$suffix.js" ); 624 did_action( 'init' ) && $scripts->localize( 625 'utils', 626 'userSettings', 627 array( 628 'url' => (string) SITECOOKIEPATH, 629 'uid' => (string) get_current_user_id(), 630 'time' => (string) time(), 631 'secure' => (string) ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) ), 632 ) 633 ); 634 635 $scripts->add( 'common', "/wp-admin/js/common$suffix.js", array( 'jquery', 'hoverIntent', 'utils' ), false, 1 ); 636 $scripts->set_translations( 'common' ); 637 638 $scripts->add( 'wp-sanitize', "/wp-includes/js/wp-sanitize$suffix.js", array(), false, 1 ); 639 640 $scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", array(), '1.6.1', 1 ); 641 642 $scripts->add( 'quicktags', "/wp-includes/js/quicktags$suffix.js", array(), false, 1 ); 643 did_action( 'init' ) && $scripts->localize( 644 'quicktags', 645 'quicktagsL10n', 646 array( 647 'closeAllOpenTags' => __( 'Close all open tags' ), 648 'closeTags' => __( 'close tags' ), 649 'enterURL' => __( 'Enter the URL' ), 650 'enterImageURL' => __( 'Enter the URL of the image' ), 651 'enterImageDescription' => __( 'Enter a description of the image' ), 652 'textdirection' => __( 'text direction' ), 653 'toggleTextdirection' => __( 'Toggle Editor Text Direction' ), 654 'dfw' => __( 'Distraction-free writing mode' ), 655 'strong' => __( 'Bold' ), 656 'strongClose' => __( 'Close bold tag' ), 657 'em' => __( 'Italic' ), 658 'emClose' => __( 'Close italic tag' ), 659 'link' => __( 'Insert link' ), 660 'blockquote' => __( 'Blockquote' ), 661 'blockquoteClose' => __( 'Close blockquote tag' ), 662 'del' => __( 'Deleted text (strikethrough)' ), 663 'delClose' => __( 'Close deleted text tag' ), 664 'ins' => __( 'Inserted text' ), 665 'insClose' => __( 'Close inserted text tag' ), 666 'image' => __( 'Insert image' ), 667 'ul' => __( 'Bulleted list' ), 668 'ulClose' => __( 'Close bulleted list tag' ), 669 'ol' => __( 'Numbered list' ), 670 'olClose' => __( 'Close numbered list tag' ), 671 'li' => __( 'List item' ), 672 'liClose' => __( 'Close list item tag' ), 673 'code' => __( 'Code' ), 674 'codeClose' => __( 'Close code tag' ), 675 'more' => __( 'Insert Read More tag' ), 676 ) 677 ); 678 679 $scripts->add( 'colorpicker', "/wp-includes/js/colorpicker$suffix.js", array( 'prototype' ), '3517m' ); 680 681 $scripts->add( 'editor', "/wp-admin/js/editor$suffix.js", array( 'utils', 'jquery' ), false, 1 ); 682 683 $scripts->add( 'clipboard', "/wp-includes/js/clipboard$suffix.js", array(), false, 1 ); 684 685 $scripts->add( 'wp-ajax-response', "/wp-includes/js/wp-ajax-response$suffix.js", array( 'jquery' ), false, 1 ); 686 did_action( 'init' ) && $scripts->localize( 687 'wp-ajax-response', 688 'wpAjax', 689 array( 690 'noPerm' => __( 'Sorry, you are not allowed to do that.' ), 691 'broken' => __( 'Something went wrong.' ), 692 ) 693 ); 694 695 $scripts->add( 'wp-api-request', "/wp-includes/js/api-request$suffix.js", array( 'jquery' ), false, 1 ); 696 // `wpApiSettings` is also used by `wp-api`, which depends on this script. 697 did_action( 'init' ) && $scripts->localize( 698 'wp-api-request', 699 'wpApiSettings', 700 array( 701 'root' => esc_url_raw( get_rest_url() ), 702 'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), 703 'versionString' => 'wp/v2/', 704 ) 705 ); 706 707 $scripts->add( 'wp-pointer', "/wp-includes/js/wp-pointer$suffix.js", array( 'jquery-ui-core' ), false, 1 ); 708 $scripts->set_translations( 'wp-pointer' ); 709 710 $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array( 'heartbeat' ), false, 1 ); 711 712 $scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array( 'jquery', 'wp-hooks' ), false, 1 ); 713 did_action( 'init' ) && $scripts->localize( 714 'heartbeat', 715 'heartbeatSettings', 716 /** 717 * Filters the Heartbeat settings. 718 * 719 * @since 3.6.0 720 * 721 * @param array $settings Heartbeat settings array. 722 */ 723 apply_filters( 'heartbeat_settings', array() ) 724 ); 725 726 $scripts->add( 'wp-auth-check', "/wp-includes/js/wp-auth-check$suffix.js", array( 'heartbeat' ), false, 1 ); 727 $scripts->set_translations( 'wp-auth-check' ); 728 729 $scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 ); 730 731 // WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source. 732 $scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1' ); 733 $scripts->add( 'scriptaculous-root', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js', array( 'prototype' ), '1.9.0' ); 734 $scripts->add( 'scriptaculous-builder', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/builder.js', array( 'scriptaculous-root' ), '1.9.0' ); 735 $scripts->add( 'scriptaculous-dragdrop', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/dragdrop.js', array( 'scriptaculous-builder', 'scriptaculous-effects' ), '1.9.0' ); 736 $scripts->add( 'scriptaculous-effects', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/effects.js', array( 'scriptaculous-root' ), '1.9.0' ); 737 $scripts->add( 'scriptaculous-slider', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/slider.js', array( 'scriptaculous-effects' ), '1.9.0' ); 738 $scripts->add( 'scriptaculous-sound', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/sound.js', array( 'scriptaculous-root' ), '1.9.0' ); 739 $scripts->add( 'scriptaculous-controls', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/controls.js', array( 'scriptaculous-root' ), '1.9.0' ); 740 $scripts->add( 'scriptaculous', false, array( 'scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls' ) ); 741 742 // Not used in core, replaced by Jcrop.js. 743 $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array( 'scriptaculous-dragdrop' ) ); 744 745 // jQuery. 746 // The unminified jquery.js and jquery-migrate.js are included to facilitate debugging. 747 $scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '3.6.0' ); 748 $scripts->add( 'jquery-core', "/wp-includes/js/jquery/jquery$suffix.js", array(), '3.6.0' ); 749 $scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '3.3.2' ); 750 751 // Full jQuery UI. 752 // The build process in 1.12.1 has changed significantly. 753 // In order to keep backwards compatibility, and to keep the optimized loading, 754 // the source files were flattened and included with some modifications for AMD loading. 755 // A notable change is that 'jquery-ui-core' now contains 'jquery-ui-position' and 'jquery-ui-widget'. 756 $scripts->add( 'jquery-ui-core', "/wp-includes/js/jquery/ui/core$suffix.js", array( 'jquery' ), '1.12.1', 1 ); 757 $scripts->add( 'jquery-effects-core', "/wp-includes/js/jquery/ui/effect$suffix.js", array( 'jquery' ), '1.12.1', 1 ); 758 759 $scripts->add( 'jquery-effects-blind', "/wp-includes/js/jquery/ui/effect-blind$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 760 $scripts->add( 'jquery-effects-bounce', "/wp-includes/js/jquery/ui/effect-bounce$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 761 $scripts->add( 'jquery-effects-clip', "/wp-includes/js/jquery/ui/effect-clip$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 762 $scripts->add( 'jquery-effects-drop', "/wp-includes/js/jquery/ui/effect-drop$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 763 $scripts->add( 'jquery-effects-explode', "/wp-includes/js/jquery/ui/effect-explode$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 764 $scripts->add( 'jquery-effects-fade', "/wp-includes/js/jquery/ui/effect-fade$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 765 $scripts->add( 'jquery-effects-fold', "/wp-includes/js/jquery/ui/effect-fold$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 766 $scripts->add( 'jquery-effects-highlight', "/wp-includes/js/jquery/ui/effect-highlight$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 767 $scripts->add( 'jquery-effects-puff', "/wp-includes/js/jquery/ui/effect-puff$suffix.js", array( 'jquery-effects-core', 'jquery-effects-scale' ), '1.12.1', 1 ); 768 $scripts->add( 'jquery-effects-pulsate', "/wp-includes/js/jquery/ui/effect-pulsate$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 769 $scripts->add( 'jquery-effects-scale', "/wp-includes/js/jquery/ui/effect-scale$suffix.js", array( 'jquery-effects-core', 'jquery-effects-size' ), '1.12.1', 1 ); 770 $scripts->add( 'jquery-effects-shake', "/wp-includes/js/jquery/ui/effect-shake$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 771 $scripts->add( 'jquery-effects-size', "/wp-includes/js/jquery/ui/effect-size$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 772 $scripts->add( 'jquery-effects-slide', "/wp-includes/js/jquery/ui/effect-slide$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 773 $scripts->add( 'jquery-effects-transfer', "/wp-includes/js/jquery/ui/effect-transfer$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 ); 774 775 // Widgets 776 $scripts->add( 'jquery-ui-accordion', "/wp-includes/js/jquery/ui/accordion$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 777 $scripts->add( 'jquery-ui-autocomplete', "/wp-includes/js/jquery/ui/autocomplete$suffix.js", array( 'jquery-ui-menu', 'wp-a11y' ), '1.12.1', 1 ); 778 $scripts->add( 'jquery-ui-button', "/wp-includes/js/jquery/ui/button$suffix.js", array( 'jquery-ui-core', 'jquery-ui-controlgroup', 'jquery-ui-checkboxradio' ), '1.12.1', 1 ); 779 $scripts->add( 'jquery-ui-datepicker', "/wp-includes/js/jquery/ui/datepicker$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 780 $scripts->add( 'jquery-ui-dialog', "/wp-includes/js/jquery/ui/dialog$suffix.js", array( 'jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button' ), '1.12.1', 1 ); 781 $scripts->add( 'jquery-ui-menu', "/wp-includes/js/jquery/ui/menu$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 782 $scripts->add( 'jquery-ui-mouse', "/wp-includes/js/jquery/ui/mouse$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 783 $scripts->add( 'jquery-ui-progressbar', "/wp-includes/js/jquery/ui/progressbar$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 784 $scripts->add( 'jquery-ui-selectmenu', "/wp-includes/js/jquery/ui/selectmenu$suffix.js", array( 'jquery-ui-menu' ), '1.12.1', 1 ); 785 $scripts->add( 'jquery-ui-slider', "/wp-includes/js/jquery/ui/slider$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 ); 786 $scripts->add( 'jquery-ui-spinner', "/wp-includes/js/jquery/ui/spinner$suffix.js", array( 'jquery-ui-button' ), '1.12.1', 1 ); 787 $scripts->add( 'jquery-ui-tabs', "/wp-includes/js/jquery/ui/tabs$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 788 $scripts->add( 'jquery-ui-tooltip', "/wp-includes/js/jquery/ui/tooltip$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 789 790 // New in 1.12.1 791 $scripts->add( 'jquery-ui-checkboxradio', "/wp-includes/js/jquery/ui/checkboxradio$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 792 $scripts->add( 'jquery-ui-controlgroup', "/wp-includes/js/jquery/ui/controlgroup$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 ); 793 794 // Interactions 795 $scripts->add( 'jquery-ui-draggable', "/wp-includes/js/jquery/ui/draggable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 ); 796 $scripts->add( 'jquery-ui-droppable', "/wp-includes/js/jquery/ui/droppable$suffix.js", array( 'jquery-ui-draggable' ), '1.12.1', 1 ); 797 $scripts->add( 'jquery-ui-resizable', "/wp-includes/js/jquery/ui/resizable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 ); 798 $scripts->add( 'jquery-ui-selectable', "/wp-includes/js/jquery/ui/selectable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 ); 799 $scripts->add( 'jquery-ui-sortable', "/wp-includes/js/jquery/ui/sortable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 ); 800 801 // As of 1.12.1 `jquery-ui-position` and `jquery-ui-widget` are part of `jquery-ui-core`. 802 // Listed here for back-compat. 803 $scripts->add( 'jquery-ui-position', false, array( 'jquery-ui-core' ), '1.12.1', 1 ); 804 $scripts->add( 'jquery-ui-widget', false, array( 'jquery-ui-core' ), '1.12.1', 1 ); 805 806 // Strings for 'jquery-ui-autocomplete' live region messages. 807 did_action( 'init' ) && $scripts->localize( 808 'jquery-ui-autocomplete', 809 'uiAutocompleteL10n', 810 array( 811 'noResults' => __( 'No results found.' ), 812 /* translators: Number of results found when using jQuery UI Autocomplete. */ 813 'oneResult' => __( '1 result found. Use up and down arrow keys to navigate.' ), 814 /* translators: %d: Number of results found when using jQuery UI Autocomplete. */ 815 'manyResults' => __( '%d results found. Use up and down arrow keys to navigate.' ), 816 'itemSelected' => __( 'Item selected.' ), 817 ) 818 ); 819 820 // Deprecated, not used in core, most functionality is included in jQuery 1.3. 821 $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array( 'jquery' ), '4.3.0', 1 ); 822 823 // jQuery plugins. 824 $scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.min.js', array( 'jquery' ), '2.1.2', 1 ); 825 $scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array( 'jquery' ), '20m', 1 ); 826 $scripts->add( 'jquery-query', '/wp-includes/js/jquery/jquery.query.js', array( 'jquery' ), '2.1.7', 1 ); 827 $scripts->add( 'jquery-serialize-object', '/wp-includes/js/jquery/jquery.serialize-object.js', array( 'jquery' ), '0.2-wp', 1 ); 828 $scripts->add( 'jquery-hotkeys', "/wp-includes/js/jquery/jquery.hotkeys$suffix.js", array( 'jquery' ), '0.0.2m', 1 ); 829 $scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array( 'jquery', 'jquery-hotkeys' ), false, 1 ); 830 $scripts->add( 'jquery-touch-punch', '/wp-includes/js/jquery/jquery.ui.touch-punch.js', array( 'jquery-ui-core', 'jquery-ui-mouse' ), '0.2.2', 1 ); 831 832 // Not used any more, registered for backward compatibility. 833 $scripts->add( 'suggest', "/wp-includes/js/jquery/suggest$suffix.js", array( 'jquery' ), '1.1-20110113', 1 ); 834 835 // Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv. 836 // It sets jQuery as a dependency, as the theme may have been implicitly loading it this way. 837 $scripts->add( 'imagesloaded', '/wp-includes/js/imagesloaded.min.js', array(), '4.1.4', 1 ); 838 $scripts->add( 'masonry', '/wp-includes/js/masonry.min.js', array( 'imagesloaded' ), '4.2.2', 1 ); 839 $scripts->add( 'jquery-masonry', '/wp-includes/js/jquery/jquery.masonry.min.js', array( 'jquery', 'masonry' ), '3.1.2b', 1 ); 840 841 $scripts->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.js', array( 'jquery' ), '3.1-20121105', 1 ); 842 did_action( 'init' ) && $scripts->localize( 843 'thickbox', 844 'thickboxL10n', 845 array( 846 'next' => __( 'Next >' ), 847 'prev' => __( '< Prev' ), 848 'image' => __( 'Image' ), 849 'of' => __( 'of' ), 850 'close' => __( 'Close' ), 851 'noiframes' => __( 'This feature requires inline frames. You have iframes disabled or your browser does not support them.' ), 852 'loadingAnimation' => includes_url( 'js/thickbox/loadingAnimation.gif' ), 853 ) 854 ); 855 856 $scripts->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.js', array( 'jquery' ), '0.9.12' ); 857 858 $scripts->add( 'swfobject', '/wp-includes/js/swfobject.js', array(), '2.2-20120417' ); 859 860 // Error messages for Plupload. 861 $uploader_l10n = array( 862 'queue_limit_exceeded' => __( 'You have attempted to queue too many files.' ), 863 /* translators: %s: File name. */ 864 'file_exceeds_size_limit' => __( '%s exceeds the maximum upload size for this site.' ), 865 'zero_byte_file' => __( 'This file is empty. Please try another.' ), 866 'invalid_filetype' => __( 'Sorry, this file type is not permitted for security reasons.' ), 867 'not_an_image' => __( 'This file is not an image. Please try another.' ), 868 'image_memory_exceeded' => __( 'Memory exceeded. Please try another smaller file.' ), 869 'image_dimensions_exceeded' => __( 'This is larger than the maximum size. Please try another.' ), 870 'default_error' => __( 'An error occurred in the upload. Please try again later.' ), 871 'missing_upload_url' => __( 'There was a configuration error. Please contact the server administrator.' ), 872 'upload_limit_exceeded' => __( 'You may only upload 1 file.' ), 873 'http_error' => __( 'Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page.' ), 874 'http_error_image' => __( 'Post-processing of the image failed likely because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels.' ), 875 'upload_failed' => __( 'Upload failed.' ), 876 /* translators: 1: Opening link tag, 2: Closing link tag. */ 877 'big_upload_failed' => __( 'Please try uploading this file with the %1$sbrowser uploader%2$s.' ), 878 /* translators: %s: File name. */ 879 'big_upload_queued' => __( '%s exceeds the maximum upload size for the multi-file uploader when used in your browser.' ), 880 'io_error' => __( 'IO error.' ), 881 'security_error' => __( 'Security error.' ), 882 'file_cancelled' => __( 'File canceled.' ), 883 'upload_stopped' => __( 'Upload stopped.' ), 884 'dismiss' => __( 'Dismiss' ), 885 'crunching' => __( 'Crunching…' ), 886 'deleted' => __( 'moved to the Trash.' ), 887 /* translators: %s: File name. */ 888 'error_uploading' => __( '“%s” has failed to upload.' ), 889 'unsupported_image' => __( 'This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading.' ), 890 'noneditable_image' => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.' ), 891 'file_url_copied' => __( 'The file URL has been copied to your clipboard' ), 892 ); 893 894 $scripts->add( 'moxiejs', "/wp-includes/js/plupload/moxie$suffix.js", array(), '1.3.5' ); 895 $scripts->add( 'plupload', "/wp-includes/js/plupload/plupload$suffix.js", array( 'moxiejs' ), '2.1.9' ); 896 // Back compat handles: 897 foreach ( array( 'all', 'html5', 'flash', 'silverlight', 'html4' ) as $handle ) { 898 $scripts->add( "plupload-$handle", false, array( 'plupload' ), '2.1.1' ); 899 } 900 901 $scripts->add( 'plupload-handlers', "/wp-includes/js/plupload/handlers$suffix.js", array( 'clipboard', 'jquery', 'plupload', 'underscore', 'wp-a11y', 'wp-i18n' ) ); 902 did_action( 'init' ) && $scripts->localize( 'plupload-handlers', 'pluploadL10n', $uploader_l10n ); 903 904 $scripts->add( 'wp-plupload', "/wp-includes/js/plupload/wp-plupload$suffix.js", array( 'plupload', 'jquery', 'json2', 'media-models' ), false, 1 ); 905 did_action( 'init' ) && $scripts->localize( 'wp-plupload', 'pluploadL10n', $uploader_l10n ); 906 907 // Keep 'swfupload' for back-compat. 908 $scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', array(), '2201-20110113' ); 909 $scripts->add( 'swfupload-all', false, array( 'swfupload' ), '2201' ); 910 $scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array( 'swfupload-all', 'jquery' ), '2201-20110524' ); 911 did_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n ); 912 913 $scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", array(), false, 1 ); 914 915 $scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", array(), '2015-05-03' ); 916 did_action( 'init' ) && $scripts->add_data( 'json2', 'conditional', 'lt IE 8' ); 917 918 $scripts->add( 'underscore', "/wp-includes/js/underscore$dev_suffix.js", array(), '1.13.1', 1 ); 919 $scripts->add( 'backbone', "/wp-includes/js/backbone$dev_suffix.js", array( 'underscore', 'jquery' ), '1.4.0', 1 ); 920 921 $scripts->add( 'wp-util', "/wp-includes/js/wp-util$suffix.js", array( 'underscore', 'jquery' ), false, 1 ); 922 did_action( 'init' ) && $scripts->localize( 923 'wp-util', 924 '_wpUtilSettings', 925 array( 926 'ajax' => array( 927 'url' => admin_url( 'admin-ajax.php', 'relative' ), 928 ), 929 ) 930 ); 931 932 $scripts->add( 'wp-backbone', "/wp-includes/js/wp-backbone$suffix.js", array( 'backbone', 'wp-util' ), false, 1 ); 933 934 $scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'wp-backbone', 'jquery-ui-slider', 'hoverIntent' ), false, 1 ); 935 936 $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array( 'jquery' ), false, 1 ); 937 938 $scripts->add( 'mediaelement', false, array( 'jquery', 'mediaelement-core', 'mediaelement-migrate' ), '4.2.16', 1 ); 939 $scripts->add( 'mediaelement-core', "/wp-includes/js/mediaelement/mediaelement-and-player$suffix.js", array(), '4.2.16', 1 ); 940 $scripts->add( 'mediaelement-migrate', "/wp-includes/js/mediaelement/mediaelement-migrate$suffix.js", array(), false, 1 ); 941 942 did_action( 'init' ) && $scripts->add_inline_script( 943 'mediaelement-core', 944 sprintf( 945 'var mejsL10n = %s;', 946 wp_json_encode( 947 array( 948 'language' => strtolower( strtok( determine_locale(), '_-' ) ), 949 'strings' => array( 950 'mejs.download-file' => __( 'Download File' ), 951 'mejs.install-flash' => __( 'You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/' ), 952 'mejs.fullscreen' => __( 'Fullscreen' ), 953 'mejs.play' => __( 'Play' ), 954 'mejs.pause' => __( 'Pause' ), 955 'mejs.time-slider' => __( 'Time Slider' ), 956 'mejs.time-help-text' => __( 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.' ), 957 'mejs.live-broadcast' => __( 'Live Broadcast' ), 958 'mejs.volume-help-text' => __( 'Use Up/Down Arrow keys to increase or decrease volume.' ), 959 'mejs.unmute' => __( 'Unmute' ), 960 'mejs.mute' => __( 'Mute' ), 961 'mejs.volume-slider' => __( 'Volume Slider' ), 962 'mejs.video-player' => __( 'Video Player' ), 963 'mejs.audio-player' => __( 'Audio Player' ), 964 'mejs.captions-subtitles' => __( 'Captions/Subtitles' ), 965 'mejs.captions-chapters' => __( 'Chapters' ), 966 'mejs.none' => __( 'None' ), 967 'mejs.afrikaans' => __( 'Afrikaans' ), 968 'mejs.albanian' => __( 'Albanian' ), 969 'mejs.arabic' => __( 'Arabic' ), 970 'mejs.belarusian' => __( 'Belarusian' ), 971 'mejs.bulgarian' => __( 'Bulgarian' ), 972 'mejs.catalan' => __( 'Catalan' ), 973 'mejs.chinese' => __( 'Chinese' ), 974 'mejs.chinese-simplified' => __( 'Chinese (Simplified)' ), 975 'mejs.chinese-traditional' => __( 'Chinese (Traditional)' ), 976 'mejs.croatian' => __( 'Croatian' ), 977 'mejs.czech' => __( 'Czech' ), 978 'mejs.danish' => __( 'Danish' ), 979 'mejs.dutch' => __( 'Dutch' ), 980 'mejs.english' => __( 'English' ), 981 'mejs.estonian' => __( 'Estonian' ), 982 'mejs.filipino' => __( 'Filipino' ), 983 'mejs.finnish' => __( 'Finnish' ), 984 'mejs.french' => __( 'French' ), 985 'mejs.galician' => __( 'Galician' ), 986 'mejs.german' => __( 'German' ), 987 'mejs.greek' => __( 'Greek' ), 988 'mejs.haitian-creole' => __( 'Haitian Creole' ), 989 'mejs.hebrew' => __( 'Hebrew' ), 990 'mejs.hindi' => __( 'Hindi' ), 991 'mejs.hungarian' => __( 'Hungarian' ), 992 'mejs.icelandic' => __( 'Icelandic' ), 993 'mejs.indonesian' => __( 'Indonesian' ), 994 'mejs.irish' => __( 'Irish' ), 995 'mejs.italian' => __( 'Italian' ), 996 'mejs.japanese' => __( 'Japanese' ), 997 'mejs.korean' => __( 'Korean' ), 998 'mejs.latvian' => __( 'Latvian' ), 999 'mejs.lithuanian' => __( 'Lithuanian' ), 1000 'mejs.macedonian' => __( 'Macedonian' ), 1001 'mejs.malay' => __( 'Malay' ), 1002 'mejs.maltese' => __( 'Maltese' ), 1003 'mejs.norwegian' => __( 'Norwegian' ), 1004 'mejs.persian' => __( 'Persian' ), 1005 'mejs.polish' => __( 'Polish' ), 1006 'mejs.portuguese' => __( 'Portuguese' ), 1007 'mejs.romanian' => __( 'Romanian' ), 1008 'mejs.russian' => __( 'Russian' ), 1009 'mejs.serbian' => __( 'Serbian' ), 1010 'mejs.slovak' => __( 'Slovak' ), 1011 'mejs.slovenian' => __( 'Slovenian' ), 1012 'mejs.spanish' => __( 'Spanish' ), 1013 'mejs.swahili' => __( 'Swahili' ), 1014 'mejs.swedish' => __( 'Swedish' ), 1015 'mejs.tagalog' => __( 'Tagalog' ), 1016 'mejs.thai' => __( 'Thai' ), 1017 'mejs.turkish' => __( 'Turkish' ), 1018 'mejs.ukrainian' => __( 'Ukrainian' ), 1019 'mejs.vietnamese' => __( 'Vietnamese' ), 1020 'mejs.welsh' => __( 'Welsh' ), 1021 'mejs.yiddish' => __( 'Yiddish' ), 1022 ), 1023 ) 1024 ) 1025 ), 1026 'before' 1027 ); 1028 1029 $scripts->add( 'mediaelement-vimeo', '/wp-includes/js/mediaelement/renderers/vimeo.min.js', array( 'mediaelement' ), '4.2.16', 1 ); 1030 $scripts->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.js", array( 'mediaelement' ), false, 1 ); 1031 $mejs_settings = array( 1032 'pluginPath' => includes_url( 'js/mediaelement/', 'relative' ), 1033 'classPrefix' => 'mejs-', 1034 'stretching' => 'responsive', 1035 ); 1036 did_action( 'init' ) && $scripts->localize( 1037 'mediaelement', 1038 '_wpmejsSettings', 1039 /** 1040 * Filters the MediaElement configuration settings. 1041 * 1042 * @since 4.4.0 1043 * 1044 * @param array $mejs_settings MediaElement settings array. 1045 */ 1046 apply_filters( 'mejs_settings', $mejs_settings ) 1047 ); 1048 1049 $scripts->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.js', array(), '5.29.1-alpha-ee20357' ); 1050 $scripts->add( 'csslint', '/wp-includes/js/codemirror/csslint.js', array(), '1.0.5' ); 1051 $scripts->add( 'esprima', '/wp-includes/js/codemirror/esprima.js', array(), '4.0.0' ); 1052 $scripts->add( 'jshint', '/wp-includes/js/codemirror/fakejshint.js', array( 'esprima' ), '2.9.5' ); 1053 $scripts->add( 'jsonlint', '/wp-includes/js/codemirror/jsonlint.js', array(), '1.6.2' ); 1054 $scripts->add( 'htmlhint', '/wp-includes/js/codemirror/htmlhint.js', array(), '0.9.14-xwp' ); 1055 $scripts->add( 'htmlhint-kses', '/wp-includes/js/codemirror/htmlhint-kses.js', array( 'htmlhint' ) ); 1056 $scripts->add( 'code-editor', "/wp-admin/js/code-editor$suffix.js", array( 'jquery', 'wp-codemirror', 'underscore' ) ); 1057 $scripts->add( 'wp-theme-plugin-editor', "/wp-admin/js/theme-plugin-editor$suffix.js", array( 'common', 'wp-util', 'wp-sanitize', 'jquery', 'jquery-ui-core', 'wp-a11y', 'underscore' ) ); 1058 $scripts->set_translations( 'wp-theme-plugin-editor' ); 1059 1060 $scripts->add( 'wp-playlist', "/wp-includes/js/mediaelement/wp-playlist$suffix.js", array( 'wp-util', 'backbone', 'mediaelement' ), false, 1 ); 1061 1062 $scripts->add( 'zxcvbn-async', "/wp-includes/js/zxcvbn-async$suffix.js", array(), '1.0' ); 1063 did_action( 'init' ) && $scripts->localize( 1064 'zxcvbn-async', 1065 '_zxcvbnSettings', 1066 array( 1067 'src' => empty( $guessed_url ) ? includes_url( '/js/zxcvbn.min.js' ) : $scripts->base_url . '/wp-includes/js/zxcvbn.min.js', 1068 ) 1069 ); 1070 1071 $scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array( 'jquery', 'zxcvbn-async' ), false, 1 ); 1072 did_action( 'init' ) && $scripts->localize( 1073 'password-strength-meter', 1074 'pwsL10n', 1075 array( 1076 'unknown' => _x( 'Password strength unknown', 'password strength' ), 1077 'short' => _x( 'Very weak', 'password strength' ), 1078 'bad' => _x( 'Weak', 'password strength' ), 1079 'good' => _x( 'Medium', 'password strength' ), 1080 'strong' => _x( 'Strong', 'password strength' ), 1081 'mismatch' => _x( 'Mismatch', 'password mismatch' ), 1082 ) 1083 ); 1084 $scripts->set_translations( 'password-strength-meter' ); 1085 1086 $scripts->add( 'application-passwords', "/wp-admin/js/application-passwords$suffix.js", array( 'jquery', 'wp-util', 'wp-api-request', 'wp-date', 'wp-i18n', 'wp-hooks' ), false, 1 ); 1087 $scripts->set_translations( 'application-passwords' ); 1088 1089 $scripts->add( 'auth-app', "/wp-admin/js/auth-app$suffix.js", array( 'jquery', 'wp-api-request', 'wp-i18n', 'wp-hooks' ), false, 1 ); 1090 $scripts->set_translations( 'auth-app' ); 1091 1092 $scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter', 'wp-util' ), false, 1 ); 1093 $scripts->set_translations( 'user-profile' ); 1094 $user_id = isset( $_GET['user_id'] ) ? (int) $_GET['user_id'] : 0; 1095 did_action( 'init' ) && $scripts->localize( 1096 'user-profile', 1097 'userProfileL10n', 1098 array( 1099 'user_id' => $user_id, 1100 'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'reset-password-for-' . $user_id ), 1101 ) 1102 ); 1103 1104 $scripts->add( 'language-chooser', "/wp-admin/js/language-chooser$suffix.js", array( 'jquery' ), false, 1 ); 1105 1106 $scripts->add( 'user-suggest', "/wp-admin/js/user-suggest$suffix.js", array( 'jquery-ui-autocomplete' ), false, 1 ); 1107 1108 $scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", array( 'hoverintent-js' ), false, 1 ); 1109 1110 $scripts->add( 'wplink', "/wp-includes/js/wplink$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 ); 1111 did_action( 'init' ) && $scripts->localize( 1112 'wplink', 1113 'wpLinkL10n', 1114 array( 1115 'title' => __( 'Insert/edit link' ), 1116 'update' => __( 'Update' ), 1117 'save' => __( 'Add Link' ), 1118 'noTitle' => __( '(no title)' ), 1119 'noMatchesFound' => __( 'No results found.' ), 1120 'linkSelected' => __( 'Link selected.' ), 1121 'linkInserted' => __( 'Link inserted.' ), 1122 /* translators: Minimum input length in characters to start searching posts in the "Insert/edit link" modal. */ 1123 'minInputLength' => (int) _x( '3', 'minimum input length for searching post links' ), 1124 ) 1125 ); 1126 1127 $scripts->add( 'wpdialogs', "/wp-includes/js/wpdialog$suffix.js", array( 'jquery-ui-dialog' ), false, 1 ); 1128 1129 $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array(), false, 1 ); 1130 1131 $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'shortcode' ), false, 1 ); 1132 1133 $scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array( 'jquery' ), '1.10.1', 1 ); 1134 1135 // JS-only version of hoverintent (no dependencies). 1136 $scripts->add( 'hoverintent-js', '/wp-includes/js/hoverintent-js.min.js', array(), '2.2.1', 1 ); 1137 1138 $scripts->add( 'customize-base', "/wp-includes/js/customize-base$suffix.js", array( 'jquery', 'json2', 'underscore' ), false, 1 ); 1139 $scripts->add( 'customize-loader', "/wp-includes/js/customize-loader$suffix.js", array( 'customize-base' ), false, 1 ); 1140 $scripts->add( 'customize-preview', "/wp-includes/js/customize-preview$suffix.js", array( 'wp-a11y', 'customize-base' ), false, 1 ); 1141 $scripts->add( 'customize-models', '/wp-includes/js/customize-models.js', array( 'underscore', 'backbone' ), false, 1 ); 1142 $scripts->add( 'customize-views', '/wp-includes/js/customize-views.js', array( 'jquery', 'underscore', 'imgareaselect', 'customize-models', 'media-editor', 'media-views' ), false, 1 ); 1143 $scripts->add( 'customize-controls', "/wp-admin/js/customize-controls$suffix.js", array( 'customize-base', 'wp-a11y', 'wp-util', 'jquery-ui-core' ), false, 1 ); 1144 did_action( 'init' ) && $scripts->localize( 1145 'customize-controls', 1146 '_wpCustomizeControlsL10n', 1147 array( 1148 'activate' => __( 'Activate & Publish' ), 1149 'save' => __( 'Save & Publish' ), // @todo Remove as not required. 1150 'publish' => __( 'Publish' ), 1151 'published' => __( 'Published' ), 1152 'saveDraft' => __( 'Save Draft' ), 1153 'draftSaved' => __( 'Draft Saved' ), 1154 'updating' => __( 'Updating' ), 1155 'schedule' => _x( 'Schedule', 'customizer changeset action/button label' ), 1156 'scheduled' => _x( 'Scheduled', 'customizer changeset status' ), 1157 'invalid' => __( 'Invalid' ), 1158 'saveBeforeShare' => __( 'Please save your changes in order to share the preview.' ), 1159 'futureDateError' => __( 'You must supply a future date to schedule.' ), 1160 'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ), 1161 'saved' => __( 'Saved' ), 1162 'cancel' => __( 'Cancel' ), 1163 'close' => __( 'Close' ), 1164 'action' => __( 'Action' ), 1165 'discardChanges' => __( 'Discard changes' ), 1166 'cheatin' => __( 'Something went wrong.' ), 1167 'notAllowedHeading' => __( 'You need a higher level of permission.' ), 1168 'notAllowed' => __( 'Sorry, you are not allowed to customize this site.' ), 1169 'previewIframeTitle' => __( 'Site Preview' ), 1170 'loginIframeTitle' => __( 'Session expired' ), 1171 'collapseSidebar' => _x( 'Hide Controls', 'label for hide controls button without length constraints' ), 1172 'expandSidebar' => _x( 'Show Controls', 'label for hide controls button without length constraints' ), 1173 'untitledBlogName' => __( '(Untitled)' ), 1174 'unknownRequestFail' => __( 'Looks like something’s gone wrong. Wait a couple seconds, and then try again.' ), 1175 'themeDownloading' => __( 'Downloading your new theme…' ), 1176 'themePreviewWait' => __( 'Setting up your live preview. This may take a bit.' ), 1177 'revertingChanges' => __( 'Reverting unpublished changes…' ), 1178 'trashConfirm' => __( 'Are you sure you want to discard your unpublished changes?' ), 1179 /* translators: %s: Display name of the user who has taken over the changeset in customizer. */ 1180 'takenOverMessage' => __( '%s has taken over and is currently customizing.' ), 1181 /* translators: %s: URL to the Customizer to load the autosaved version. */ 1182 'autosaveNotice' => __( 'There is a more recent autosave of your changes than the one you are previewing. <a href="%s">Restore the autosave</a>' ), 1183 'videoHeaderNotice' => __( 'This theme doesn’t support video headers on this page. Navigate to the front page or another page that supports video headers.' ), 1184 // Used for overriding the file types allowed in Plupload. 1185 'allowedFiles' => __( 'Allowed Files' ), 1186 'customCssError' => array( 1187 /* translators: %d: Error count. */ 1188 'singular' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 1 ), 1189 /* translators: %d: Error count. */ 1190 'plural' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 2 ), 1191 // @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491. 1192 ), 1193 'pageOnFrontError' => __( 'Homepage and posts page must be different.' ), 1194 'saveBlockedError' => array( 1195 /* translators: %s: Number of invalid settings. */ 1196 'singular' => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 1 ), 1197 /* translators: %s: Number of invalid settings. */ 1198 'plural' => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 2 ), 1199 // @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491. 1200 ), 1201 'scheduleDescription' => __( 'Schedule your customization changes to publish ("go live") at a future date.' ), 1202 'themePreviewUnavailable' => __( 'Sorry, you can’t preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes.' ), 1203 'themeInstallUnavailable' => sprintf( 1204 /* translators: %s: URL to Add Themes admin screen. */ 1205 __( 'You won’t be able to install new themes from here yet since your install requires SFTP credentials. For now, please <a href="%s">add themes in the admin</a>.' ), 1206 esc_url( admin_url( 'theme-install.php' ) ) 1207 ), 1208 'publishSettings' => __( 'Publish Settings' ), 1209 'invalidDate' => __( 'Invalid date.' ), 1210 'invalidValue' => __( 'Invalid value.' ), 1211 ) 1212 ); 1213 $scripts->add( 'customize-selective-refresh', "/wp-includes/js/customize-selective-refresh$suffix.js", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 ); 1214 1215 $scripts->add( 'customize-widgets', "/wp-admin/js/customize-widgets$suffix.js", array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-droppable', 'wp-backbone', 'customize-controls' ), false, 1 ); 1216 $scripts->add( 'customize-preview-widgets', "/wp-includes/js/customize-preview-widgets$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 ); 1217 1218 $scripts->add( 'customize-nav-menus', "/wp-admin/js/customize-nav-menus$suffix.js", array( 'jquery', 'wp-backbone', 'customize-controls', 'accordion', 'nav-menu', 'wp-sanitize' ), false, 1 ); 1219 $scripts->add( 'customize-preview-nav-menus', "/wp-includes/js/customize-preview-nav-menus$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 ); 1220 1221 $scripts->add( 'wp-custom-header', "/wp-includes/js/wp-custom-header$suffix.js", array( 'wp-a11y' ), false, 1 ); 1222 1223 $scripts->add( 'accordion', "/wp-admin/js/accordion$suffix.js", array( 'jquery' ), false, 1 ); 1224 1225 $scripts->add( 'shortcode', "/wp-includes/js/shortcode$suffix.js", array( 'underscore' ), false, 1 ); 1226 $scripts->add( 'media-models', "/wp-includes/js/media-models$suffix.js", array( 'wp-backbone' ), false, 1 ); 1227 did_action( 'init' ) && $scripts->localize( 1228 'media-models', 1229 '_wpMediaModelsL10n', 1230 array( 1231 'settings' => array( 1232 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ), 1233 'post' => array( 'id' => 0 ), 1234 ), 1235 ) 1236 ); 1237 1238 $scripts->add( 'wp-embed', "/wp-includes/js/wp-embed$suffix.js" ); 1239 1240 // To enqueue media-views or media-editor, call wp_enqueue_media(). 1241 // Both rely on numerous settings, styles, and templates to operate correctly. 1242 $scripts->add( 'media-views', "/wp-includes/js/media-views$suffix.js", array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement', 'wp-api-request', 'wp-a11y', 'clipboard' ), false, 1 ); 1243 $scripts->set_translations( 'media-views' ); 1244 1245 $scripts->add( 'media-editor', "/wp-includes/js/media-editor$suffix.js", array( 'shortcode', 'media-views' ), false, 1 ); 1246 $scripts->set_translations( 'media-editor' ); 1247 $scripts->add( 'media-audiovideo', "/wp-includes/js/media-audiovideo$suffix.js", array( 'media-editor' ), false, 1 ); 1248 $scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 ); 1249 1250 $scripts->add( 'wp-api', "/wp-includes/js/wp-api$suffix.js", array( 'jquery', 'backbone', 'underscore', 'wp-api-request' ), false, 1 ); 1251 1252 if ( is_admin() ) { 1253 $scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array( 'jquery', 'wp-ajax-response' ), false, 1 ); 1254 $scripts->set_translations( 'admin-tags' ); 1255 1256 $scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array( 'wp-lists', 'quicktags', 'jquery-query' ), false, 1 ); 1257 $scripts->set_translations( 'admin-comments' ); 1258 did_action( 'init' ) && $scripts->localize( 1259 'admin-comments', 1260 'adminCommentsSettings', 1261 array( 1262 'hotkeys_highlight_first' => isset( $_GET['hotkeys_highlight_first'] ), 1263 'hotkeys_highlight_last' => isset( $_GET['hotkeys_highlight_last'] ), 1264 ) 1265 ); 1266 1267 $scripts->add( 'xfn', "/wp-admin/js/xfn$suffix.js", array( 'jquery' ), false, 1 ); 1268 1269 $scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array( 'jquery-ui-sortable', 'wp-a11y' ), false, 1 ); 1270 $scripts->set_translations( 'postbox' ); 1271 1272 $scripts->add( 'tags-box', "/wp-admin/js/tags-box$suffix.js", array( 'jquery', 'tags-suggest' ), false, 1 ); 1273 $scripts->set_translations( 'tags-box' ); 1274 1275 $scripts->add( 'tags-suggest', "/wp-admin/js/tags-suggest$suffix.js", array( 'jquery-ui-autocomplete', 'wp-a11y' ), false, 1 ); 1276 $scripts->set_translations( 'tags-suggest' ); 1277 1278 $scripts->add( 'post', "/wp-admin/js/post$suffix.js", array( 'suggest', 'wp-lists', 'postbox', 'tags-box', 'underscore', 'word-count', 'wp-a11y', 'wp-sanitize', 'clipboard' ), false, 1 ); 1279 $scripts->set_translations( 'post' ); 1280 1281 $scripts->add( 'editor-expand', "/wp-admin/js/editor-expand$suffix.js", array( 'jquery', 'underscore' ), false, 1 ); 1282 1283 $scripts->add( 'link', "/wp-admin/js/link$suffix.js", array( 'wp-lists', 'postbox' ), false, 1 ); 1284 1285 $scripts->add( 'comment', "/wp-admin/js/comment$suffix.js", array( 'jquery', 'postbox' ), false, 1 ); 1286 $scripts->set_translations( 'comment' ); 1287 1288 $scripts->add( 'admin-gallery', "/wp-admin/js/gallery$suffix.js", array( 'jquery-ui-sortable' ) ); 1289 1290 $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-a11y' ), false, 1 ); 1291 $scripts->set_translations( 'admin-widgets' ); 1292 1293 $scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views', 'wp-api-request' ) ); 1294 $scripts->add_inline_script( 'media-widgets', 'wp.mediaWidgets.init();', 'after' ); 1295 1296 $scripts->add( 'media-audio-widget', "/wp-admin/js/widgets/media-audio-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) ); 1297 $scripts->add( 'media-image-widget', "/wp-admin/js/widgets/media-image-widget$suffix.js", array( 'media-widgets' ) ); 1298 $scripts->add( 'media-gallery-widget', "/wp-admin/js/widgets/media-gallery-widget$suffix.js", array( 'media-widgets' ) ); 1299 $scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo', 'wp-api-request' ) ); 1300 $scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util', 'wp-a11y' ) ); 1301 $scripts->add( 'custom-html-widgets', "/wp-admin/js/widgets/custom-html-widgets$suffix.js", array( 'jquery', 'backbone', 'wp-util', 'jquery-ui-core', 'wp-a11y' ) ); 1302 1303 $scripts->add( 'theme', "/wp-admin/js/theme$suffix.js", array( 'wp-backbone', 'wp-a11y', 'customize-base' ), false, 1 ); 1304 1305 $scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'tags-suggest', 'wp-a11y' ), false, 1 ); 1306 $scripts->set_translations( 'inline-edit-post' ); 1307 1308 $scripts->add( 'inline-edit-tax', "/wp-admin/js/inline-edit-tax$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 ); 1309 $scripts->set_translations( 'inline-edit-tax' ); 1310 1311 $scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'jquery-ui-core', 'thickbox' ), false, 1 ); 1312 $scripts->set_translations( 'plugin-install' ); 1313 1314 $scripts->add( 'site-health', "/wp-admin/js/site-health$suffix.js", array( 'clipboard', 'jquery', 'wp-util', 'wp-a11y', 'wp-api-request', 'wp-url', 'wp-i18n', 'wp-hooks' ), false, 1 ); 1315 $scripts->set_translations( 'site-health' ); 1316 1317 $scripts->add( 'privacy-tools', "/wp-admin/js/privacy-tools$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 ); 1318 $scripts->set_translations( 'privacy-tools' ); 1319 1320 $scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'common', 'jquery', 'wp-util', 'wp-a11y', 'wp-sanitize' ), false, 1 ); 1321 $scripts->set_translations( 'updates' ); 1322 did_action( 'init' ) && $scripts->localize( 1323 'updates', 1324 '_wpUpdatesSettings', 1325 array( 1326 'ajax_nonce' => wp_create_nonce( 'updates' ), 1327 ) 1328 ); 1329 1330 $scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array( 'jquery' ), '1.2' ); 1331 1332 $scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.0.7', 1 ); 1333 $scripts->add( 'wp-color-picker', "/wp-admin/js/color-picker$suffix.js", array( 'iris' ), false, 1 ); 1334 $scripts->set_translations( 'wp-color-picker' ); 1335 1336 $scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox', 'wp-util', 'wp-a11y', 'wp-date' ), false, 1 ); 1337 $scripts->set_translations( 'dashboard' ); 1338 1339 $scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js" ); 1340 1341 $scripts->add( 'media-grid', "/wp-includes/js/media-grid$suffix.js", array( 'media-editor' ), false, 1 ); 1342 $scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery' ), false, 1 ); 1343 $scripts->set_translations( 'media' ); 1344 1345 $scripts->add( 'image-edit', "/wp-admin/js/image-edit$suffix.js", array( 'jquery', 'jquery-ui-core', 'json2', 'imgareaselect', 'wp-a11y' ), false, 1 ); 1346 $scripts->set_translations( 'image-edit' ); 1347 1348 $scripts->add( 'set-post-thumbnail', "/wp-admin/js/set-post-thumbnail$suffix.js", array( 'jquery' ), false, 1 ); 1349 $scripts->set_translations( 'set-post-thumbnail' ); 1350 1351 /* 1352 * Navigation Menus: Adding underscore as a dependency to utilize _.debounce 1353 * see https://core.trac.wordpress.org/ticket/42321 1354 */ 1355 $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox', 'json2', 'underscore' ) ); 1356 $scripts->set_translations( 'nav-menu' ); 1357 1358 $scripts->add( 'custom-header', '/wp-admin/js/custom-header.js', array( 'jquery-masonry' ), false, 1 ); 1359 $scripts->add( 'custom-background', "/wp-admin/js/custom-background$suffix.js", array( 'wp-color-picker', 'media-views' ), false, 1 ); 1360 $scripts->add( 'media-gallery', "/wp-admin/js/media-gallery$suffix.js", array( 'jquery' ), false, 1 ); 1361 1362 $scripts->add( 'svg-painter', '/wp-admin/js/svg-painter.js', array( 'jquery' ), false, 1 ); 1363 } 1364 } 1365 1366 /** 1367 * Assign default styles to $styles object. 1368 * 1369 * Nothing is returned, because the $styles parameter is passed by reference. 1370 * Meaning that whatever object is passed will be updated without having to 1371 * reassign the variable that was passed back to the same value. This saves 1372 * memory. 1373 * 1374 * Adding default styles is not the only task, it also assigns the base_url 1375 * property, the default version, and text direction for the object. 1376 * 1377 * @since 2.6.0 1378 * 1379 * @param WP_Styles $styles 1380 */ 1381 function wp_default_styles( $styles ) { 1382 // Include an unmodified $wp_version. 1383 require ABSPATH . WPINC . '/version.php'; 1384 1385 if ( ! defined( 'SCRIPT_DEBUG' ) ) { 1386 define( 'SCRIPT_DEBUG', false !== strpos( $wp_version, '-src' ) ); 1387 } 1388 1389 $guessurl = site_url(); 1390 1391 if ( ! $guessurl ) { 1392 $guessurl = wp_guess_url(); 1393 } 1394 1395 $styles->base_url = $guessurl; 1396 $styles->content_url = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : ''; 1397 $styles->default_version = get_bloginfo( 'version' ); 1398 $styles->text_direction = function_exists( 'is_rtl' ) && is_rtl() ? 'rtl' : 'ltr'; 1399 $styles->default_dirs = array( '/wp-admin/', '/wp-includes/css/' ); 1400 1401 // Open Sans is no longer used by core, but may be relied upon by themes and plugins. 1402 $open_sans_font_url = ''; 1403 1404 /* 1405 * translators: If there are characters in your language that are not supported 1406 * by Open Sans, translate this to 'off'. Do not translate into your own language. 1407 */ 1408 if ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) { 1409 $subsets = 'latin,latin-ext'; 1410 1411 /* 1412 * translators: To add an additional Open Sans character subset specific to your language, 1413 * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language. 1414 */ 1415 $subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' ); 1416 1417 if ( 'cyrillic' === $subset ) { 1418 $subsets .= ',cyrillic,cyrillic-ext'; 1419 } elseif ( 'greek' === $subset ) { 1420 $subsets .= ',greek,greek-ext'; 1421 } elseif ( 'vietnamese' === $subset ) { 1422 $subsets .= ',vietnamese'; 1423 } 1424 1425 // Hotlink Open Sans, for now. 1426 $open_sans_font_url = "https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=$subsets&display=fallback"; 1427 } 1428 1429 // Register a stylesheet for the selected admin color scheme. 1430 $styles->add( 'colors', true, array( 'wp-admin', 'buttons' ) ); 1431 1432 $suffix = SCRIPT_DEBUG ? '' : '.min'; 1433 1434 // Admin CSS. 1435 $styles->add( 'common', "/wp-admin/css/common$suffix.css" ); 1436 $styles->add( 'forms', "/wp-admin/css/forms$suffix.css" ); 1437 $styles->add( 'admin-menu', "/wp-admin/css/admin-menu$suffix.css" ); 1438 $styles->add( 'dashboard', "/wp-admin/css/dashboard$suffix.css" ); 1439 $styles->add( 'list-tables', "/wp-admin/css/list-tables$suffix.css" ); 1440 $styles->add( 'edit', "/wp-admin/css/edit$suffix.css" ); 1441 $styles->add( 'revisions', "/wp-admin/css/revisions$suffix.css" ); 1442 $styles->add( 'media', "/wp-admin/css/media$suffix.css" ); 1443 $styles->add( 'themes', "/wp-admin/css/themes$suffix.css" ); 1444 $styles->add( 'about', "/wp-admin/css/about$suffix.css" ); 1445 $styles->add( 'nav-menus', "/wp-admin/css/nav-menus$suffix.css" ); 1446 $styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css", array( 'wp-pointer' ) ); 1447 $styles->add( 'site-icon', "/wp-admin/css/site-icon$suffix.css" ); 1448 $styles->add( 'l10n', "/wp-admin/css/l10n$suffix.css" ); 1449 $styles->add( 'code-editor', "/wp-admin/css/code-editor$suffix.css", array( 'wp-codemirror' ) ); 1450 $styles->add( 'site-health', "/wp-admin/css/site-health$suffix.css" ); 1451 1452 $styles->add( 'wp-admin', false, array( 'dashicons', 'common', 'forms', 'admin-menu', 'dashboard', 'list-tables', 'edit', 'revisions', 'media', 'themes', 'about', 'nav-menus', 'widgets', 'site-icon', 'l10n' ) ); 1453 1454 $styles->add( 'login', "/wp-admin/css/login$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) ); 1455 $styles->add( 'install', "/wp-admin/css/install$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) ); 1456 $styles->add( 'wp-color-picker', "/wp-admin/css/color-picker$suffix.css" ); 1457 $styles->add( 'customize-controls', "/wp-admin/css/customize-controls$suffix.css", array( 'wp-admin', 'colors', 'imgareaselect' ) ); 1458 $styles->add( 'customize-widgets', "/wp-admin/css/customize-widgets$suffix.css", array( 'wp-admin', 'colors' ) ); 1459 $styles->add( 'customize-nav-menus', "/wp-admin/css/customize-nav-menus$suffix.css", array( 'wp-admin', 'colors' ) ); 1460 1461 // Common dependencies. 1462 $styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" ); 1463 $styles->add( 'dashicons', "/wp-includes/css/dashicons$suffix.css" ); 1464 1465 // Includes CSS. 1466 $styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css", array( 'dashicons' ) ); 1467 $styles->add( 'wp-auth-check', "/wp-includes/css/wp-auth-check$suffix.css", array( 'dashicons' ) ); 1468 $styles->add( 'editor-buttons', "/wp-includes/css/editor$suffix.css", array( 'dashicons' ) ); 1469 $styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons', 'dashicons', 'wp-mediaelement' ) ); 1470 $styles->add( 'wp-pointer', "/wp-includes/css/wp-pointer$suffix.css", array( 'dashicons' ) ); 1471 $styles->add( 'customize-preview', "/wp-includes/css/customize-preview$suffix.css", array( 'dashicons' ) ); 1472 $styles->add( 'wp-embed-template-ie', "/wp-includes/css/wp-embed-template-ie$suffix.css" ); 1473 $styles->add_data( 'wp-embed-template-ie', 'conditional', 'lte IE 8' ); 1474 1475 // External libraries and friends. 1476 $styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' ); 1477 $styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array( 'dashicons' ) ); 1478 $styles->add( 'mediaelement', '/wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css', array(), '4.2.16' ); 1479 $styles->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.css", array( 'mediaelement' ) ); 1480 $styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css', array( 'dashicons' ) ); 1481 $styles->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.css', array(), '5.29.1-alpha-ee20357' ); 1482 1483 // Deprecated CSS. 1484 $styles->add( 'deprecated-media', "/wp-admin/css/deprecated-media$suffix.css" ); 1485 $styles->add( 'farbtastic', "/wp-admin/css/farbtastic$suffix.css", array(), '1.3u1' ); 1486 $styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.css', array(), '0.9.12' ); 1487 $styles->add( 'colors-fresh', false, array( 'wp-admin', 'buttons' ) ); // Old handle. 1488 $styles->add( 'open-sans', $open_sans_font_url ); // No longer used in core as of 4.6. 1489 1490 // Noto Serif is no longer used by core, but may be relied upon by themes and plugins. 1491 $fonts_url = ''; 1492 1493 /* 1494 * translators: Use this to specify the proper Google Font name and variants 1495 * to load that is supported by your language. Do not translate. 1496 * Set to 'off' to disable loading. 1497 */ 1498 $font_family = _x( 'Noto Serif:400,400i,700,700i', 'Google Font Name and Variants' ); 1499 if ( 'off' !== $font_family ) { 1500 $fonts_url = 'https://fonts.googleapis.com/css?family=' . urlencode( $font_family ); 1501 } 1502 $styles->add( 'wp-editor-font', $fonts_url ); // No longer used in core as of 5.7. 1503 $block_library_theme_path = WPINC . "/css/dist/block-library/theme$suffix.css"; 1504 $styles->add( 'wp-block-library-theme', "/$block_library_theme_path" ); 1505 $styles->add_data( 'wp-block-library-theme', 'path', ABSPATH . $block_library_theme_path ); 1506 1507 $styles->add( 1508 'wp-reset-editor-styles', 1509 "/wp-includes/css/dist/block-library/reset$suffix.css", 1510 array( 'common', 'forms' ) // Make sure the reset is loaded after the default WP Admin styles. 1511 ); 1512 1513 $styles->add( 1514 'wp-editor-classic-layout-styles', 1515 "/wp-includes/css/dist/edit-post/classic$suffix.css", 1516 array() 1517 ); 1518 1519 $wp_edit_blocks_dependencies = array( 1520 'wp-components', 1521 'wp-editor', 1522 // This need to be added before the block library styles, 1523 // The block library styles override the "reset" styles. 1524 'wp-reset-editor-styles', 1525 'wp-block-library', 1526 'wp-reusable-blocks', 1527 ); 1528 1529 // Only load the default layout and margin styles for themes without theme.json file. 1530 if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) { 1531 $wp_edit_blocks_dependencies[] = 'wp-editor-classic-layout-styles'; 1532 } 1533 1534 global $editor_styles; 1535 if ( ! is_array( $editor_styles ) || count( $editor_styles ) === 0 ) { 1536 // Include opinionated block styles if no $editor_styles are declared, so the editor never appears broken. 1537 $wp_edit_blocks_dependencies[] = 'wp-block-library-theme'; 1538 } 1539 1540 $styles->add( 1541 'wp-edit-blocks', 1542 "/wp-includes/css/dist/block-library/editor$suffix.css", 1543 $wp_edit_blocks_dependencies 1544 ); 1545 1546 $package_styles = array( 1547 'block-editor' => array( 'wp-components' ), 1548 'block-library' => array(), 1549 'block-directory' => array(), 1550 'components' => array(), 1551 'edit-post' => array( 1552 'wp-components', 1553 'wp-block-editor', 1554 'wp-editor', 1555 'wp-edit-blocks', 1556 'wp-block-library', 1557 'wp-nux', 1558 ), 1559 'editor' => array( 1560 'wp-components', 1561 'wp-block-editor', 1562 'wp-nux', 1563 'wp-reusable-blocks', 1564 ), 1565 'format-library' => array(), 1566 'list-reusable-blocks' => array( 'wp-components' ), 1567 'reusable-blocks' => array( 'wp-components' ), 1568 'nux' => array( 'wp-components' ), 1569 'widgets' => array( 1570 'wp-components', 1571 ), 1572 'edit-widgets' => array( 1573 'wp-widgets', 1574 'wp-block-editor', 1575 'wp-edit-blocks', 1576 'wp-block-library', 1577 'wp-reusable-blocks', 1578 ), 1579 'customize-widgets' => array( 1580 'wp-widgets', 1581 'wp-block-editor', 1582 'wp-edit-blocks', 1583 'wp-block-library', 1584 'wp-reusable-blocks', 1585 ), 1586 ); 1587 1588 foreach ( $package_styles as $package => $dependencies ) { 1589 $handle = 'wp-' . $package; 1590 $path = "/wp-includes/css/dist/$package/style$suffix.css"; 1591 1592 if ( 'block-library' === $package && wp_should_load_separate_core_block_assets() ) { 1593 $path = "/wp-includes/css/dist/$package/common$suffix.css"; 1594 } 1595 $styles->add( $handle, $path, $dependencies ); 1596 $styles->add_data( $handle, 'path', ABSPATH . $path ); 1597 } 1598 1599 // RTL CSS. 1600 $rtl_styles = array( 1601 // Admin CSS. 1602 'common', 1603 'forms', 1604 'admin-menu', 1605 'dashboard', 1606 'list-tables', 1607 'edit', 1608 'revisions', 1609 'media', 1610 'themes', 1611 'about', 1612 'nav-menus', 1613 'widgets', 1614 'site-icon', 1615 'l10n', 1616 'install', 1617 'wp-color-picker', 1618 'customize-controls', 1619 'customize-widgets', 1620 'customize-nav-menus', 1621 'customize-preview', 1622 'login', 1623 'site-health', 1624 // Includes CSS. 1625 'buttons', 1626 'admin-bar', 1627 'wp-auth-check', 1628 'editor-buttons', 1629 'media-views', 1630 'wp-pointer', 1631 'wp-jquery-ui-dialog', 1632 // Package styles. 1633 'wp-reset-editor-styles', 1634 'wp-editor-classic-layout-styles', 1635 'wp-block-library-theme', 1636 'wp-edit-blocks', 1637 'wp-block-editor', 1638 'wp-block-library', 1639 'wp-block-directory', 1640 'wp-components', 1641 'wp-customize-widgets', 1642 'wp-edit-post', 1643 'wp-edit-widgets', 1644 'wp-editor', 1645 'wp-format-library', 1646 'wp-list-reusable-blocks', 1647 'wp-reusable-blocks', 1648 'wp-nux', 1649 'wp-widgets', 1650 // Deprecated CSS. 1651 'deprecated-media', 1652 'farbtastic', 1653 ); 1654 1655 foreach ( $rtl_styles as $rtl_style ) { 1656 $styles->add_data( $rtl_style, 'rtl', 'replace' ); 1657 if ( $suffix ) { 1658 $styles->add_data( $rtl_style, 'suffix', $suffix ); 1659 } 1660 } 1661 } 1662 1663 /** 1664 * Reorder JavaScript scripts array to place prototype before jQuery. 1665 * 1666 * @since 2.3.1 1667 * 1668 * @param array $js_array JavaScript scripts array 1669 * @return array Reordered array, if needed. 1670 */ 1671 function wp_prototype_before_jquery( $js_array ) { 1672 $prototype = array_search( 'prototype', $js_array, true ); 1673 1674 if ( false === $prototype ) { 1675 return $js_array; 1676 } 1677 1678 $jquery = array_search( 'jquery', $js_array, true ); 1679 1680 if ( false === $jquery ) { 1681 return $js_array; 1682 } 1683 1684 if ( $prototype < $jquery ) { 1685 return $js_array; 1686 } 1687 1688 unset( $js_array[ $prototype ] ); 1689 1690 array_splice( $js_array, $jquery, 0, 'prototype' ); 1691 1692 return $js_array; 1693 } 1694 1695 /** 1696 * Load localized data on print rather than initialization. 1697 * 1698 * These localizations require information that may not be loaded even by init. 1699 * 1700 * @since 2.5.0 1701 */ 1702 function wp_just_in_time_script_localization() { 1703 1704 wp_localize_script( 1705 'autosave', 1706 'autosaveL10n', 1707 array( 1708 'autosaveInterval' => AUTOSAVE_INTERVAL, 1709 'blog_id' => get_current_blog_id(), 1710 ) 1711 ); 1712 1713 wp_localize_script( 1714 'mce-view', 1715 'mceViewL10n', 1716 array( 1717 'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(), 1718 ) 1719 ); 1720 1721 wp_localize_script( 1722 'word-count', 1723 'wordCountL10n', 1724 array( 1725 /* 1726 * translators: If your word count is based on single characters (e.g. East Asian characters), 1727 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. 1728 * Do not translate into your own language. 1729 */ 1730 'type' => _x( 'words', 'Word count type. Do not translate!' ), 1731 'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(), 1732 ) 1733 ); 1734 } 1735 1736 /** 1737 * Localizes the jQuery UI datepicker. 1738 * 1739 * @since 4.6.0 1740 * 1741 * @link https://api.jqueryui.com/datepicker/#options 1742 * 1743 * @global WP_Locale $wp_locale WordPress date and time locale object. 1744 */ 1745 function wp_localize_jquery_ui_datepicker() { 1746 global $wp_locale; 1747 1748 if ( ! wp_script_is( 'jquery-ui-datepicker', 'enqueued' ) ) { 1749 return; 1750 } 1751 1752 // Convert the PHP date format into jQuery UI's format. 1753 $datepicker_date_format = str_replace( 1754 array( 1755 'd', 1756 'j', 1757 'l', 1758 'z', // Day. 1759 'F', 1760 'M', 1761 'n', 1762 'm', // Month. 1763 'Y', 1764 'y', // Year. 1765 ), 1766 array( 1767 'dd', 1768 'd', 1769 'DD', 1770 'o', 1771 'MM', 1772 'M', 1773 'm', 1774 'mm', 1775 'yy', 1776 'y', 1777 ), 1778 get_option( 'date_format' ) 1779 ); 1780 1781 $datepicker_defaults = wp_json_encode( 1782 array( 1783 'closeText' => __( 'Close' ), 1784 'currentText' => __( 'Today' ), 1785 'monthNames' => array_values( $wp_locale->month ), 1786 'monthNamesShort' => array_values( $wp_locale->month_abbrev ), 1787 'nextText' => __( 'Next' ), 1788 'prevText' => __( 'Previous' ), 1789 'dayNames' => array_values( $wp_locale->weekday ), 1790 'dayNamesShort' => array_values( $wp_locale->weekday_abbrev ), 1791 'dayNamesMin' => array_values( $wp_locale->weekday_initial ), 1792 'dateFormat' => $datepicker_date_format, 1793 'firstDay' => absint( get_option( 'start_of_week' ) ), 1794 'isRTL' => $wp_locale->is_rtl(), 1795 ) 1796 ); 1797 1798 wp_add_inline_script( 'jquery-ui-datepicker', "jQuery(document).ready(function(jQuery){jQuery.datepicker.setDefaults({$datepicker_defaults});});" ); 1799 } 1800 1801 /** 1802 * Localizes community events data that needs to be passed to dashboard.js. 1803 * 1804 * @since 4.8.0 1805 */ 1806 function wp_localize_community_events() { 1807 if ( ! wp_script_is( 'dashboard' ) ) { 1808 return; 1809 } 1810 1811 require_once ABSPATH . 'wp-admin/includes/class-wp-community-events.php'; 1812 1813 $user_id = get_current_user_id(); 1814 $saved_location = get_user_option( 'community-events-location', $user_id ); 1815 $saved_ip_address = isset( $saved_location['ip'] ) ? $saved_location['ip'] : false; 1816 $current_ip_address = WP_Community_Events::get_unsafe_client_ip(); 1817 1818 /* 1819 * If the user's location is based on their IP address, then update their 1820 * location when their IP address changes. This allows them to see events 1821 * in their current city when travelling. Otherwise, they would always be 1822 * shown events in the city where they were when they first loaded the 1823 * Dashboard, which could have been months or years ago. 1824 */ 1825 if ( $saved_ip_address && $current_ip_address && $current_ip_address !== $saved_ip_address ) { 1826 $saved_location['ip'] = $current_ip_address; 1827 update_user_meta( $user_id, 'community-events-location', $saved_location ); 1828 } 1829 1830 $events_client = new WP_Community_Events( $user_id, $saved_location ); 1831 1832 wp_localize_script( 1833 'dashboard', 1834 'communityEventsData', 1835 array( 1836 'nonce' => wp_create_nonce( 'community_events' ), 1837 'cache' => $events_client->get_cached_events(), 1838 'time_format' => get_option( 'time_format' ), 1839 ) 1840 ); 1841 } 1842 1843 /** 1844 * Administration Screen CSS for changing the styles. 1845 * 1846 * If installing the 'wp-admin/' directory will be replaced with './'. 1847 * 1848 * The $_wp_admin_css_colors global manages the Administration Screens CSS 1849 * stylesheet that is loaded. The option that is set is 'admin_color' and is the 1850 * color and key for the array. The value for the color key is an object with 1851 * a 'url' parameter that has the URL path to the CSS file. 1852 * 1853 * The query from $src parameter will be appended to the URL that is given from 1854 * the $_wp_admin_css_colors array value URL. 1855 * 1856 * @since 2.6.0 1857 * 1858 * @global array $_wp_admin_css_colors 1859 * 1860 * @param string $src Source URL. 1861 * @param string $handle Either 'colors' or 'colors-rtl'. 1862 * @return string|false URL path to CSS stylesheet for Administration Screens. 1863 */ 1864 function wp_style_loader_src( $src, $handle ) { 1865 global $_wp_admin_css_colors; 1866 1867 if ( wp_installing() ) { 1868 return preg_replace( '#^wp-admin/#', './', $src ); 1869 } 1870 1871 if ( 'colors' === $handle ) { 1872 $color = get_user_option( 'admin_color' ); 1873 1874 if ( empty( $color ) || ! isset( $_wp_admin_css_colors[ $color ] ) ) { 1875 $color = 'fresh'; 1876 } 1877 1878 $color = $_wp_admin_css_colors[ $color ]; 1879 $url = $color->url; 1880 1881 if ( ! $url ) { 1882 return false; 1883 } 1884 1885 $parsed = parse_url( $src ); 1886 if ( isset( $parsed['query'] ) && $parsed['query'] ) { 1887 wp_parse_str( $parsed['query'], $qv ); 1888 $url = add_query_arg( $qv, $url ); 1889 } 1890 1891 return $url; 1892 } 1893 1894 return $src; 1895 } 1896 1897 /** 1898 * Prints the script queue in the HTML head on admin pages. 1899 * 1900 * Postpones the scripts that were queued for the footer. 1901 * print_footer_scripts() is called in the footer to print these scripts. 1902 * 1903 * @since 2.8.0 1904 * 1905 * @see wp_print_scripts() 1906 * 1907 * @global bool $concatenate_scripts 1908 * 1909 * @return array 1910 */ 1911 function print_head_scripts() { 1912 global $concatenate_scripts; 1913 1914 if ( ! did_action( 'wp_print_scripts' ) ) { 1915 /** This action is documented in wp-includes/functions.wp-scripts.php */ 1916 do_action( 'wp_print_scripts' ); 1917 } 1918 1919 $wp_scripts = wp_scripts(); 1920 1921 script_concat_settings(); 1922 $wp_scripts->do_concat = $concatenate_scripts; 1923 $wp_scripts->do_head_items(); 1924 1925 /** 1926 * Filters whether to print the head scripts. 1927 * 1928 * @since 2.8.0 1929 * 1930 * @param bool $print Whether to print the head scripts. Default true. 1931 */ 1932 if ( apply_filters( 'print_head_scripts', true ) ) { 1933 _print_scripts(); 1934 } 1935 1936 $wp_scripts->reset(); 1937 return $wp_scripts->done; 1938 } 1939 1940 /** 1941 * Prints the scripts that were queued for the footer or too late for the HTML head. 1942 * 1943 * @since 2.8.0 1944 * 1945 * @global WP_Scripts $wp_scripts 1946 * @global bool $concatenate_scripts 1947 * 1948 * @return array 1949 */ 1950 function print_footer_scripts() { 1951 global $wp_scripts, $concatenate_scripts; 1952 1953 if ( ! ( $wp_scripts instanceof WP_Scripts ) ) { 1954 return array(); // No need to run if not instantiated. 1955 } 1956 script_concat_settings(); 1957 $wp_scripts->do_concat = $concatenate_scripts; 1958 $wp_scripts->do_footer_items(); 1959 1960 /** 1961 * Filters whether to print the footer scripts. 1962 * 1963 * @since 2.8.0 1964 * 1965 * @param bool $print Whether to print the footer scripts. Default true. 1966 */ 1967 if ( apply_filters( 'print_footer_scripts', true ) ) { 1968 _print_scripts(); 1969 } 1970 1971 $wp_scripts->reset(); 1972 return $wp_scripts->done; 1973 } 1974 1975 /** 1976 * Print scripts (internal use only) 1977 * 1978 * @ignore 1979 * 1980 * @global WP_Scripts $wp_scripts 1981 * @global bool $compress_scripts 1982 */ 1983 function _print_scripts() { 1984 global $wp_scripts, $compress_scripts; 1985 1986 $zip = $compress_scripts ? 1 : 0; 1987 if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) { 1988 $zip = 'gzip'; 1989 } 1990 1991 $concat = trim( $wp_scripts->concat, ', ' ); 1992 $type_attr = current_theme_supports( 'html5', 'script' ) ? '' : " type='text/javascript'"; 1993 1994 if ( $concat ) { 1995 if ( ! empty( $wp_scripts->print_code ) ) { 1996 echo "\n<script{$type_attr}>\n"; 1997 echo "/* <![CDATA[ */\n"; // Not needed in HTML 5. 1998 echo $wp_scripts->print_code; 1999 echo "/* ]]> */\n"; 2000 echo "</script>\n"; 2001 } 2002 2003 $concat = str_split( $concat, 128 ); 2004 $concatenated = ''; 2005 2006 foreach ( $concat as $key => $chunk ) { 2007 $concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}"; 2008 } 2009 2010 $src = $wp_scripts->base_url . "/wp-admin/load-scripts.php?c={$zip}" . $concatenated . '&ver=' . $wp_scripts->default_version; 2011 echo "<script{$type_attr} src='" . esc_attr( $src ) . "'></script>\n"; 2012 } 2013 2014 if ( ! empty( $wp_scripts->print_html ) ) { 2015 echo $wp_scripts->print_html; 2016 } 2017 } 2018 2019 /** 2020 * Prints the script queue in the HTML head on the front end. 2021 * 2022 * Postpones the scripts that were queued for the footer. 2023 * wp_print_footer_scripts() is called in the footer to print these scripts. 2024 * 2025 * @since 2.8.0 2026 * 2027 * @global WP_Scripts $wp_scripts 2028 * 2029 * @return array 2030 */ 2031 function wp_print_head_scripts() { 2032 if ( ! did_action( 'wp_print_scripts' ) ) { 2033 /** This action is documented in wp-includes/functions.wp-scripts.php */ 2034 do_action( 'wp_print_scripts' ); 2035 } 2036 2037 global $wp_scripts; 2038 2039 if ( ! ( $wp_scripts instanceof WP_Scripts ) ) { 2040 return array(); // No need to run if nothing is queued. 2041 } 2042 return print_head_scripts(); 2043 } 2044 2045 /** 2046 * Private, for use in *_footer_scripts hooks 2047 * 2048 * @since 3.3.0 2049 */ 2050 function _wp_footer_scripts() { 2051 print_late_styles(); 2052 print_footer_scripts(); 2053 } 2054 2055 /** 2056 * Hooks to print the scripts and styles in the footer. 2057 * 2058 * @since 2.8.0 2059 */ 2060 function wp_print_footer_scripts() { 2061 /** 2062 * Fires when footer scripts are printed. 2063 * 2064 * @since 2.8.0 2065 */ 2066 do_action( 'wp_print_footer_scripts' ); 2067 } 2068 2069 /** 2070 * Wrapper for do_action( 'wp_enqueue_scripts' ). 2071 * 2072 * Allows plugins to queue scripts for the front end using wp_enqueue_script(). 2073 * Runs first in wp_head() where all is_home(), is_page(), etc. functions are available. 2074 * 2075 * @since 2.8.0 2076 */ 2077 function wp_enqueue_scripts() { 2078 /** 2079 * Fires when scripts and styles are enqueued. 2080 * 2081 * @since 2.8.0 2082 */ 2083 do_action( 'wp_enqueue_scripts' ); 2084 } 2085 2086 /** 2087 * Prints the styles queue in the HTML head on admin pages. 2088 * 2089 * @since 2.8.0 2090 * 2091 * @global bool $concatenate_scripts 2092 * 2093 * @return array 2094 */ 2095 function print_admin_styles() { 2096 global $concatenate_scripts; 2097 2098 $wp_styles = wp_styles(); 2099 2100 script_concat_settings(); 2101 $wp_styles->do_concat = $concatenate_scripts; 2102 $wp_styles->do_items( false ); 2103 2104 /** 2105 * Filters whether to print the admin styles. 2106 * 2107 * @since 2.8.0 2108 * 2109 * @param bool $print Whether to print the admin styles. Default true. 2110 */ 2111 if ( apply_filters( 'print_admin_styles', true ) ) { 2112 _print_styles(); 2113 } 2114 2115 $wp_styles->reset(); 2116 return $wp_styles->done; 2117 } 2118 2119 /** 2120 * Prints the styles that were queued too late for the HTML head. 2121 * 2122 * @since 3.3.0 2123 * 2124 * @global WP_Styles $wp_styles 2125 * @global bool $concatenate_scripts 2126 * 2127 * @return array|void 2128 */ 2129 function print_late_styles() { 2130 global $wp_styles, $concatenate_scripts; 2131 2132 if ( ! ( $wp_styles instanceof WP_Styles ) ) { 2133 return; 2134 } 2135 2136 script_concat_settings(); 2137 $wp_styles->do_concat = $concatenate_scripts; 2138 $wp_styles->do_footer_items(); 2139 2140 /** 2141 * Filters whether to print the styles queued too late for the HTML head. 2142 * 2143 * @since 3.3.0 2144 * 2145 * @param bool $print Whether to print the 'late' styles. Default true. 2146 */ 2147 if ( apply_filters( 'print_late_styles', true ) ) { 2148 _print_styles(); 2149 } 2150 2151 $wp_styles->reset(); 2152 return $wp_styles->done; 2153 } 2154 2155 /** 2156 * Print styles (internal use only) 2157 * 2158 * @ignore 2159 * @since 3.3.0 2160 * 2161 * @global bool $compress_css 2162 */ 2163 function _print_styles() { 2164 global $compress_css; 2165 2166 $wp_styles = wp_styles(); 2167 2168 $zip = $compress_css ? 1 : 0; 2169 if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) { 2170 $zip = 'gzip'; 2171 } 2172 2173 $concat = trim( $wp_styles->concat, ', ' ); 2174 $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; 2175 2176 if ( $concat ) { 2177 $dir = $wp_styles->text_direction; 2178 $ver = $wp_styles->default_version; 2179 2180 $concat = str_split( $concat, 128 ); 2181 $concatenated = ''; 2182 2183 foreach ( $concat as $key => $chunk ) { 2184 $concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}"; 2185 } 2186 2187 $href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}" . $concatenated . '&ver=' . $ver; 2188 echo "<link rel='stylesheet' href='" . esc_attr( $href ) . "'{$type_attr} media='all' />\n"; 2189 2190 if ( ! empty( $wp_styles->print_code ) ) { 2191 echo "<style{$type_attr}>\n"; 2192 echo $wp_styles->print_code; 2193 echo "\n</style>\n"; 2194 } 2195 } 2196 2197 if ( ! empty( $wp_styles->print_html ) ) { 2198 echo $wp_styles->print_html; 2199 } 2200 } 2201 2202 /** 2203 * Determine the concatenation and compression settings for scripts and styles. 2204 * 2205 * @since 2.8.0 2206 * 2207 * @global bool $concatenate_scripts 2208 * @global bool $compress_scripts 2209 * @global bool $compress_css 2210 */ 2211 function script_concat_settings() { 2212 global $concatenate_scripts, $compress_scripts, $compress_css; 2213 2214 $compressed_output = ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' === ini_get( 'output_handler' ) ); 2215 2216 if ( ! isset( $concatenate_scripts ) ) { 2217 $concatenate_scripts = defined( 'CONCATENATE_SCRIPTS' ) ? CONCATENATE_SCRIPTS : true; 2218 if ( ( ! is_admin() && ! did_action( 'login_init' ) ) || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) { 2219 $concatenate_scripts = false; 2220 } 2221 } 2222 2223 if ( ! isset( $compress_scripts ) ) { 2224 $compress_scripts = defined( 'COMPRESS_SCRIPTS' ) ? COMPRESS_SCRIPTS : true; 2225 if ( $compress_scripts && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) { 2226 $compress_scripts = false; 2227 } 2228 } 2229 2230 if ( ! isset( $compress_css ) ) { 2231 $compress_css = defined( 'COMPRESS_CSS' ) ? COMPRESS_CSS : true; 2232 if ( $compress_css && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) { 2233 $compress_css = false; 2234 } 2235 } 2236 } 2237 2238 /** 2239 * Handles the enqueueing of block scripts and styles that are common to both 2240 * the editor and the front-end. 2241 * 2242 * @since 5.0.0 2243 * 2244 * @global WP_Screen $current_screen WordPress current screen object. 2245 */ 2246 function wp_common_block_scripts_and_styles() { 2247 if ( is_admin() && ! wp_should_load_block_editor_scripts_and_styles() ) { 2248 return; 2249 } 2250 2251 wp_enqueue_style( 'wp-block-library' ); 2252 2253 if ( current_theme_supports( 'wp-block-styles' ) ) { 2254 wp_enqueue_style( 'wp-block-library-theme' ); 2255 } 2256 2257 /** 2258 * Fires after enqueuing block assets for both editor and front-end. 2259 * 2260 * Call `add_action` on any hook before 'wp_enqueue_scripts'. 2261 * 2262 * In the function call you supply, simply use `wp_enqueue_script` and 2263 * `wp_enqueue_style` to add your functionality to the Gutenberg editor. 2264 * 2265 * @since 5.0.0 2266 */ 2267 do_action( 'enqueue_block_assets' ); 2268 } 2269 2270 /** 2271 * Enqueues the global styles defined via theme.json. 2272 * 2273 * @since 5.8.0 2274 */ 2275 function wp_enqueue_global_styles() { 2276 if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) { 2277 return; 2278 } 2279 2280 $separate_assets = wp_should_load_separate_core_block_assets(); 2281 2282 /* 2283 * Global styles should be printed in the head when loading all styles combined. 2284 * The footer should only be used to print global styles for classic themes with separate core assets enabled. 2285 * 2286 * See https://core.trac.wordpress.org/ticket/53494. 2287 */ 2288 if ( ( ! $separate_assets && doing_action( 'wp_footer' ) ) || ( $separate_assets && doing_action( 'wp_enqueue_scripts' ) ) ) { 2289 return; 2290 } 2291 2292 $can_use_cache = ( 2293 ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) && 2294 ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) && 2295 ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) && 2296 ! is_admin() 2297 ); 2298 2299 $stylesheet = null; 2300 if ( $can_use_cache ) { 2301 $cache = get_transient( 'global_styles' ); 2302 if ( $cache ) { 2303 $stylesheet = $cache; 2304 } 2305 } 2306 2307 if ( null === $stylesheet ) { 2308 $settings = get_default_block_editor_settings(); 2309 $theme_json = WP_Theme_JSON_Resolver::get_merged_data( $settings ); 2310 $stylesheet = $theme_json->get_stylesheet(); 2311 2312 if ( $can_use_cache ) { 2313 set_transient( 'global_styles', $stylesheet, MINUTE_IN_SECONDS ); 2314 } 2315 } 2316 2317 if ( empty( $stylesheet ) ) { 2318 return; 2319 } 2320 2321 wp_register_style( 'global-styles', false, array(), true, true ); 2322 wp_add_inline_style( 'global-styles', $stylesheet ); 2323 wp_enqueue_style( 'global-styles' ); 2324 } 2325 2326 /** 2327 * Checks if the editor scripts and styles for all registered block types 2328 * should be enqueued on the current screen. 2329 * 2330 * @since 5.6.0 2331 * 2332 * @return bool Whether scripts and styles should be enqueued. 2333 */ 2334 function wp_should_load_block_editor_scripts_and_styles() { 2335 global $current_screen; 2336 2337 $is_block_editor_screen = ( $current_screen instanceof WP_Screen ) && $current_screen->is_block_editor(); 2338 2339 /** 2340 * Filters the flag that decides whether or not block editor scripts and styles 2341 * are going to be enqueued on the current screen. 2342 * 2343 * @since 5.6.0 2344 * 2345 * @param bool $is_block_editor_screen Current value of the flag. 2346 */ 2347 return apply_filters( 'should_load_block_editor_scripts_and_styles', $is_block_editor_screen ); 2348 } 2349 2350 /** 2351 * Checks whether separate styles should be loaded for core blocks on-render. 2352 * 2353 * When this function returns true, other functions ensure that core blocks 2354 * only load their assets on-render, and each block loads its own, individual 2355 * assets. Third-party blocks only load their assets when rendered. 2356 * 2357 * When this function returns false, all core block assets are loaded regardless 2358 * of whether they are rendered in a page or not, because they are all part of 2359 * the `block-library/style.css` file. Assets for third-party blocks are always 2360 * enqueued regardless of whether they are rendered or not. 2361 * 2362 * This only affects front end and not the block editor screens. 2363 * 2364 * @see wp_enqueue_registered_block_scripts_and_styles() 2365 * @see register_block_style_handle() 2366 * 2367 * @since 5.8.0 2368 * 2369 * @return bool Whether separate assets will be loaded. 2370 */ 2371 function wp_should_load_separate_core_block_assets() { 2372 if ( is_admin() || is_feed() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { 2373 return false; 2374 } 2375 2376 /** 2377 * Filters whether block styles should be loaded separately. 2378 * 2379 * Returning false loads all core block assets, regardless of whether they are rendered 2380 * in a page or not. Returning true loads core block assets only when they are rendered. 2381 * 2382 * @since 5.8.0 2383 * 2384 * @param bool $load_separate_assets Whether separate assets will be loaded. 2385 * Default false (all block assets are loaded, even when not used). 2386 */ 2387 return apply_filters( 'should_load_separate_core_block_assets', false ); 2388 } 2389 2390 /** 2391 * Enqueues registered block scripts and styles, depending on current rendered 2392 * context (only enqueuing editor scripts while in context of the editor). 2393 * 2394 * @since 5.0.0 2395 * 2396 * @global WP_Screen $current_screen WordPress current screen object. 2397 */ 2398 function wp_enqueue_registered_block_scripts_and_styles() { 2399 global $current_screen; 2400 2401 if ( wp_should_load_separate_core_block_assets() ) { 2402 return; 2403 } 2404 2405 $load_editor_scripts = is_admin() && wp_should_load_block_editor_scripts_and_styles(); 2406 2407 $block_registry = WP_Block_Type_Registry::get_instance(); 2408 foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) { 2409 // Front-end styles. 2410 if ( ! empty( $block_type->style ) ) { 2411 wp_enqueue_style( $block_type->style ); 2412 } 2413 2414 // Front-end script. 2415 if ( ! empty( $block_type->script ) ) { 2416 wp_enqueue_script( $block_type->script ); 2417 } 2418 2419 // Editor styles. 2420 if ( $load_editor_scripts && ! empty( $block_type->editor_style ) ) { 2421 wp_enqueue_style( $block_type->editor_style ); 2422 } 2423 2424 // Editor script. 2425 if ( $load_editor_scripts && ! empty( $block_type->editor_script ) ) { 2426 wp_enqueue_script( $block_type->editor_script ); 2427 } 2428 } 2429 } 2430 2431 /** 2432 * Function responsible for enqueuing the styles required for block styles functionality on the editor and on the frontend. 2433 * 2434 * @since 5.3.0 2435 */ 2436 function enqueue_block_styles_assets() { 2437 $block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered(); 2438 2439 foreach ( $block_styles as $block_name => $styles ) { 2440 foreach ( $styles as $style_properties ) { 2441 if ( isset( $style_properties['style_handle'] ) ) { 2442 2443 // If the site loads separate styles per-block, enqueue the stylesheet on render. 2444 if ( wp_should_load_separate_core_block_assets() ) { 2445 add_filter( 2446 'render_block', 2447 function( $html, $block ) use ( $style_properties ) { 2448 wp_enqueue_style( $style_properties['style_handle'] ); 2449 return $html; 2450 } 2451 ); 2452 } else { 2453 wp_enqueue_style( $style_properties['style_handle'] ); 2454 } 2455 } 2456 if ( isset( $style_properties['inline_style'] ) ) { 2457 2458 // Default to "wp-block-library". 2459 $handle = 'wp-block-library'; 2460 2461 // If the site loads separate styles per-block, check if the block has a stylesheet registered. 2462 if ( wp_should_load_separate_core_block_assets() ) { 2463 $block_stylesheet_handle = generate_block_asset_handle( $block_name, 'style' ); 2464 global $wp_styles; 2465 if ( isset( $wp_styles->registered[ $block_stylesheet_handle ] ) ) { 2466 $handle = $block_stylesheet_handle; 2467 } 2468 } 2469 2470 // Add inline styles to the calculated handle. 2471 wp_add_inline_style( $handle, $style_properties['inline_style'] ); 2472 } 2473 } 2474 } 2475 } 2476 2477 /** 2478 * Function responsible for enqueuing the assets required for block styles functionality on the editor. 2479 * 2480 * @since 5.3.0 2481 */ 2482 function enqueue_editor_block_styles_assets() { 2483 $block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered(); 2484 2485 $register_script_lines = array( '( function() {' ); 2486 foreach ( $block_styles as $block_name => $styles ) { 2487 foreach ( $styles as $style_properties ) { 2488 $block_style = array( 2489 'name' => $style_properties['name'], 2490 'label' => $style_properties['label'], 2491 ); 2492 if ( isset( $style_properties['is_default'] ) ) { 2493 $block_style['isDefault'] = $style_properties['is_default']; 2494 } 2495 $register_script_lines[] = sprintf( 2496 ' wp.blocks.registerBlockStyle( \'%s\', %s );', 2497 $block_name, 2498 wp_json_encode( $block_style ) 2499 ); 2500 } 2501 } 2502 $register_script_lines[] = '} )();'; 2503 $inline_script = implode( "\n", $register_script_lines ); 2504 2505 wp_register_script( 'wp-block-styles', false, array( 'wp-blocks' ), true, true ); 2506 wp_add_inline_script( 'wp-block-styles', $inline_script ); 2507 wp_enqueue_script( 'wp-block-styles' ); 2508 } 2509 2510 /** 2511 * Enqueues the assets required for the block directory within the block editor. 2512 * 2513 * @since 5.5.0 2514 */ 2515 function wp_enqueue_editor_block_directory_assets() { 2516 wp_enqueue_script( 'wp-block-directory' ); 2517 wp_enqueue_style( 'wp-block-directory' ); 2518 } 2519 2520 /** 2521 * Enqueues the assets required for the format library within the block editor. 2522 * 2523 * @since 5.8.0 2524 */ 2525 function wp_enqueue_editor_format_library_assets() { 2526 wp_enqueue_script( 'wp-format-library' ); 2527 wp_enqueue_style( 'wp-format-library' ); 2528 } 2529 2530 /** 2531 * Sanitizes an attributes array into an attributes string to be placed inside a `<script>` tag. 2532 * 2533 * Automatically injects type attribute if needed. 2534 * Used by {@see wp_get_script_tag()} and {@see wp_get_inline_script_tag()}. 2535 * 2536 * @since 5.7.0 2537 * 2538 * @param array $attributes Key-value pairs representing `<script>` tag attributes. 2539 * @return string String made of sanitized `<script>` tag attributes. 2540 */ 2541 function wp_sanitize_script_attributes( $attributes ) { 2542 $html5_script_support = ! is_admin() && ! current_theme_supports( 'html5', 'script' ); 2543 $attributes_string = ''; 2544 2545 // If HTML5 script tag is supported, only the attribute name is added 2546 // to $attributes_string for entries with a boolean value, and that are true. 2547 foreach ( $attributes as $attribute_name => $attribute_value ) { 2548 if ( is_bool( $attribute_value ) ) { 2549 if ( $attribute_value ) { 2550 $attributes_string .= $html5_script_support ? sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_name ) ) : ' ' . esc_attr( $attribute_name ); 2551 } 2552 } else { 2553 $attributes_string .= sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_value ) ); 2554 } 2555 } 2556 2557 return $attributes_string; 2558 } 2559 2560 /** 2561 * Formats `<script>` loader tags. 2562 * 2563 * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter. 2564 * Automatically injects type attribute if needed. 2565 * 2566 * @since 5.7.0 2567 * 2568 * @param array $attributes Key-value pairs representing `<script>` tag attributes. 2569 * @return string String containing `<script>` opening and closing tags. 2570 */ 2571 function wp_get_script_tag( $attributes ) { 2572 if ( ! isset( $attributes['type'] ) && ! is_admin() && ! current_theme_supports( 'html5', 'script' ) ) { 2573 $attributes['type'] = 'text/javascript'; 2574 } 2575 /** 2576 * Filters attributes to be added to a script tag. 2577 * 2578 * @since 5.7.0 2579 * 2580 * @param array $attributes Key-value pairs representing `<script>` tag attributes. 2581 * Only the attribute name is added to the `<script>` tag for 2582 * entries with a boolean value, and that are true. 2583 */ 2584 $attributes = apply_filters( 'wp_script_attributes', $attributes ); 2585 2586 return sprintf( "<script%s></script>\n", wp_sanitize_script_attributes( $attributes ) ); 2587 } 2588 2589 /** 2590 * Prints formatted `<script>` loader tag. 2591 * 2592 * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter. 2593 * Automatically injects type attribute if needed. 2594 * 2595 * @since 5.7.0 2596 * 2597 * @param array $attributes Key-value pairs representing `<script>` tag attributes. 2598 */ 2599 function wp_print_script_tag( $attributes ) { 2600 echo wp_get_script_tag( $attributes ); 2601 } 2602 2603 /** 2604 * Wraps inline JavaScript in `<script>` tag. 2605 * 2606 * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter. 2607 * Automatically injects type attribute if needed. 2608 * 2609 * @since 5.7.0 2610 * 2611 * @param string $javascript Inline JavaScript code. 2612 * @param array $attributes Optional. Key-value pairs representing `<script>` tag attributes. 2613 * @return string String containing inline JavaScript code wrapped around `<script>` tag. 2614 */ 2615 function wp_get_inline_script_tag( $javascript, $attributes = array() ) { 2616 if ( ! isset( $attributes['type'] ) && ! is_admin() && ! current_theme_supports( 'html5', 'script' ) ) { 2617 $attributes['type'] = 'text/javascript'; 2618 } 2619 /** 2620 * Filters attributes to be added to a script tag. 2621 * 2622 * @since 5.7.0 2623 * 2624 * @param array $attributes Key-value pairs representing `<script>` tag attributes. 2625 * Only the attribute name is added to the `<script>` tag for 2626 * entries with a boolean value, and that are true. 2627 */ 2628 $attributes = apply_filters( 'wp_inline_script_attributes', $attributes, $javascript ); 2629 2630 $javascript = "\n" . trim( $javascript, "\n\r " ) . "\n"; 2631 2632 return sprintf( "<script%s>%s</script>\n", wp_sanitize_script_attributes( $attributes ), $javascript ); 2633 } 2634 2635 /** 2636 * Prints inline JavaScript wrapped in `<script>` tag. 2637 * 2638 * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter. 2639 * Automatically injects type attribute if needed. 2640 * 2641 * @since 5.7.0 2642 * 2643 * @param string $javascript Inline JavaScript code. 2644 * @param array $attributes Optional. Key-value pairs representing `<script>` tag attributes. 2645 */ 2646 function wp_print_inline_script_tag( $javascript, $attributes = array() ) { 2647 echo wp_get_inline_script_tag( $javascript, $attributes ); 2648 } 2649 2650 /** 2651 * Allows small styles to be inlined. 2652 * 2653 * This improves performance and sustainability, and is opt-in. Stylesheets can opt in 2654 * by adding `path` data using `wp_style_add_data`, and defining the file's absolute path: 2655 * 2656 * wp_style_add_data( $style_handle, 'path', $file_path ); 2657 * 2658 * @since 5.8.0 2659 * 2660 * @global WP_Styles $wp_styles 2661 */ 2662 function wp_maybe_inline_styles() { 2663 global $wp_styles; 2664 2665 $total_inline_limit = 20000; 2666 /** 2667 * The maximum size of inlined styles in bytes. 2668 * 2669 * @since 5.8.0 2670 * 2671 * @param int $total_inline_limit The file-size threshold, in bytes. Default 20000. 2672 */ 2673 $total_inline_limit = apply_filters( 'styles_inline_size_limit', $total_inline_limit ); 2674 2675 $styles = array(); 2676 2677 // Build an array of styles that have a path defined. 2678 foreach ( $wp_styles->queue as $handle ) { 2679 if ( wp_styles()->get_data( $handle, 'path' ) && file_exists( $wp_styles->registered[ $handle ]->extra['path'] ) ) { 2680 $styles[] = array( 2681 'handle' => $handle, 2682 'path' => $wp_styles->registered[ $handle ]->extra['path'], 2683 'size' => filesize( $wp_styles->registered[ $handle ]->extra['path'] ), 2684 ); 2685 } 2686 } 2687 2688 if ( ! empty( $styles ) ) { 2689 // Reorder styles array based on size. 2690 usort( 2691 $styles, 2692 function( $a, $b ) { 2693 return ( $a['size'] <= $b['size'] ) ? -1 : 1; 2694 } 2695 ); 2696 2697 /* 2698 * The total inlined size. 2699 * 2700 * On each iteration of the loop, if a style gets added inline the value of this var increases 2701 * to reflect the total size of inlined styles. 2702 */ 2703 $total_inline_size = 0; 2704 2705 // Loop styles. 2706 foreach ( $styles as $style ) { 2707 2708 // Size check. Since styles are ordered by size, we can break the loop. 2709 if ( $total_inline_size + $style['size'] > $total_inline_limit ) { 2710 break; 2711 } 2712 2713 // Get the styles if we don't already have them. 2714 $style['css'] = file_get_contents( $style['path'] ); 2715 2716 // Set `src` to `false` and add styles inline. 2717 $wp_styles->registered[ $style['handle'] ]->src = false; 2718 if ( empty( $wp_styles->registered[ $style['handle'] ]->extra['after'] ) ) { 2719 $wp_styles->registered[ $style['handle'] ]->extra['after'] = array(); 2720 } 2721 array_unshift( $wp_styles->registered[ $style['handle'] ]->extra['after'], $style['css'] ); 2722 2723 // Add the styles size to the $total_inline_size var. 2724 $total_inline_size += (int) $style['size']; 2725 } 2726 } 2727 } 2728 2729 /** 2730 * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script. 2731 * 2732 * @since 5.8.0 2733 */ 2734 function wp_add_iframed_editor_assets_html() { 2735 if ( ! wp_should_load_block_editor_scripts_and_styles() ) { 2736 return; 2737 } 2738 2739 $script_handles = array(); 2740 $style_handles = array( 2741 'wp-block-editor', 2742 'wp-block-library', 2743 'wp-block-library-theme', 2744 'wp-edit-blocks', 2745 ); 2746 2747 $block_registry = WP_Block_Type_Registry::get_instance(); 2748 2749 foreach ( $block_registry->get_all_registered() as $block_type ) { 2750 if ( ! empty( $block_type->style ) ) { 2751 $style_handles[] = $block_type->style; 2752 } 2753 2754 if ( ! empty( $block_type->editor_style ) ) { 2755 $style_handles[] = $block_type->editor_style; 2756 } 2757 2758 if ( ! empty( $block_type->script ) ) { 2759 $script_handles[] = $block_type->script; 2760 } 2761 } 2762 2763 $style_handles = array_unique( $style_handles ); 2764 $done = wp_styles()->done; 2765 2766 ob_start(); 2767 2768 wp_styles()->done = array(); 2769 wp_styles()->do_items( $style_handles ); 2770 wp_styles()->done = $done; 2771 2772 $styles = ob_get_clean(); 2773 2774 $script_handles = array_unique( $script_handles ); 2775 $done = wp_scripts()->done; 2776 2777 ob_start(); 2778 2779 wp_scripts()->done = array(); 2780 wp_scripts()->do_items( $script_handles ); 2781 wp_scripts()->done = $done; 2782 2783 $scripts = ob_get_clean(); 2784 2785 $editor_assets = wp_json_encode( 2786 array( 2787 'styles' => $styles, 2788 'scripts' => $scripts, 2789 ) 2790 ); 2791 2792 echo "<script>window.__editorAssets = $editor_assets</script>"; 2793 }