/var/www/html_de/wp-content/plugins/elementor/modules/global-classes/usage/document-usage.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php

namespace Elementor\Modules\GlobalClasses\Usage;

use 
Elementor\Plugin;
use 
Elementor\Core\Base\Document as ElementorDocument;
use 
Elementor\Modules\GlobalClasses\Global_Classes_Repository;

/**
 * Tracks usage of global CSS classes within a specific Elementor document.
 */
class Document_Usage {


    
/** @var ElementorDocument */
    
private ElementorDocument $document;

    
/** @var array<string, Css_Class_Usage> */
    
private array $usages = [];

    
/**
     * Constructor.
     *
     * @param ElementorDocument $document The Elementor document object.
     */
    
public function __constructElementorDocument $document ) {
        
$this->document      $document;
    }

    
/**
     * Analyze the document to find and record usage of global CSS classes.
     */
    
public function analyze(): void {
        
$page_id       $this->document->get_main_id();
        
$page_title    $this->document->get_post()->post_title;
        
$class_ids     $this->get_all_global_class_ids();
        
$elements_data $this->document->get_elements_raw_data() ?? [];

        
$document_type $this->document->get_type();
        if ( empty( 
$document_type ) ) {
            
$document_type get_post_type$page_id ) ?? 'unknown';
        }

        if ( empty( 
$elements_data ) ) {
            return;
        }

        
Plugin::$instance->db->iterate_data(
            
$elements_data,
            function ( 
$element_data ) use ( $class_ids$page_id$page_title$document_type ) {
                
$class_values $element_data['settings']['classes']['value'] ?? [];

                if ( empty( 
$class_values ) || ! is_array$class_values ) ) {
                    return;
                }

                foreach ( 
$class_values as $class_id ) {
                    if ( ! 
in_array$class_id$class_idstrue ) ) {
                        continue;
                    }

                    if ( ! isset( 
$this->usages$class_id ] ) ) {
                        
$this->usages$class_id ] = new Css_Class_Usage$class_id );
                    }

                    
$this->usages$class_id ]->track_usage(
                        
$page_id,
                        
$page_title,
                        
$element_data['id'] ?? 'unknown',
                        
$document_type
                    
);
                }
            }
        );
    }

    
/**
     * Get all recorded usages of global CSS classes in this document.
     *
     * @return array<string, Css_Class_Usage>
     */
    
public function get_usages(): array {
        return 
$this->usages;
    }

    
/**֜
     * Retrieve all registered global CSS class IDs.
     *
     * @return string[]
     */
    
protected function get_all_global_class_ids(): array {
        return 
Global_Classes_Repository::make()
            ->
all()
            ->
get_items()
            ->
filter( fn( $item ) => ! empty( $item['id'] ?? null ) )
            ->
keys()
            ->
all();
    }
}