*
* @since 3.4.0
*
+ * @global array $wp_theme_directories
+ * @staticvar array $_themes
+ *
* @param array $args The search arguments. Optional.
* - errors mixed True to return themes with errors, false to return themes without errors, null
* to return all themes. Defaults to false.
* to return only network-allowed themes. Null to return all themes. Defaults to null.
* - blog_id int (Multisite) The blog ID used to calculate which themes are allowed. Defaults to 0,
* synonymous for the current blog.
- * @return Array of WP_Theme objects.
+ * @return array Array of WP_Theme objects.
*/
function wp_get_themes( $args = array() ) {
global $wp_theme_directories;
*
* @since 3.4.0
*
+ * @global array $wp_theme_directories
+ *
* @param string $stylesheet Directory name for the theme. Optional. Defaults to current theme.
* @param string $theme_root Absolute path of the theme root to look in. Optional. If not specified, get_raw_theme_root()
- * is used to calculate the theme root for the $stylesheet provided (or current theme).
+ * is used to calculate the theme root for the $stylesheet provided (or current theme).
* @return WP_Theme Theme object. Be sure to check the object's exists() method if you need to confirm the theme's existence.
*/
function wp_get_theme( $stylesheet = null, $theme_root = null ) {
*
* @since 2.1.0
*
+ * @global WP_Locale $wp_locale
+ *
* @return string
*/
function get_locale_stylesheet_uri() {
*
* @since 2.9.0
*
+ * @global array $wp_theme_directories
+ *
* @return array|string An array of theme roots keyed by template/stylesheet or a single theme root if all themes have the same root.
*/
function get_theme_roots() {
*
* @since 2.9.0
*
+ * @global array $wp_theme_directories
+ *
* @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR
* @return bool
*/
*
* @since 2.9.0
*
+ * @global array $wp_theme_directories
+ * @staticvar array $found_themes
+ *
* @param bool $force Optional. Whether to force a new directory scan. Defaults to false.
- * @return array Valid themes found
+ * @return array|false Valid themes found
*/
function search_theme_directories( $force = false ) {
global $wp_theme_directories;
+ static $found_themes = null;
+
if ( empty( $wp_theme_directories ) )
return false;
- static $found_themes;
if ( ! $force && isset( $found_themes ) )
return $found_themes;
$found_themes = array();
$wp_theme_directories = (array) $wp_theme_directories;
+ $relative_theme_roots = array();
// Set up maybe-relative, maybe-absolute array of theme directories.
// We always want to return absolute, but we need to cache relative
*
* @since 1.5.0
*
+ * @global array $wp_theme_directories
+ *
* @param string $stylesheet_or_template The stylesheet or template name of the theme
* @return string Theme path.
*/
*
* @since 1.5.0
*
+ * @global array $wp_theme_directories
+ *
* @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.
- * Default is to leverage the main theme root.
- * @param string $theme_root Optional. The theme root for which calculations will be based, preventing
- * the need for a get_raw_theme_root() call.
+ * Default is to leverage the main theme root.
+ * @param string $theme_root Optional. The theme root for which calculations will be based, preventing
+ * the need for a get_raw_theme_root() call.
* @return string Themes URI.
*/
function get_theme_root_uri( $stylesheet_or_template = false, $theme_root = false ) {
*
* @since 3.1.0
*
+ * @global array $wp_theme_directories
+ *
* @param string $stylesheet_or_template The stylesheet or template name of the theme
- * @param bool $skip_cache Optional. Whether to skip the cache. Defaults to false, meaning the cache is used.
+ * @param bool $skip_cache Optional. Whether to skip the cache.
+ * Defaults to false, meaning the cache is used.
* @return string Theme root
*/
function get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) {
echo '<link rel="stylesheet" href="' . $stylesheet . '" type="text/css" media="screen" />';
}
-/**
- * Start preview theme output buffer.
- *
- * Will only perform task if the user has permissions and template and preview
- * query variables exist.
- *
- * @since 2.6.0
- */
-function preview_theme() {
- if ( ! (isset($_GET['template']) && isset($_GET['preview'])) )
- return;
-
- if ( !current_user_can( 'switch_themes' ) )
- return;
-
- // Admin Thickbox requests
- if ( isset( $_GET['preview_iframe'] ) )
- show_admin_bar( false );
-
- $_GET['template'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['template']);
-
- if ( validate_file($_GET['template']) )
- return;
-
- add_filter( 'template', '_preview_theme_template_filter' );
-
- if ( isset($_GET['stylesheet']) ) {
- $_GET['stylesheet'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['stylesheet']);
- if ( validate_file($_GET['stylesheet']) )
- return;
- add_filter( 'stylesheet', '_preview_theme_stylesheet_filter' );
- }
-
- // Prevent theme mods to current theme being used on theme being previewed
- add_filter( 'pre_option_theme_mods_' . get_option( 'stylesheet' ), '__return_empty_array' );
-
- ob_start( 'preview_theme_ob_filter' );
-}
-add_action('setup_theme', 'preview_theme');
-
-/**
- * Private function to modify the current template when previewing a theme
- *
- * @since 2.9.0
- * @access private
- *
- * @return string
- */
-function _preview_theme_template_filter() {
- return isset($_GET['template']) ? $_GET['template'] : '';
-}
-
-/**
- * Private function to modify the current stylesheet when previewing a theme
- *
- * @since 2.9.0
- * @access private
- *
- * @return string
- */
-function _preview_theme_stylesheet_filter() {
- return isset($_GET['stylesheet']) ? $_GET['stylesheet'] : '';
-}
-
-/**
- * Callback function for ob_start() to capture all links in the theme.
- *
- * @since 2.6.0
- * @access private
- *
- * @param string $content
- * @return string
- */
-function preview_theme_ob_filter( $content ) {
- return preg_replace_callback( "|(<a.*?href=([\"']))(.*?)([\"'].*?>)|", 'preview_theme_ob_filter_callback', $content );
-}
-
-/**
- * Manipulates preview theme links in order to control and maintain location.
- *
- * Callback function for preg_replace_callback() to accept and filter matches.
- *
- * @since 2.6.0
- * @access private
- *
- * @param array $matches
- * @return string
- */
-function preview_theme_ob_filter_callback( $matches ) {
- if ( strpos($matches[4], 'onclick') !== false )
- $matches[4] = preg_replace('#onclick=([\'"]).*?(?<!\\\)\\1#i', '', $matches[4]); //Strip out any onclicks from rest of <a>. (?<!\\\) means to ignore the '" if it's escaped by \ to prevent breaking mid-attribute.
- if (
- ( false !== strpos($matches[3], '/wp-admin/') )
- ||
- ( false !== strpos( $matches[3], '://' ) && 0 !== strpos( $matches[3], home_url() ) )
- ||
- ( false !== strpos($matches[3], '/feed/') )
- ||
- ( false !== strpos($matches[3], '/trackback/') )
- )
- return $matches[1] . "#$matches[2] onclick=$matches[2]return false;" . $matches[4];
-
- $stylesheet = isset( $_GET['stylesheet'] ) ? $_GET['stylesheet'] : '';
- $template = isset( $_GET['template'] ) ? $_GET['template'] : '';
-
- $link = add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => 1 ), $matches[3] );
- if ( 0 === strpos($link, 'preview=1') )
- $link = "?$link";
- return $matches[1] . esc_attr( $link ) . $matches[4];
-}
-
/**
* Switches the theme.
*
*
* @since 2.5.0
*
+ * @global array $wp_theme_directories
+ * @global WP_Customize_Manager $wp_customize
+ * @global array $sidebars_widgets
+ *
* @param string $stylesheet Stylesheet name
*/
function switch_theme( $stylesheet ) {
*
* @since 3.1.0
*
- * @return array|null Theme modifications.
+ * @return array|void Theme modifications.
*/
function get_theme_mods() {
$theme_slug = get_option( 'stylesheet' );
- if ( false === ( $mods = get_option( "theme_mods_$theme_slug" ) ) ) {
+ $mods = get_option( "theme_mods_$theme_slug" );
+ if ( false === $mods ) {
$theme_name = get_option( 'current_theme' );
if ( false === $theme_name )
$theme_name = wp_get_theme()->get('Name');
*
* @since 2.1.0
*
- * @param string $name Theme modification name.
+ * @param string $name Theme modification name.
* @param bool|string $default
* @return string
*/
*
* @since 2.1.0
*
- * @param string $name Theme modification name.
- * @param string $value theme modification value.
+ * @param string $name Theme modification name.
+ * @param mixed $value Theme modification value.
*/
function set_theme_mod( $name, $value ) {
$mods = get_theme_mods();
* @since 2.1.0
*
* @param string $name Theme modification name.
- * @return null
*/
function remove_theme_mod( $name ) {
$mods = get_theme_mods();
unset( $mods[ $name ] );
- if ( empty( $mods ) )
- return remove_theme_mods();
-
+ if ( empty( $mods ) ) {
+ remove_theme_mods();
+ return;
+ }
$theme = get_option( 'stylesheet' );
update_option( "theme_mods_$theme", $mods );
}
return false;
$text_color = get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) );
- return 'blank' != $text_color;
+ return 'blank' !== $text_color;
+}
+
+/**
+ * Check whether a header image is set or not.
+ *
+ * @since 4.2.0
+ *
+ * @see get_header_image()
+ *
+ * @return bool Whether a header image is set or not.
+ */
+function has_header_image() {
+ return (bool) get_header_image();
}
/**
*
* @since 2.1.0
*
- * @return string
+ * @return string|false
*/
function get_header_image() {
$url = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );
*
* @access private
*
- * @return string Path to header image
+ * @global array $_wp_default_headers
+ * @staticvar object $_wp_random_header
+ *
+ * @return object
*/
-
function _get_random_header_data() {
- static $_wp_random_header;
+ static $_wp_random_header = null;
if ( empty( $_wp_random_header ) ) {
global $_wp_default_headers;
*
* @return string Path to header image
*/
-
function get_random_header_image() {
$random_image = _get_random_header_data();
if ( empty( $random_image->url ) )
* @since 3.2.0
*
* @param string $type The random pool to use. any|default|uploaded
- * @return boolean
+ * @return bool
*/
function is_random_header_image( $type = 'any' ) {
$header_image_mod = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );
* @since 2.1.0
*/
function header_image() {
- echo esc_url( get_header_image() );
+ $image = get_header_image();
+ if ( $image ) {
+ echo esc_url( $image );
+ }
}
/**
$url = esc_url_raw( wp_get_attachment_url( $header->ID ) );
$header_data = wp_get_attachment_metadata( $header->ID );
$header_index = basename($url);
+
$header_images[$header_index] = array();
- $header_images[$header_index]['attachment_id'] = $header->ID;
+ $header_images[$header_index]['attachment_id'] = $header->ID;
$header_images[$header_index]['url'] = $url;
- $header_images[$header_index]['thumbnail_url'] = $url;
+ $header_images[$header_index]['thumbnail_url'] = $url;
+ $header_images[$header_index]['alt_text'] = get_post_meta( $header->ID, '_wp_attachment_image_alt', true );
+
if ( isset( $header_data['width'] ) )
$header_images[$header_index]['width'] = $header_data['width'];
if ( isset( $header_data['height'] ) )
*
* @since 3.4.0
*
+ * @global array $_wp_default_headers
+ *
* @return object
*/
function get_custom_header() {
*
* @since 3.0.0
*
+ * @global array $_wp_default_headers
+ *
* @param array $headers Array of headers keyed by a string id. The ids point to arrays containing 'url', 'thumbnail_url', and 'description' keys.
*/
function register_default_headers( $headers ) {
* @see register_default_headers()
* @since 3.0.0
*
+ * @global array $_wp_default_headers
+ *
* @param string|array $header The header string id (key of array) to remove, or an array thereof.
* @return bool|void A single header returns true on success, false on failure.
* There is currently no return value for multiple headers.
*
* @since 3.0.0
*
+ * @global array $editor_styles
+ *
* @param array|string $stylesheet Optional. Stylesheet name or array thereof, relative to theme root.
- * Defaults to 'editor-style.css'
+ * Defaults to 'editor-style.css'
*/
function add_editor_style( $stylesheet = 'editor-style.css' ) {
-
add_theme_support( 'editor-style' );
if ( ! is_admin() )
*
* @since 3.1.0
*
+ * @global array $editor_styles
+ *
* @return bool True on success, false if there were no stylesheets to remove.
*/
function remove_editor_styles() {
*
* @since 4.0.0
*
- * @global $editor_styles Registered editor stylesheets
+ * @global array $editor_styles Registered editor stylesheets
*
* @return array If registered, a list of editor stylesheet URLs.
*/
}
}
}
- return $stylesheets;
+
+ /**
+ * Filter the array of stylesheets applied to the editor.
+ *
+ * @since 4.3.0
+ *
+ * @param array $stylesheets Array of stylesheets to be applied to the editor.
+ */
+ return apply_filters( 'editor_stylesheets', $stylesheets );
}
/**
*
* @since 2.9.0
*
+ * @global array $_wp_theme_features
+ *
* @param string $feature The feature being added.
* @return void|bool False on failure, void otherwise.
*/
*
* @since 3.4.0
* @access private
+ *
+ * @global Custom_Image_Header $custom_image_header
+ * @global Custom_Background $custom_background
*/
function _custom_header_background_just_in_time() {
global $custom_image_header, $custom_background;
}
}
}
-add_action( 'wp_loaded', '_custom_header_background_just_in_time' );
/**
* Gets the theme support arguments passed when registering that support
*
* @since 3.1.0
*
+ * @global array $_wp_theme_features
+ *
* @param string $feature the feature to check
* @return mixed The array of extra arguments or the value for the registered feature.
*/
* @since 3.0.0
* @see add_theme_support()
* @param string $feature the feature being added
- * @return null|bool Whether feature was removed.
+ * @return bool|void Whether feature was removed.
*/
function remove_theme_support( $feature ) {
// Blacklist: for internal registrations not used directly by themes.
*
* @access private
* @since 3.1.0
+ *
+ * @global array $_wp_theme_features
+ * @global Custom_Image_Header $custom_image_header
+ * @global Custom_Background $custom_background
+ *
* @param string $feature
*/
function _remove_theme_support( $feature ) {
* Checks a theme's support for a given feature
*
* @since 2.9.0
+ *
+ * @global array $_wp_theme_features
+ *
* @param string $feature the feature being checked
- * @return boolean
+ * @return bool
*/
function current_theme_supports( $feature ) {
global $_wp_theme_features;
* Checks an attachment being deleted to see if it's a header or background image.
*
* If true it removes the theme modification which would be pointing at the deleted
- * attachment
+ * attachment.
*
* @access private
* @since 3.0.0
- * @param int $id the attachment id
+ * @since 4.3.0 Also removes `header_image_data`.
+ *
+ * @param int $id The attachment id.
*/
function _delete_attachment_theme_mod( $id ) {
$attachment_image = wp_get_attachment_url( $id );
- $header_image = get_header_image();
+ $header_image = get_header_image();
$background_image = get_background_image();
- if ( $header_image && $header_image == $attachment_image )
+ if ( $header_image && $header_image == $attachment_image ) {
remove_theme_mod( 'header_image' );
+ remove_theme_mod( 'header_image_data' );
+ }
- if ( $background_image && $background_image == $attachment_image )
+ if ( $background_image && $background_image == $attachment_image ) {
remove_theme_mod( 'background_image' );
+ }
}
-add_action( 'delete_attachment', '_delete_attachment_theme_mod' );
-
/**
* Checks if a theme has been changed and runs 'after_switch_theme' hook on the next WP load
*
* Fires when ?wp_customize=on or on wp-admin/customize.php.
*
* @since 3.4.0
+ *
+ * @global WP_Customize_Manager $wp_customize
*/
function _wp_customize_include() {
if ( ! ( ( isset( $_REQUEST['wp_customize'] ) && 'on' == $_REQUEST['wp_customize'] )
) )
return;
- require( ABSPATH . WPINC . '/class-wp-customize-manager.php' );
- // Init Customize class
- $GLOBALS['wp_customize'] = new WP_Customize_Manager;
+ require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
+ $GLOBALS['wp_customize'] = new WP_Customize_Manager();
}
-add_action( 'plugins_loaded', '_wp_customize_include' );
/**
* Adds settings for the customize-loader script.
* @since 3.4.0
*/
function _wp_customize_loader_settings() {
- global $wp_scripts;
-
$admin_origin = parse_url( admin_url() );
$home_origin = parse_url( home_url() );
$cross_domain = ( strtolower( $admin_origin[ 'host' ] ) != strtolower( $home_origin[ 'host' ] ) );
'isCrossDomain' => $cross_domain,
'browser' => $browser,
'l10n' => array(
- 'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ),
+ 'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ),
+ 'mainIframeTitle' => __( 'Customizer' ),
),
);
$script = 'var _wpCustomizeLoaderSettings = ' . wp_json_encode( $settings ) . ';';
+ $wp_scripts = wp_scripts();
$data = $wp_scripts->get_data( 'customize-loader', 'data' );
if ( $data )
$script = "$data\n$script";
$wp_scripts->add_data( 'customize-loader', 'data', $script );
}
-add_action( 'admin_enqueue_scripts', '_wp_customize_loader_settings' );
/**
* Returns a URL to load the Customizer.
* @since 3.4.0
*
* @param string $stylesheet Optional. Theme to customize. Defaults to current theme.
- * The theme's stylesheet will be urlencoded if necessary.
+ * The theme's stylesheet will be urlencoded if necessary.
+ * @return string
*/
function wp_customize_url( $stylesheet = null ) {
$url = admin_url( 'customize.php' );
function is_customize_preview() {
global $wp_customize;
- return is_a( $wp_customize, 'WP_Customize_Manager' ) && $wp_customize->is_preview();
+ return ( $wp_customize instanceof WP_Customize_Manager ) && $wp_customize->is_preview();
}