Edit File by line
/home/zeestwma/richards.../wp-inclu...
File: theme.php
}
[500] Fix | Delete
return $found_themes;
[501] Fix | Delete
}
[502] Fix | Delete
if ( ! is_int( $cache_expiration ) ) {
[503] Fix | Delete
$cache_expiration = 30 * MINUTE_IN_SECONDS;
[504] Fix | Delete
}
[505] Fix | Delete
} else {
[506] Fix | Delete
$cache_expiration = 30 * MINUTE_IN_SECONDS;
[507] Fix | Delete
}
[508] Fix | Delete
[509] Fix | Delete
/* Loop the registered theme directories and extract all themes */
[510] Fix | Delete
foreach ( $wp_theme_directories as $theme_root ) {
[511] Fix | Delete
[512] Fix | Delete
// Start with directories in the root of the active theme directory.
[513] Fix | Delete
$dirs = @ scandir( $theme_root );
[514] Fix | Delete
if ( ! $dirs ) {
[515] Fix | Delete
wp_trigger_error( __FUNCTION__, "$theme_root is not readable" );
[516] Fix | Delete
continue;
[517] Fix | Delete
}
[518] Fix | Delete
foreach ( $dirs as $dir ) {
[519] Fix | Delete
if ( ! is_dir( $theme_root . '/' . $dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
[520] Fix | Delete
continue;
[521] Fix | Delete
}
[522] Fix | Delete
if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {
[523] Fix | Delete
/*
[524] Fix | Delete
* wp-content/themes/a-single-theme
[525] Fix | Delete
* wp-content/themes is $theme_root, a-single-theme is $dir.
[526] Fix | Delete
*/
[527] Fix | Delete
$found_themes[ $dir ] = array(
[528] Fix | Delete
'theme_file' => $dir . '/style.css',
[529] Fix | Delete
'theme_root' => $theme_root,
[530] Fix | Delete
);
[531] Fix | Delete
} else {
[532] Fix | Delete
$found_theme = false;
[533] Fix | Delete
/*
[534] Fix | Delete
* wp-content/themes/a-folder-of-themes/*
[535] Fix | Delete
* wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs.
[536] Fix | Delete
*/
[537] Fix | Delete
$sub_dirs = @ scandir( $theme_root . '/' . $dir );
[538] Fix | Delete
if ( ! $sub_dirs ) {
[539] Fix | Delete
wp_trigger_error( __FUNCTION__, "$theme_root/$dir is not readable" );
[540] Fix | Delete
continue;
[541] Fix | Delete
}
[542] Fix | Delete
foreach ( $sub_dirs as $sub_dir ) {
[543] Fix | Delete
if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
[544] Fix | Delete
continue;
[545] Fix | Delete
}
[546] Fix | Delete
if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) ) {
[547] Fix | Delete
continue;
[548] Fix | Delete
}
[549] Fix | Delete
$found_themes[ $dir . '/' . $sub_dir ] = array(
[550] Fix | Delete
'theme_file' => $dir . '/' . $sub_dir . '/style.css',
[551] Fix | Delete
'theme_root' => $theme_root,
[552] Fix | Delete
);
[553] Fix | Delete
$found_theme = true;
[554] Fix | Delete
}
[555] Fix | Delete
/*
[556] Fix | Delete
* Never mind the above, it's just a theme missing a style.css.
[557] Fix | Delete
* Return it; WP_Theme will catch the error.
[558] Fix | Delete
*/
[559] Fix | Delete
if ( ! $found_theme ) {
[560] Fix | Delete
$found_themes[ $dir ] = array(
[561] Fix | Delete
'theme_file' => $dir . '/style.css',
[562] Fix | Delete
'theme_root' => $theme_root,
[563] Fix | Delete
);
[564] Fix | Delete
}
[565] Fix | Delete
}
[566] Fix | Delete
}
[567] Fix | Delete
}
[568] Fix | Delete
[569] Fix | Delete
asort( $found_themes );
[570] Fix | Delete
[571] Fix | Delete
$theme_roots = array();
[572] Fix | Delete
$relative_theme_roots = array_flip( $relative_theme_roots );
[573] Fix | Delete
[574] Fix | Delete
foreach ( $found_themes as $theme_dir => $theme_data ) {
[575] Fix | Delete
$theme_roots[ $theme_dir ] = $relative_theme_roots[ $theme_data['theme_root'] ]; // Convert absolute to relative.
[576] Fix | Delete
}
[577] Fix | Delete
[578] Fix | Delete
if ( get_site_transient( 'theme_roots' ) !== $theme_roots ) {
[579] Fix | Delete
set_site_transient( 'theme_roots', $theme_roots, $cache_expiration );
[580] Fix | Delete
}
[581] Fix | Delete
[582] Fix | Delete
return $found_themes;
[583] Fix | Delete
}
[584] Fix | Delete
[585] Fix | Delete
/**
[586] Fix | Delete
* Retrieves path to themes directory.
[587] Fix | Delete
*
[588] Fix | Delete
* Does not have trailing slash.
[589] Fix | Delete
*
[590] Fix | Delete
* @since 1.5.0
[591] Fix | Delete
*
[592] Fix | Delete
* @global string[] $wp_theme_directories
[593] Fix | Delete
*
[594] Fix | Delete
* @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.
[595] Fix | Delete
* Default is to leverage the main theme root.
[596] Fix | Delete
* @return string Themes directory path.
[597] Fix | Delete
*/
[598] Fix | Delete
function get_theme_root( $stylesheet_or_template = '' ) {
[599] Fix | Delete
global $wp_theme_directories;
[600] Fix | Delete
[601] Fix | Delete
$theme_root = '';
[602] Fix | Delete
[603] Fix | Delete
if ( $stylesheet_or_template ) {
[604] Fix | Delete
$theme_root = get_raw_theme_root( $stylesheet_or_template );
[605] Fix | Delete
if ( $theme_root ) {
[606] Fix | Delete
/*
[607] Fix | Delete
* Always prepend WP_CONTENT_DIR unless the root currently registered as a theme directory.
[608] Fix | Delete
* This gives relative theme roots the benefit of the doubt when things go haywire.
[609] Fix | Delete
*/
[610] Fix | Delete
if ( ! in_array( $theme_root, (array) $wp_theme_directories, true ) ) {
[611] Fix | Delete
$theme_root = WP_CONTENT_DIR . $theme_root;
[612] Fix | Delete
}
[613] Fix | Delete
}
[614] Fix | Delete
}
[615] Fix | Delete
[616] Fix | Delete
if ( ! $theme_root ) {
[617] Fix | Delete
$theme_root = WP_CONTENT_DIR . '/themes';
[618] Fix | Delete
}
[619] Fix | Delete
[620] Fix | Delete
/**
[621] Fix | Delete
* Filters the absolute path to the themes directory.
[622] Fix | Delete
*
[623] Fix | Delete
* @since 1.5.0
[624] Fix | Delete
*
[625] Fix | Delete
* @param string $theme_root Absolute path to themes directory.
[626] Fix | Delete
*/
[627] Fix | Delete
return apply_filters( 'theme_root', $theme_root );
[628] Fix | Delete
}
[629] Fix | Delete
[630] Fix | Delete
/**
[631] Fix | Delete
* Retrieves URI for themes directory.
[632] Fix | Delete
*
[633] Fix | Delete
* Does not have trailing slash.
[634] Fix | Delete
*
[635] Fix | Delete
* @since 1.5.0
[636] Fix | Delete
*
[637] Fix | Delete
* @global string[] $wp_theme_directories
[638] Fix | Delete
*
[639] Fix | Delete
* @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.
[640] Fix | Delete
* Default is to leverage the main theme root.
[641] Fix | Delete
* @param string $theme_root Optional. The theme root for which calculations will be based,
[642] Fix | Delete
* preventing the need for a get_raw_theme_root() call. Default empty.
[643] Fix | Delete
* @return string Themes directory URI.
[644] Fix | Delete
*/
[645] Fix | Delete
function get_theme_root_uri( $stylesheet_or_template = '', $theme_root = '' ) {
[646] Fix | Delete
global $wp_theme_directories;
[647] Fix | Delete
[648] Fix | Delete
if ( $stylesheet_or_template && ! $theme_root ) {
[649] Fix | Delete
$theme_root = get_raw_theme_root( $stylesheet_or_template );
[650] Fix | Delete
}
[651] Fix | Delete
[652] Fix | Delete
if ( $stylesheet_or_template && $theme_root ) {
[653] Fix | Delete
if ( in_array( $theme_root, (array) $wp_theme_directories, true ) ) {
[654] Fix | Delete
// Absolute path. Make an educated guess. YMMV -- but note the filter below.
[655] Fix | Delete
if ( str_starts_with( $theme_root, WP_CONTENT_DIR ) ) {
[656] Fix | Delete
$theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) );
[657] Fix | Delete
} elseif ( str_starts_with( $theme_root, ABSPATH ) ) {
[658] Fix | Delete
$theme_root_uri = site_url( str_replace( ABSPATH, '', $theme_root ) );
[659] Fix | Delete
} elseif ( str_starts_with( $theme_root, WP_PLUGIN_DIR ) || str_starts_with( $theme_root, WPMU_PLUGIN_DIR ) ) {
[660] Fix | Delete
$theme_root_uri = plugins_url( basename( $theme_root ), $theme_root );
[661] Fix | Delete
} else {
[662] Fix | Delete
$theme_root_uri = $theme_root;
[663] Fix | Delete
}
[664] Fix | Delete
} else {
[665] Fix | Delete
$theme_root_uri = content_url( $theme_root );
[666] Fix | Delete
}
[667] Fix | Delete
} else {
[668] Fix | Delete
$theme_root_uri = content_url( 'themes' );
[669] Fix | Delete
}
[670] Fix | Delete
[671] Fix | Delete
/**
[672] Fix | Delete
* Filters the URI for themes directory.
[673] Fix | Delete
*
[674] Fix | Delete
* @since 1.5.0
[675] Fix | Delete
*
[676] Fix | Delete
* @param string $theme_root_uri The URI for themes directory.
[677] Fix | Delete
* @param string $siteurl WordPress web address which is set in General Options.
[678] Fix | Delete
* @param string $stylesheet_or_template The stylesheet or template name of the theme.
[679] Fix | Delete
*/
[680] Fix | Delete
return apply_filters( 'theme_root_uri', $theme_root_uri, get_option( 'siteurl' ), $stylesheet_or_template );
[681] Fix | Delete
}
[682] Fix | Delete
[683] Fix | Delete
/**
[684] Fix | Delete
* Gets the raw theme root relative to the content directory with no filters applied.
[685] Fix | Delete
*
[686] Fix | Delete
* @since 3.1.0
[687] Fix | Delete
*
[688] Fix | Delete
* @global string[] $wp_theme_directories
[689] Fix | Delete
*
[690] Fix | Delete
* @param string $stylesheet_or_template The stylesheet or template name of the theme.
[691] Fix | Delete
* @param bool $skip_cache Optional. Whether to skip the cache.
[692] Fix | Delete
* Defaults to false, meaning the cache is used.
[693] Fix | Delete
* @return string Theme root.
[694] Fix | Delete
*/
[695] Fix | Delete
function get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) {
[696] Fix | Delete
global $wp_theme_directories;
[697] Fix | Delete
[698] Fix | Delete
if ( ! is_array( $wp_theme_directories ) || count( $wp_theme_directories ) <= 1 ) {
[699] Fix | Delete
return '/themes';
[700] Fix | Delete
}
[701] Fix | Delete
[702] Fix | Delete
$theme_root = false;
[703] Fix | Delete
[704] Fix | Delete
// If requesting the root for the active theme, consult options to avoid calling get_theme_roots().
[705] Fix | Delete
if ( ! $skip_cache ) {
[706] Fix | Delete
if ( get_option( 'stylesheet' ) === $stylesheet_or_template ) {
[707] Fix | Delete
$theme_root = get_option( 'stylesheet_root' );
[708] Fix | Delete
} elseif ( get_option( 'template' ) === $stylesheet_or_template ) {
[709] Fix | Delete
$theme_root = get_option( 'template_root' );
[710] Fix | Delete
}
[711] Fix | Delete
}
[712] Fix | Delete
[713] Fix | Delete
if ( empty( $theme_root ) ) {
[714] Fix | Delete
$theme_roots = get_theme_roots();
[715] Fix | Delete
if ( ! empty( $theme_roots[ $stylesheet_or_template ] ) ) {
[716] Fix | Delete
$theme_root = $theme_roots[ $stylesheet_or_template ];
[717] Fix | Delete
}
[718] Fix | Delete
}
[719] Fix | Delete
[720] Fix | Delete
return $theme_root;
[721] Fix | Delete
}
[722] Fix | Delete
[723] Fix | Delete
/**
[724] Fix | Delete
* Displays localized stylesheet link element.
[725] Fix | Delete
*
[726] Fix | Delete
* @since 2.1.0
[727] Fix | Delete
*/
[728] Fix | Delete
function locale_stylesheet() {
[729] Fix | Delete
$stylesheet = get_locale_stylesheet_uri();
[730] Fix | Delete
if ( empty( $stylesheet ) ) {
[731] Fix | Delete
return;
[732] Fix | Delete
}
[733] Fix | Delete
[734] Fix | Delete
$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
[735] Fix | Delete
[736] Fix | Delete
printf(
[737] Fix | Delete
'<link rel="stylesheet" href="%s"%s media="screen" />',
[738] Fix | Delete
$stylesheet,
[739] Fix | Delete
$type_attr
[740] Fix | Delete
);
[741] Fix | Delete
}
[742] Fix | Delete
[743] Fix | Delete
/**
[744] Fix | Delete
* Switches the theme.
[745] Fix | Delete
*
[746] Fix | Delete
* Accepts one argument: $stylesheet of the theme. It also accepts an additional function signature
[747] Fix | Delete
* of two arguments: $template then $stylesheet. This is for backward compatibility.
[748] Fix | Delete
*
[749] Fix | Delete
* @since 2.5.0
[750] Fix | Delete
*
[751] Fix | Delete
* @global string[] $wp_theme_directories
[752] Fix | Delete
* @global WP_Customize_Manager $wp_customize
[753] Fix | Delete
* @global array $sidebars_widgets
[754] Fix | Delete
* @global array $wp_registered_sidebars
[755] Fix | Delete
*
[756] Fix | Delete
* @param string $stylesheet Stylesheet name.
[757] Fix | Delete
*/
[758] Fix | Delete
function switch_theme( $stylesheet ) {
[759] Fix | Delete
global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars;
[760] Fix | Delete
[761] Fix | Delete
$requirements = validate_theme_requirements( $stylesheet );
[762] Fix | Delete
if ( is_wp_error( $requirements ) ) {
[763] Fix | Delete
wp_die( $requirements );
[764] Fix | Delete
}
[765] Fix | Delete
[766] Fix | Delete
$_sidebars_widgets = null;
[767] Fix | Delete
if ( 'wp_ajax_customize_save' === current_action() ) {
[768] Fix | Delete
$old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' );
[769] Fix | Delete
if ( $old_sidebars_widgets_data_setting ) {
[770] Fix | Delete
$_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting );
[771] Fix | Delete
}
[772] Fix | Delete
} elseif ( is_array( $sidebars_widgets ) ) {
[773] Fix | Delete
$_sidebars_widgets = $sidebars_widgets;
[774] Fix | Delete
}
[775] Fix | Delete
[776] Fix | Delete
if ( is_array( $_sidebars_widgets ) ) {
[777] Fix | Delete
set_theme_mod(
[778] Fix | Delete
'sidebars_widgets',
[779] Fix | Delete
array(
[780] Fix | Delete
'time' => time(),
[781] Fix | Delete
'data' => $_sidebars_widgets,
[782] Fix | Delete
)
[783] Fix | Delete
);
[784] Fix | Delete
}
[785] Fix | Delete
[786] Fix | Delete
$nav_menu_locations = get_theme_mod( 'nav_menu_locations' );
[787] Fix | Delete
update_option( 'theme_switch_menu_locations', $nav_menu_locations, true );
[788] Fix | Delete
[789] Fix | Delete
if ( func_num_args() > 1 ) {
[790] Fix | Delete
$stylesheet = func_get_arg( 1 );
[791] Fix | Delete
}
[792] Fix | Delete
[793] Fix | Delete
$old_theme = wp_get_theme();
[794] Fix | Delete
$new_theme = wp_get_theme( $stylesheet );
[795] Fix | Delete
$template = $new_theme->get_template();
[796] Fix | Delete
[797] Fix | Delete
if ( wp_is_recovery_mode() ) {
[798] Fix | Delete
$paused_themes = wp_paused_themes();
[799] Fix | Delete
$paused_themes->delete( $old_theme->get_stylesheet() );
[800] Fix | Delete
$paused_themes->delete( $old_theme->get_template() );
[801] Fix | Delete
}
[802] Fix | Delete
[803] Fix | Delete
update_option( 'template', $template );
[804] Fix | Delete
update_option( 'stylesheet', $stylesheet );
[805] Fix | Delete
[806] Fix | Delete
if ( count( $wp_theme_directories ) > 1 ) {
[807] Fix | Delete
update_option( 'template_root', get_raw_theme_root( $template, true ) );
[808] Fix | Delete
update_option( 'stylesheet_root', get_raw_theme_root( $stylesheet, true ) );
[809] Fix | Delete
} else {
[810] Fix | Delete
delete_option( 'template_root' );
[811] Fix | Delete
delete_option( 'stylesheet_root' );
[812] Fix | Delete
}
[813] Fix | Delete
[814] Fix | Delete
$new_name = $new_theme->get( 'Name' );
[815] Fix | Delete
[816] Fix | Delete
update_option( 'current_theme', $new_name );
[817] Fix | Delete
[818] Fix | Delete
// Migrate from the old mods_{name} option to theme_mods_{slug}.
[819] Fix | Delete
if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {
[820] Fix | Delete
$default_theme_mods = (array) get_option( 'mods_' . $new_name );
[821] Fix | Delete
if ( ! empty( $nav_menu_locations ) && empty( $default_theme_mods['nav_menu_locations'] ) ) {
[822] Fix | Delete
$default_theme_mods['nav_menu_locations'] = $nav_menu_locations;
[823] Fix | Delete
}
[824] Fix | Delete
add_option( "theme_mods_$stylesheet", $default_theme_mods );
[825] Fix | Delete
} else {
[826] Fix | Delete
/*
[827] Fix | Delete
* Since retrieve_widgets() is called when initializing a theme in the Customizer,
[828] Fix | Delete
* we need to remove the theme mods to avoid overwriting changes made via
[829] Fix | Delete
* the Customizer when accessing wp-admin/widgets.php.
[830] Fix | Delete
*/
[831] Fix | Delete
if ( 'wp_ajax_customize_save' === current_action() ) {
[832] Fix | Delete
remove_theme_mod( 'sidebars_widgets' );
[833] Fix | Delete
}
[834] Fix | Delete
}
[835] Fix | Delete
[836] Fix | Delete
// Stores classic sidebars for later use by block themes.
[837] Fix | Delete
if ( $new_theme->is_block_theme() ) {
[838] Fix | Delete
set_theme_mod( 'wp_classic_sidebars', $wp_registered_sidebars );
[839] Fix | Delete
}
[840] Fix | Delete
[841] Fix | Delete
update_option( 'theme_switched', $old_theme->get_stylesheet() );
[842] Fix | Delete
[843] Fix | Delete
/*
[844] Fix | Delete
* Reset template globals when switching themes outside of a switched blog
[845] Fix | Delete
* context to ensure templates will be loaded from the new theme.
[846] Fix | Delete
*/
[847] Fix | Delete
if ( ! is_multisite() || ! ms_is_switched() ) {
[848] Fix | Delete
wp_set_template_globals();
[849] Fix | Delete
}
[850] Fix | Delete
[851] Fix | Delete
// Clear pattern caches.
[852] Fix | Delete
if ( ! is_multisite() ) {
[853] Fix | Delete
$new_theme->delete_pattern_cache();
[854] Fix | Delete
$old_theme->delete_pattern_cache();
[855] Fix | Delete
}
[856] Fix | Delete
[857] Fix | Delete
// Set autoload=no for the old theme, autoload=yes for the switched theme.
[858] Fix | Delete
$theme_mods_options = array(
[859] Fix | Delete
'theme_mods_' . $stylesheet => 'yes',
[860] Fix | Delete
'theme_mods_' . $old_theme->get_stylesheet() => 'no',
[861] Fix | Delete
);
[862] Fix | Delete
wp_set_option_autoload_values( $theme_mods_options );
[863] Fix | Delete
[864] Fix | Delete
/**
[865] Fix | Delete
* Fires after the theme is switched.
[866] Fix | Delete
*
[867] Fix | Delete
* See {@see 'after_switch_theme'}.
[868] Fix | Delete
*
[869] Fix | Delete
* @since 1.5.0
[870] Fix | Delete
* @since 4.5.0 Introduced the `$old_theme` parameter.
[871] Fix | Delete
*
[872] Fix | Delete
* @param string $new_name Name of the new theme.
[873] Fix | Delete
* @param WP_Theme $new_theme WP_Theme instance of the new theme.
[874] Fix | Delete
* @param WP_Theme $old_theme WP_Theme instance of the old theme.
[875] Fix | Delete
*/
[876] Fix | Delete
do_action( 'switch_theme', $new_name, $new_theme, $old_theme );
[877] Fix | Delete
}
[878] Fix | Delete
[879] Fix | Delete
/**
[880] Fix | Delete
* Checks that the active theme has the required files.
[881] Fix | Delete
*
[882] Fix | Delete
* Standalone themes need to have a `templates/index.html` or `index.php` template file.
[883] Fix | Delete
* Child themes need to have a `Template` header in the `style.css` stylesheet.
[884] Fix | Delete
*
[885] Fix | Delete
* Does not initially check the default theme, which is the fallback and should always exist.
[886] Fix | Delete
* But if it doesn't exist, it'll fall back to the latest core default theme that does exist.
[887] Fix | Delete
* Will switch theme to the fallback theme if active theme does not validate.
[888] Fix | Delete
*
[889] Fix | Delete
* You can use the {@see 'validate_current_theme'} filter to return false to disable
[890] Fix | Delete
* this functionality.
[891] Fix | Delete
*
[892] Fix | Delete
* @since 1.5.0
[893] Fix | Delete
* @since 6.0.0 Removed the requirement for block themes to have an `index.php` template.
[894] Fix | Delete
*
[895] Fix | Delete
* @see WP_DEFAULT_THEME
[896] Fix | Delete
*
[897] Fix | Delete
* @return bool
[898] Fix | Delete
*/
[899] Fix | Delete
function validate_current_theme() {
[900] Fix | Delete
/**
[901] Fix | Delete
* Filters whether to validate the active theme.
[902] Fix | Delete
*
[903] Fix | Delete
* @since 2.7.0
[904] Fix | Delete
*
[905] Fix | Delete
* @param bool $validate Whether to validate the active theme. Default true.
[906] Fix | Delete
*/
[907] Fix | Delete
if ( wp_installing() || ! apply_filters( 'validate_current_theme', true ) ) {
[908] Fix | Delete
return true;
[909] Fix | Delete
}
[910] Fix | Delete
[911] Fix | Delete
if (
[912] Fix | Delete
! file_exists( get_template_directory() . '/templates/index.html' )
[913] Fix | Delete
&& ! file_exists( get_template_directory() . '/block-templates/index.html' ) // Deprecated path support since 5.9.0.
[914] Fix | Delete
&& ! file_exists( get_template_directory() . '/index.php' )
[915] Fix | Delete
) {
[916] Fix | Delete
// Invalid.
[917] Fix | Delete
} elseif ( ! file_exists( get_template_directory() . '/style.css' ) ) {
[918] Fix | Delete
// Invalid.
[919] Fix | Delete
} elseif ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) {
[920] Fix | Delete
// Invalid.
[921] Fix | Delete
} else {
[922] Fix | Delete
// Valid.
[923] Fix | Delete
return true;
[924] Fix | Delete
}
[925] Fix | Delete
[926] Fix | Delete
$default = wp_get_theme( WP_DEFAULT_THEME );
[927] Fix | Delete
if ( $default->exists() ) {
[928] Fix | Delete
switch_theme( WP_DEFAULT_THEME );
[929] Fix | Delete
return false;
[930] Fix | Delete
}
[931] Fix | Delete
[932] Fix | Delete
/**
[933] Fix | Delete
* If we're in an invalid state but WP_DEFAULT_THEME doesn't exist,
[934] Fix | Delete
* switch to the latest core default theme that's installed.
[935] Fix | Delete
*
[936] Fix | Delete
* If it turns out that this latest core default theme is our current
[937] Fix | Delete
* theme, then there's nothing we can do about that, so we have to bail,
[938] Fix | Delete
* rather than going into an infinite loop. (This is why there are
[939] Fix | Delete
* checks against WP_DEFAULT_THEME above, also.) We also can't do anything
[940] Fix | Delete
* if it turns out there is no default theme installed. (That's `false`.)
[941] Fix | Delete
*/
[942] Fix | Delete
$default = WP_Theme::get_core_default_theme();
[943] Fix | Delete
if ( false === $default || get_stylesheet() === $default->get_stylesheet() ) {
[944] Fix | Delete
return true;
[945] Fix | Delete
}
[946] Fix | Delete
[947] Fix | Delete
switch_theme( $default->get_stylesheet() );
[948] Fix | Delete
return false;
[949] Fix | Delete
}
[950] Fix | Delete
[951] Fix | Delete
/**
[952] Fix | Delete
* Validates the theme requirements for WordPress version and PHP version.
[953] Fix | Delete
*
[954] Fix | Delete
* Uses the information from `Requires at least` and `Requires PHP` headers
[955] Fix | Delete
* defined in the theme's `style.css` file.
[956] Fix | Delete
*
[957] Fix | Delete
* @since 5.5.0
[958] Fix | Delete
* @since 5.8.0 Removed support for using `readme.txt` as a fallback.
[959] Fix | Delete
*
[960] Fix | Delete
* @param string $stylesheet Directory name for the theme.
[961] Fix | Delete
* @return true|WP_Error True if requirements are met, WP_Error on failure.
[962] Fix | Delete
*/
[963] Fix | Delete
function validate_theme_requirements( $stylesheet ) {
[964] Fix | Delete
$theme = wp_get_theme( $stylesheet );
[965] Fix | Delete
[966] Fix | Delete
$requirements = array(
[967] Fix | Delete
'requires' => ! empty( $theme->get( 'RequiresWP' ) ) ? $theme->get( 'RequiresWP' ) : '',
[968] Fix | Delete
'requires_php' => ! empty( $theme->get( 'RequiresPHP' ) ) ? $theme->get( 'RequiresPHP' ) : '',
[969] Fix | Delete
);
[970] Fix | Delete
[971] Fix | Delete
$compatible_wp = is_wp_version_compatible( $requirements['requires'] );
[972] Fix | Delete
$compatible_php = is_php_version_compatible( $requirements['requires_php'] );
[973] Fix | Delete
[974] Fix | Delete
if ( ! $compatible_wp && ! $compatible_php ) {
[975] Fix | Delete
return new WP_Error(
[976] Fix | Delete
'theme_wp_php_incompatible',
[977] Fix | Delete
sprintf(
[978] Fix | Delete
/* translators: %s: Theme name. */
[979] Fix | Delete
_x( '<strong>Error:</strong> Current WordPress and PHP versions do not meet minimum requirements for %s.', 'theme' ),
[980] Fix | Delete
$theme->display( 'Name' )
[981] Fix | Delete
)
[982] Fix | Delete
);
[983] Fix | Delete
} elseif ( ! $compatible_php ) {
[984] Fix | Delete
return new WP_Error(
[985] Fix | Delete
'theme_php_incompatible',
[986] Fix | Delete
sprintf(
[987] Fix | Delete
/* translators: %s: Theme name. */
[988] Fix | Delete
_x( '<strong>Error:</strong> Current PHP version does not meet minimum requirements for %s.', 'theme' ),
[989] Fix | Delete
$theme->display( 'Name' )
[990] Fix | Delete
)
[991] Fix | Delete
);
[992] Fix | Delete
} elseif ( ! $compatible_wp ) {
[993] Fix | Delete
return new WP_Error(
[994] Fix | Delete
'theme_wp_incompatible',
[995] Fix | Delete
sprintf(
[996] Fix | Delete
/* translators: %s: Theme name. */
[997] Fix | Delete
_x( '<strong>Error:</strong> Current WordPress version does not meet minimum requirements for %s.', 'theme' ),
[998] Fix | Delete
$theme->display( 'Name' )
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function