Skip to content

[Bug] Bricks global class names not included in cache scan + scan crash on string _cssGlobalClasses #77

@sabiertas

Description

@sabiertas

Two related bugs with Bricks Builder integration

Bug 1: Cache scan crashes with 500 when _cssGlobalClasses is a string

Endpoint: /wp-json/windpress/v1/admin/settings/cache/providers/scan

Error:

array_map(): Argument #2 ($array) must be of type array, string given

Location: src/Integration/Bricks/Compile.phptransform_meta_value()

Root cause: Bricks sometimes stores _cssGlobalClasses as a plain string (e.g., "nturjc") instead of an array (["nturjc"]) in post meta. This happens when pasting HTML or importing templates. transform_meta_value() calls array_map() on this field without type checking.

Fix:

if (array_key_exists('_cssGlobalClasses', $node['settings'])) {
    $classes = $node['settings']['_cssGlobalClasses'];
    if (is_string($classes)) {
        $classes = [$classes];
    }
    if (is_array($classes)) {
        $meta_value[$key]['settings']['_cssGlobalClasses'] = array_map(
            fn($class) => array_key_exists($class, $this->global_classes_index)
                ? $this->global_classes_index[$class]
                : $class,
            $classes
        );
    }
}

Important: Only _cssGlobalClasses should be cast to array. _cssClasses is a string by design in Bricks — do NOT wrap it in an array or the Bricks editor canvas will render empty (elements exist in the structure panel but nothing shows on canvas).


Bug 2: Bricks global class names are not scanned for Tailwind classes

Scenario: In Bricks, users create global classes with Tailwind utility names (e.g., a global class named bg-gray-950/90). These classes are stored in bricks_global_classes option and referenced by ID in each element's _cssGlobalClasses.

What happens during scan:

  1. transform_meta_value() replaces the global class ID (e.g., upjzfr) with the class name (e.g., bg-gray-950/90)
  2. But it puts this name back into _cssGlobalClasses property of the node settings
  3. The WindPress scanner/oxide-parser extracts Tailwind classes from the content of each node, not from the _cssGlobalClasses property values
  4. Result: the Tailwind class bg-gray-950/90 is never sent to the compiler, so it's missing from the generated CSS cache

Impact: Any Tailwind class used as a Bricks global class name works in the editor (Play CDN mode) but is missing in the frontend cached CSS. This is a very common workflow — Bricks users routinely name global classes with Tailwind utilities.

Workaround (mu-plugin): We registered an additional cache provider that extracts all global class names and feeds them to WindPress as scannable content:

add_filter('f!windpress/core/cache:compile.providers', function($providers) {
    $providers[] = [
        'id' => 'bricks-global-classes-names',
        'name' => 'Bricks Global Class Names',
        'description' => 'Extracts Tailwind classes from Bricks global class names',
        'callback' => function($metadata) {
            if (!defined('BRICKS_VERSION')) return ['metadata' => ['next_batch' => false], 'contents' => []];
            $global_classes = get_option(BRICKS_DB_GLOBAL_CLASSES, []);
            $class_names = [];
            foreach ($global_classes as $gc) {
                if (!empty($gc['name'])) {
                    $class_names[] = $gc['name'];
                }
            }
            return [
                'metadata' => ['next_batch' => false, 'total_batches' => false],
                'contents' => [
                    ['name' => 'bricks_global_class_names',
                     'content' => '<div class="' . esc_attr(implode(' ', $class_names)) . '"></div>']
                ]
            ];
        },
        'enabled' => true,
        'type' => 'custom',
    ];
    return $providers;
}, 20);

Suggested proper fix: In Compile.php, after transform_meta_value() replaces the global class IDs with names, also include these names as scannable class strings in the output content, so the Tailwind compiler picks them up.

Environment

  • WordPress 6.9.4
  • PHP 8.3.6
  • Bricks Builder (latest)
  • WindPress 3.3.78
  • Ubuntu 24.04 / Plesk

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions