Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/wp-inclu...
File: class-wp-theme-json.php
$custom_block_css = isset( $this->theme_json['styles']['blocks'][ $name ]['css'] )
[1500] Fix | Delete
? $this->theme_json['styles']['blocks'][ $name ]['css']
[1501] Fix | Delete
: null;
[1502] Fix | Delete
if ( $custom_block_css ) {
[1503] Fix | Delete
$selector = static::$blocks_metadata[ $name ]['selector'];
[1504] Fix | Delete
$stylesheet .= $this->process_blocks_custom_css( $custom_block_css, $selector );
[1505] Fix | Delete
}
[1506] Fix | Delete
}
[1507] Fix | Delete
}
[1508] Fix | Delete
[1509] Fix | Delete
return $stylesheet;
[1510] Fix | Delete
}
[1511] Fix | Delete
[1512] Fix | Delete
/**
[1513] Fix | Delete
* Returns the page templates of the active theme.
[1514] Fix | Delete
*
[1515] Fix | Delete
* @since 5.9.0
[1516] Fix | Delete
*
[1517] Fix | Delete
* @return array
[1518] Fix | Delete
*/
[1519] Fix | Delete
public function get_custom_templates() {
[1520] Fix | Delete
$custom_templates = array();
[1521] Fix | Delete
if ( ! isset( $this->theme_json['customTemplates'] ) || ! is_array( $this->theme_json['customTemplates'] ) ) {
[1522] Fix | Delete
return $custom_templates;
[1523] Fix | Delete
}
[1524] Fix | Delete
[1525] Fix | Delete
foreach ( $this->theme_json['customTemplates'] as $item ) {
[1526] Fix | Delete
if ( isset( $item['name'] ) ) {
[1527] Fix | Delete
$custom_templates[ $item['name'] ] = array(
[1528] Fix | Delete
'title' => isset( $item['title'] ) ? $item['title'] : '',
[1529] Fix | Delete
'postTypes' => isset( $item['postTypes'] ) ? $item['postTypes'] : array( 'page' ),
[1530] Fix | Delete
);
[1531] Fix | Delete
}
[1532] Fix | Delete
}
[1533] Fix | Delete
return $custom_templates;
[1534] Fix | Delete
}
[1535] Fix | Delete
[1536] Fix | Delete
/**
[1537] Fix | Delete
* Returns the template part data of active theme.
[1538] Fix | Delete
*
[1539] Fix | Delete
* @since 5.9.0
[1540] Fix | Delete
*
[1541] Fix | Delete
* @return array
[1542] Fix | Delete
*/
[1543] Fix | Delete
public function get_template_parts() {
[1544] Fix | Delete
$template_parts = array();
[1545] Fix | Delete
if ( ! isset( $this->theme_json['templateParts'] ) || ! is_array( $this->theme_json['templateParts'] ) ) {
[1546] Fix | Delete
return $template_parts;
[1547] Fix | Delete
}
[1548] Fix | Delete
[1549] Fix | Delete
foreach ( $this->theme_json['templateParts'] as $item ) {
[1550] Fix | Delete
if ( isset( $item['name'] ) ) {
[1551] Fix | Delete
$template_parts[ $item['name'] ] = array(
[1552] Fix | Delete
'title' => isset( $item['title'] ) ? $item['title'] : '',
[1553] Fix | Delete
'area' => isset( $item['area'] ) ? $item['area'] : '',
[1554] Fix | Delete
);
[1555] Fix | Delete
}
[1556] Fix | Delete
}
[1557] Fix | Delete
return $template_parts;
[1558] Fix | Delete
}
[1559] Fix | Delete
[1560] Fix | Delete
/**
[1561] Fix | Delete
* Converts each style section into a list of rulesets
[1562] Fix | Delete
* containing the block styles to be appended to the stylesheet.
[1563] Fix | Delete
*
[1564] Fix | Delete
* See glossary at https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax
[1565] Fix | Delete
*
[1566] Fix | Delete
* For each section this creates a new ruleset such as:
[1567] Fix | Delete
*
[1568] Fix | Delete
* block-selector {
[1569] Fix | Delete
* style-property-one: value;
[1570] Fix | Delete
* }
[1571] Fix | Delete
*
[1572] Fix | Delete
* @since 5.8.0 As `get_block_styles()`.
[1573] Fix | Delete
* @since 5.9.0 Renamed from `get_block_styles()` to `get_block_classes()`
[1574] Fix | Delete
* and no longer returns preset classes.
[1575] Fix | Delete
* Removed the `$setting_nodes` parameter.
[1576] Fix | Delete
* @since 6.1.0 Moved most internal logic to `get_styles_for_block()`.
[1577] Fix | Delete
*
[1578] Fix | Delete
* @param array $style_nodes Nodes with styles.
[1579] Fix | Delete
* @return string The new stylesheet.
[1580] Fix | Delete
*/
[1581] Fix | Delete
protected function get_block_classes( $style_nodes ) {
[1582] Fix | Delete
$block_rules = '';
[1583] Fix | Delete
[1584] Fix | Delete
foreach ( $style_nodes as $metadata ) {
[1585] Fix | Delete
if ( null === $metadata['selector'] ) {
[1586] Fix | Delete
continue;
[1587] Fix | Delete
}
[1588] Fix | Delete
$block_rules .= static::get_styles_for_block( $metadata );
[1589] Fix | Delete
}
[1590] Fix | Delete
[1591] Fix | Delete
return $block_rules;
[1592] Fix | Delete
}
[1593] Fix | Delete
[1594] Fix | Delete
/**
[1595] Fix | Delete
* Gets the CSS layout rules for a particular block from theme.json layout definitions.
[1596] Fix | Delete
*
[1597] Fix | Delete
* @since 6.1.0
[1598] Fix | Delete
* @since 6.3.0 Reduced specificity for layout margin rules.
[1599] Fix | Delete
* @since 6.5.1 Only output rules referencing content and wide sizes when values exist.
[1600] Fix | Delete
* @since 6.5.3 Add types parameter to check if only base layout styles are needed.
[1601] Fix | Delete
* @since 6.6.0 Updated layout style specificity to be compatible with overall 0-1-0 specificity in global styles.
[1602] Fix | Delete
*
[1603] Fix | Delete
* @param array $block_metadata Metadata about the block to get styles for.
[1604] Fix | Delete
* @param array $types Optional. Types of styles to output. If empty, all styles will be output.
[1605] Fix | Delete
* @return string Layout styles for the block.
[1606] Fix | Delete
*/
[1607] Fix | Delete
protected function get_layout_styles( $block_metadata, $types = array() ) {
[1608] Fix | Delete
$block_rules = '';
[1609] Fix | Delete
$block_type = null;
[1610] Fix | Delete
[1611] Fix | Delete
// Skip outputting layout styles if explicitly disabled.
[1612] Fix | Delete
if ( current_theme_supports( 'disable-layout-styles' ) ) {
[1613] Fix | Delete
return $block_rules;
[1614] Fix | Delete
}
[1615] Fix | Delete
[1616] Fix | Delete
if ( isset( $block_metadata['name'] ) ) {
[1617] Fix | Delete
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_metadata['name'] );
[1618] Fix | Delete
if ( ! block_has_support( $block_type, 'layout', false ) && ! block_has_support( $block_type, '__experimentalLayout', false ) ) {
[1619] Fix | Delete
return $block_rules;
[1620] Fix | Delete
}
[1621] Fix | Delete
}
[1622] Fix | Delete
[1623] Fix | Delete
$selector = isset( $block_metadata['selector'] ) ? $block_metadata['selector'] : '';
[1624] Fix | Delete
$has_block_gap_support = isset( $this->theme_json['settings']['spacing']['blockGap'] );
[1625] Fix | Delete
$has_fallback_gap_support = ! $has_block_gap_support; // This setting isn't useful yet: it exists as a placeholder for a future explicit fallback gap styles support.
[1626] Fix | Delete
$node = _wp_array_get( $this->theme_json, $block_metadata['path'], array() );
[1627] Fix | Delete
$layout_definitions = wp_get_layout_definitions();
[1628] Fix | Delete
$layout_selector_pattern = '/^[a-zA-Z0-9\-\.\,\ *+>:\(\)]*$/'; // Allow alphanumeric classnames, spaces, wildcard, sibling, child combinator and pseudo class selectors.
[1629] Fix | Delete
[1630] Fix | Delete
/*
[1631] Fix | Delete
* Gap styles will only be output if the theme has block gap support, or supports a fallback gap.
[1632] Fix | Delete
* Default layout gap styles will be skipped for themes that do not explicitly opt-in to blockGap with a `true` or `false` value.
[1633] Fix | Delete
*/
[1634] Fix | Delete
if ( $has_block_gap_support || $has_fallback_gap_support ) {
[1635] Fix | Delete
$block_gap_value = null;
[1636] Fix | Delete
// Use a fallback gap value if block gap support is not available.
[1637] Fix | Delete
if ( ! $has_block_gap_support ) {
[1638] Fix | Delete
$block_gap_value = static::ROOT_BLOCK_SELECTOR === $selector ? '0.5em' : null;
[1639] Fix | Delete
if ( ! empty( $block_type ) ) {
[1640] Fix | Delete
$block_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] )
[1641] Fix | Delete
? $block_type->supports['spacing']['blockGap']['__experimentalDefault']
[1642] Fix | Delete
: null;
[1643] Fix | Delete
}
[1644] Fix | Delete
} else {
[1645] Fix | Delete
$block_gap_value = static::get_property_value( $node, array( 'spacing', 'blockGap' ) );
[1646] Fix | Delete
}
[1647] Fix | Delete
[1648] Fix | Delete
// Support split row / column values and concatenate to a shorthand value.
[1649] Fix | Delete
if ( is_array( $block_gap_value ) ) {
[1650] Fix | Delete
if ( isset( $block_gap_value['top'] ) && isset( $block_gap_value['left'] ) ) {
[1651] Fix | Delete
$gap_row = static::get_property_value( $node, array( 'spacing', 'blockGap', 'top' ) );
[1652] Fix | Delete
$gap_column = static::get_property_value( $node, array( 'spacing', 'blockGap', 'left' ) );
[1653] Fix | Delete
$block_gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
[1654] Fix | Delete
} else {
[1655] Fix | Delete
// Skip outputting gap value if not all sides are provided.
[1656] Fix | Delete
$block_gap_value = null;
[1657] Fix | Delete
}
[1658] Fix | Delete
}
[1659] Fix | Delete
[1660] Fix | Delete
// If the block should have custom gap, add the gap styles.
[1661] Fix | Delete
if ( null !== $block_gap_value && false !== $block_gap_value && '' !== $block_gap_value ) {
[1662] Fix | Delete
foreach ( $layout_definitions as $layout_definition_key => $layout_definition ) {
[1663] Fix | Delete
// Allow outputting fallback gap styles for flex and grid layout types when block gap support isn't available.
[1664] Fix | Delete
if ( ! $has_block_gap_support && 'flex' !== $layout_definition_key && 'grid' !== $layout_definition_key ) {
[1665] Fix | Delete
continue;
[1666] Fix | Delete
}
[1667] Fix | Delete
[1668] Fix | Delete
$class_name = isset( $layout_definition['className'] ) ? $layout_definition['className'] : false;
[1669] Fix | Delete
$spacing_rules = isset( $layout_definition['spacingStyles'] ) ? $layout_definition['spacingStyles'] : array();
[1670] Fix | Delete
[1671] Fix | Delete
if (
[1672] Fix | Delete
! empty( $class_name ) &&
[1673] Fix | Delete
! empty( $spacing_rules )
[1674] Fix | Delete
) {
[1675] Fix | Delete
foreach ( $spacing_rules as $spacing_rule ) {
[1676] Fix | Delete
$declarations = array();
[1677] Fix | Delete
if (
[1678] Fix | Delete
isset( $spacing_rule['selector'] ) &&
[1679] Fix | Delete
preg_match( $layout_selector_pattern, $spacing_rule['selector'] ) &&
[1680] Fix | Delete
! empty( $spacing_rule['rules'] )
[1681] Fix | Delete
) {
[1682] Fix | Delete
// Iterate over each of the styling rules and substitute non-string values such as `null` with the real `blockGap` value.
[1683] Fix | Delete
foreach ( $spacing_rule['rules'] as $css_property => $css_value ) {
[1684] Fix | Delete
$current_css_value = is_string( $css_value ) ? $css_value : $block_gap_value;
[1685] Fix | Delete
if ( static::is_safe_css_declaration( $css_property, $current_css_value ) ) {
[1686] Fix | Delete
$declarations[] = array(
[1687] Fix | Delete
'name' => $css_property,
[1688] Fix | Delete
'value' => $current_css_value,
[1689] Fix | Delete
);
[1690] Fix | Delete
}
[1691] Fix | Delete
}
[1692] Fix | Delete
[1693] Fix | Delete
if ( ! $has_block_gap_support ) {
[1694] Fix | Delete
// For fallback gap styles, use lower specificity, to ensure styles do not unintentionally override theme styles.
[1695] Fix | Delete
$format = static::ROOT_BLOCK_SELECTOR === $selector ? ':where(.%2$s%3$s)' : ':where(%1$s.%2$s%3$s)';
[1696] Fix | Delete
$layout_selector = sprintf(
[1697] Fix | Delete
$format,
[1698] Fix | Delete
$selector,
[1699] Fix | Delete
$class_name,
[1700] Fix | Delete
$spacing_rule['selector']
[1701] Fix | Delete
);
[1702] Fix | Delete
} else {
[1703] Fix | Delete
$format = static::ROOT_BLOCK_SELECTOR === $selector ? ':root :where(.%2$s)%3$s' : ':root :where(%1$s-%2$s)%3$s';
[1704] Fix | Delete
$layout_selector = sprintf(
[1705] Fix | Delete
$format,
[1706] Fix | Delete
$selector,
[1707] Fix | Delete
$class_name,
[1708] Fix | Delete
$spacing_rule['selector']
[1709] Fix | Delete
);
[1710] Fix | Delete
}
[1711] Fix | Delete
$block_rules .= static::to_ruleset( $layout_selector, $declarations );
[1712] Fix | Delete
}
[1713] Fix | Delete
}
[1714] Fix | Delete
}
[1715] Fix | Delete
}
[1716] Fix | Delete
}
[1717] Fix | Delete
}
[1718] Fix | Delete
[1719] Fix | Delete
// Output base styles.
[1720] Fix | Delete
if (
[1721] Fix | Delete
static::ROOT_BLOCK_SELECTOR === $selector
[1722] Fix | Delete
) {
[1723] Fix | Delete
$valid_display_modes = array( 'block', 'flex', 'grid' );
[1724] Fix | Delete
foreach ( $layout_definitions as $layout_definition ) {
[1725] Fix | Delete
$class_name = isset( $layout_definition['className'] ) ? $layout_definition['className'] : false;
[1726] Fix | Delete
$base_style_rules = isset( $layout_definition['baseStyles'] ) ? $layout_definition['baseStyles'] : array();
[1727] Fix | Delete
[1728] Fix | Delete
if (
[1729] Fix | Delete
! empty( $class_name ) &&
[1730] Fix | Delete
is_array( $base_style_rules )
[1731] Fix | Delete
) {
[1732] Fix | Delete
// Output display mode. This requires special handling as `display` is not exposed in `safe_style_css_filter`.
[1733] Fix | Delete
if (
[1734] Fix | Delete
! empty( $layout_definition['displayMode'] ) &&
[1735] Fix | Delete
is_string( $layout_definition['displayMode'] ) &&
[1736] Fix | Delete
in_array( $layout_definition['displayMode'], $valid_display_modes, true )
[1737] Fix | Delete
) {
[1738] Fix | Delete
$layout_selector = sprintf(
[1739] Fix | Delete
'%s .%s',
[1740] Fix | Delete
$selector,
[1741] Fix | Delete
$class_name
[1742] Fix | Delete
);
[1743] Fix | Delete
$block_rules .= static::to_ruleset(
[1744] Fix | Delete
$layout_selector,
[1745] Fix | Delete
array(
[1746] Fix | Delete
array(
[1747] Fix | Delete
'name' => 'display',
[1748] Fix | Delete
'value' => $layout_definition['displayMode'],
[1749] Fix | Delete
),
[1750] Fix | Delete
)
[1751] Fix | Delete
);
[1752] Fix | Delete
}
[1753] Fix | Delete
[1754] Fix | Delete
foreach ( $base_style_rules as $base_style_rule ) {
[1755] Fix | Delete
$declarations = array();
[1756] Fix | Delete
[1757] Fix | Delete
// Skip outputting base styles for flow and constrained layout types if theme doesn't support theme.json. The 'base-layout-styles' type flags this.
[1758] Fix | Delete
if ( in_array( 'base-layout-styles', $types, true ) && ( 'default' === $layout_definition['name'] || 'constrained' === $layout_definition['name'] ) ) {
[1759] Fix | Delete
continue;
[1760] Fix | Delete
}
[1761] Fix | Delete
[1762] Fix | Delete
if (
[1763] Fix | Delete
isset( $base_style_rule['selector'] ) &&
[1764] Fix | Delete
preg_match( $layout_selector_pattern, $base_style_rule['selector'] ) &&
[1765] Fix | Delete
! empty( $base_style_rule['rules'] )
[1766] Fix | Delete
) {
[1767] Fix | Delete
foreach ( $base_style_rule['rules'] as $css_property => $css_value ) {
[1768] Fix | Delete
// Skip rules that reference content size or wide size if they are not defined in the theme.json.
[1769] Fix | Delete
if (
[1770] Fix | Delete
is_string( $css_value ) &&
[1771] Fix | Delete
( str_contains( $css_value, '--global--content-size' ) || str_contains( $css_value, '--global--wide-size' ) ) &&
[1772] Fix | Delete
! isset( $this->theme_json['settings']['layout']['contentSize'] ) &&
[1773] Fix | Delete
! isset( $this->theme_json['settings']['layout']['wideSize'] )
[1774] Fix | Delete
) {
[1775] Fix | Delete
continue;
[1776] Fix | Delete
}
[1777] Fix | Delete
[1778] Fix | Delete
if ( static::is_safe_css_declaration( $css_property, $css_value ) ) {
[1779] Fix | Delete
$declarations[] = array(
[1780] Fix | Delete
'name' => $css_property,
[1781] Fix | Delete
'value' => $css_value,
[1782] Fix | Delete
);
[1783] Fix | Delete
}
[1784] Fix | Delete
}
[1785] Fix | Delete
[1786] Fix | Delete
$layout_selector = sprintf(
[1787] Fix | Delete
'.%s%s',
[1788] Fix | Delete
$class_name,
[1789] Fix | Delete
$base_style_rule['selector']
[1790] Fix | Delete
);
[1791] Fix | Delete
$block_rules .= static::to_ruleset( $layout_selector, $declarations );
[1792] Fix | Delete
}
[1793] Fix | Delete
}
[1794] Fix | Delete
}
[1795] Fix | Delete
}
[1796] Fix | Delete
}
[1797] Fix | Delete
return $block_rules;
[1798] Fix | Delete
}
[1799] Fix | Delete
[1800] Fix | Delete
/**
[1801] Fix | Delete
* Creates new rulesets as classes for each preset value such as:
[1802] Fix | Delete
*
[1803] Fix | Delete
* .has-value-color {
[1804] Fix | Delete
* color: value;
[1805] Fix | Delete
* }
[1806] Fix | Delete
*
[1807] Fix | Delete
* .has-value-background-color {
[1808] Fix | Delete
* background-color: value;
[1809] Fix | Delete
* }
[1810] Fix | Delete
*
[1811] Fix | Delete
* .has-value-font-size {
[1812] Fix | Delete
* font-size: value;
[1813] Fix | Delete
* }
[1814] Fix | Delete
*
[1815] Fix | Delete
* .has-value-gradient-background {
[1816] Fix | Delete
* background: value;
[1817] Fix | Delete
* }
[1818] Fix | Delete
*
[1819] Fix | Delete
* p.has-value-gradient-background {
[1820] Fix | Delete
* background: value;
[1821] Fix | Delete
* }
[1822] Fix | Delete
*
[1823] Fix | Delete
* @since 5.9.0
[1824] Fix | Delete
*
[1825] Fix | Delete
* @param array $setting_nodes Nodes with settings.
[1826] Fix | Delete
* @param string[] $origins List of origins to process presets from.
[1827] Fix | Delete
* @return string The new stylesheet.
[1828] Fix | Delete
*/
[1829] Fix | Delete
protected function get_preset_classes( $setting_nodes, $origins ) {
[1830] Fix | Delete
$preset_rules = '';
[1831] Fix | Delete
[1832] Fix | Delete
foreach ( $setting_nodes as $metadata ) {
[1833] Fix | Delete
if ( null === $metadata['selector'] ) {
[1834] Fix | Delete
continue;
[1835] Fix | Delete
}
[1836] Fix | Delete
[1837] Fix | Delete
$selector = $metadata['selector'];
[1838] Fix | Delete
$node = _wp_array_get( $this->theme_json, $metadata['path'], array() );
[1839] Fix | Delete
$preset_rules .= static::compute_preset_classes( $node, $selector, $origins );
[1840] Fix | Delete
}
[1841] Fix | Delete
[1842] Fix | Delete
return $preset_rules;
[1843] Fix | Delete
}
[1844] Fix | Delete
[1845] Fix | Delete
/**
[1846] Fix | Delete
* Converts each styles section into a list of rulesets
[1847] Fix | Delete
* to be appended to the stylesheet.
[1848] Fix | Delete
* These rulesets contain all the css variables (custom variables and preset variables).
[1849] Fix | Delete
*
[1850] Fix | Delete
* See glossary at https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax
[1851] Fix | Delete
*
[1852] Fix | Delete
* For each section this creates a new ruleset such as:
[1853] Fix | Delete
*
[1854] Fix | Delete
* block-selector {
[1855] Fix | Delete
* --wp--preset--category--slug: value;
[1856] Fix | Delete
* --wp--custom--variable: value;
[1857] Fix | Delete
* }
[1858] Fix | Delete
*
[1859] Fix | Delete
* @since 5.8.0
[1860] Fix | Delete
* @since 5.9.0 Added the `$origins` parameter.
[1861] Fix | Delete
*
[1862] Fix | Delete
* @param array $nodes Nodes with settings.
[1863] Fix | Delete
* @param string[] $origins List of origins to process.
[1864] Fix | Delete
* @return string The new stylesheet.
[1865] Fix | Delete
*/
[1866] Fix | Delete
protected function get_css_variables( $nodes, $origins ) {
[1867] Fix | Delete
$stylesheet = '';
[1868] Fix | Delete
foreach ( $nodes as $metadata ) {
[1869] Fix | Delete
if ( null === $metadata['selector'] ) {
[1870] Fix | Delete
continue;
[1871] Fix | Delete
}
[1872] Fix | Delete
[1873] Fix | Delete
$selector = $metadata['selector'];
[1874] Fix | Delete
[1875] Fix | Delete
$node = _wp_array_get( $this->theme_json, $metadata['path'], array() );
[1876] Fix | Delete
$declarations = static::compute_preset_vars( $node, $origins );
[1877] Fix | Delete
$theme_vars_declarations = static::compute_theme_vars( $node );
[1878] Fix | Delete
foreach ( $theme_vars_declarations as $theme_vars_declaration ) {
[1879] Fix | Delete
$declarations[] = $theme_vars_declaration;
[1880] Fix | Delete
}
[1881] Fix | Delete
[1882] Fix | Delete
$stylesheet .= static::to_ruleset( $selector, $declarations );
[1883] Fix | Delete
}
[1884] Fix | Delete
[1885] Fix | Delete
return $stylesheet;
[1886] Fix | Delete
}
[1887] Fix | Delete
[1888] Fix | Delete
/**
[1889] Fix | Delete
* Given a selector and a declaration list,
[1890] Fix | Delete
* creates the corresponding ruleset.
[1891] Fix | Delete
*
[1892] Fix | Delete
* @since 5.8.0
[1893] Fix | Delete
*
[1894] Fix | Delete
* @param string $selector CSS selector.
[1895] Fix | Delete
* @param array $declarations List of declarations.
[1896] Fix | Delete
* @return string The resulting CSS ruleset.
[1897] Fix | Delete
*/
[1898] Fix | Delete
protected static function to_ruleset( $selector, $declarations ) {
[1899] Fix | Delete
if ( empty( $declarations ) ) {
[1900] Fix | Delete
return '';
[1901] Fix | Delete
}
[1902] Fix | Delete
[1903] Fix | Delete
$declaration_block = array_reduce(
[1904] Fix | Delete
$declarations,
[1905] Fix | Delete
static function ( $carry, $element ) {
[1906] Fix | Delete
return $carry .= $element['name'] . ': ' . $element['value'] . ';'; },
[1907] Fix | Delete
''
[1908] Fix | Delete
);
[1909] Fix | Delete
[1910] Fix | Delete
return $selector . '{' . $declaration_block . '}';
[1911] Fix | Delete
}
[1912] Fix | Delete
[1913] Fix | Delete
/**
[1914] Fix | Delete
* Given a settings array, returns the generated rulesets
[1915] Fix | Delete
* for the preset classes.
[1916] Fix | Delete
*
[1917] Fix | Delete
* @since 5.8.0
[1918] Fix | Delete
* @since 5.9.0 Added the `$origins` parameter.
[1919] Fix | Delete
* @since 6.6.0 Added check for root CSS properties selector.
[1920] Fix | Delete
*
[1921] Fix | Delete
* @param array $settings Settings to process.
[1922] Fix | Delete
* @param string $selector Selector wrapping the classes.
[1923] Fix | Delete
* @param string[] $origins List of origins to process.
[1924] Fix | Delete
* @return string The result of processing the presets.
[1925] Fix | Delete
*/
[1926] Fix | Delete
protected static function compute_preset_classes( $settings, $selector, $origins ) {
[1927] Fix | Delete
if ( static::ROOT_BLOCK_SELECTOR === $selector || static::ROOT_CSS_PROPERTIES_SELECTOR === $selector ) {
[1928] Fix | Delete
/*
[1929] Fix | Delete
* Classes at the global level do not need any CSS prefixed,
[1930] Fix | Delete
* and we don't want to increase its specificity.
[1931] Fix | Delete
*/
[1932] Fix | Delete
$selector = '';
[1933] Fix | Delete
}
[1934] Fix | Delete
[1935] Fix | Delete
$stylesheet = '';
[1936] Fix | Delete
foreach ( static::PRESETS_METADATA as $preset_metadata ) {
[1937] Fix | Delete
if ( empty( $preset_metadata['classes'] ) ) {
[1938] Fix | Delete
continue;
[1939] Fix | Delete
}
[1940] Fix | Delete
$slugs = static::get_settings_slugs( $settings, $preset_metadata, $origins );
[1941] Fix | Delete
foreach ( $preset_metadata['classes'] as $class => $property ) {
[1942] Fix | Delete
foreach ( $slugs as $slug ) {
[1943] Fix | Delete
$css_var = static::replace_slug_in_string( $preset_metadata['css_vars'], $slug );
[1944] Fix | Delete
$class_name = static::replace_slug_in_string( $class, $slug );
[1945] Fix | Delete
[1946] Fix | Delete
// $selector is often empty, so we can save ourselves the `append_to_selector()` call then.
[1947] Fix | Delete
$new_selector = '' === $selector ? $class_name : static::append_to_selector( $selector, $class_name );
[1948] Fix | Delete
$stylesheet .= static::to_ruleset(
[1949] Fix | Delete
$new_selector,
[1950] Fix | Delete
array(
[1951] Fix | Delete
array(
[1952] Fix | Delete
'name' => $property,
[1953] Fix | Delete
'value' => 'var(' . $css_var . ') !important',
[1954] Fix | Delete
),
[1955] Fix | Delete
)
[1956] Fix | Delete
);
[1957] Fix | Delete
}
[1958] Fix | Delete
}
[1959] Fix | Delete
}
[1960] Fix | Delete
[1961] Fix | Delete
return $stylesheet;
[1962] Fix | Delete
}
[1963] Fix | Delete
[1964] Fix | Delete
/**
[1965] Fix | Delete
* Function that scopes a selector with another one. This works a bit like
[1966] Fix | Delete
* SCSS nesting except the `&` operator isn't supported.
[1967] Fix | Delete
*
[1968] Fix | Delete
* <code>
[1969] Fix | Delete
* $scope = '.a, .b .c';
[1970] Fix | Delete
* $selector = '> .x, .y';
[1971] Fix | Delete
* $merged = scope_selector( $scope, $selector );
[1972] Fix | Delete
* // $merged is '.a > .x, .a .y, .b .c > .x, .b .c .y'
[1973] Fix | Delete
* </code>
[1974] Fix | Delete
*
[1975] Fix | Delete
* @since 5.9.0
[1976] Fix | Delete
* @since 6.6.0 Added early return if missing scope or selector.
[1977] Fix | Delete
*
[1978] Fix | Delete
* @param string $scope Selector to scope to.
[1979] Fix | Delete
* @param string $selector Original selector.
[1980] Fix | Delete
* @return string Scoped selector.
[1981] Fix | Delete
*/
[1982] Fix | Delete
public static function scope_selector( $scope, $selector ) {
[1983] Fix | Delete
if ( ! $scope || ! $selector ) {
[1984] Fix | Delete
return $selector;
[1985] Fix | Delete
}
[1986] Fix | Delete
[1987] Fix | Delete
$scopes = explode( ',', $scope );
[1988] Fix | Delete
$selectors = explode( ',', $selector );
[1989] Fix | Delete
[1990] Fix | Delete
$selectors_scoped = array();
[1991] Fix | Delete
foreach ( $scopes as $outer ) {
[1992] Fix | Delete
foreach ( $selectors as $inner ) {
[1993] Fix | Delete
$outer = trim( $outer );
[1994] Fix | Delete
$inner = trim( $inner );
[1995] Fix | Delete
if ( ! empty( $outer ) && ! empty( $inner ) ) {
[1996] Fix | Delete
$selectors_scoped[] = $outer . ' ' . $inner;
[1997] Fix | Delete
} elseif ( empty( $outer ) ) {
[1998] Fix | Delete
$selectors_scoped[] = $inner;
[1999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function