PluginProbe
Elementor Website Builder – more than just a page builder / 3.31.4
Elementor Website Builder – more than just a page builder v3.31.4
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / modules / global-classes / usage / applied-global-classes-usage.php

applied-global-classes-usage.php in Elementor Website Builder – more than just a page builder 3.31.4, at modules/global-classes/usage/applied-global-classes-usage.php

128 lines 2.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\GlobalClasses\Usage;
4
5 use Elementor\Modules\GlobalClasses\Global_Classes_Repository;
6 use Elementor\Plugin;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit; // Exit if accessed directly.
10 }
11
12 /**
13 * Collects and exposes usage data for all global CSS classes across Elementor documents.
14 */
15 class Applied_Global_Classes_Usage {
16
17
18 /**
19 * Document types that should be excluded from usage reporting.
20 *
21 * @var string[]
22 */
23 private array $excluded_types = [ 'e-flexbox', 'template' ];
24
25 /**
26 * Tracks usage for each global class.
27 *
28 * @var array<string, Css_Class_Usage>
29 */
30 private array $class_usages = [];
31
32 /**
33 * Returns the total usage count per class ID (excluding template-only classes).
34 *
35 * @return array<string, int>
36 */
37 public function get(): array {
38 $this->build_class_usages();
39
40 $result = [];
41 foreach ( $this->class_usages as $class_id => $usage ) {
42 if ( $usage->get_total_usage() > 0 ) {
43 $result[ $class_id ] = $usage->get_total_usage();
44 }
45 }
46
47 return $result;
48 }
49
50 /**
51 * Returns detailed usage information per class ID.
52 * Each class ID maps to a list of document usages (excluding excluded types).
53 *
54 * @return array<string, array{
55 * pageId: int,
56 * title: string,
57 * type: string,
58 * total: int,
59 * elements: string[]
60 * }>
61 */
62 public function get_detailed_usage(): array {
63 $this->build_class_usages();
64
65 $result = [];
66
67 foreach ( $this->class_usages as $class_id => $usage ) {
68 $pages = $usage->get_pages();
69
70 $filtered_pages = array_filter(
71 $pages,
72 fn( $page_data ) => ! in_array( $page_data['type'], $this->excluded_types, true )
73 );
74
75 if ( empty( $filtered_pages ) ) {
76 continue;
77 }
78
79 foreach ( $filtered_pages as $page_id => $page_data ) {
80 $result[ $class_id ][] = [
81 'pageId' => $page_id,
82 'title' => $page_data['title'],
83 'type' => $page_data['type'],
84 'total' => $page_data['total'],
85 'elements' => $page_data['elements'],
86 ];
87 }
88 }
89
90 return $result;
91 }
92
93 /**
94 * Builds the internal usage map from all Elementor documents.
95 *
96 * This method initializes and aggregates class usage from all relevant documents,
97 * merging duplicate class IDs found in multiple pages.
98 */
99 private function build_class_usages(): void {
100 $this->class_usages = [];
101
102 $class_ids = Global_Classes_Repository::make()
103 ->all()
104 ->get_items()
105 ->keys()
106 ->all();
107
108 Plugin::$instance->db->iterate_elementor_documents(
109 function ( $document ) use ( $class_ids ) {
110 $usage = new Document_Usage( $document );
111 $usage->analyze();
112
113 foreach ( $usage->get_usages() as $class_id => $class_usage ) {
114 if ( ! in_array( $class_id, $class_ids, true ) ) {
115 continue;
116 }
117
118 if ( ! isset( $this->class_usages[ $class_id ] ) ) {
119 $this->class_usages[ $class_id ] = $class_usage;
120 } else {
121 $this->class_usages[ $class_id ]->merge( $class_usage );
122 }
123 }
124 }
125 );
126 }
127 }
128