PluginProbe
Elementor Website Builder – more than just a page builder / 4.2.1
Elementor Website Builder – more than just a page builder v4.2.1
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 4.2.1, at modules/global-classes/usage/applied-global-classes-usage.php

124 lines 3.0 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 * Document types that should be excluded from usage reporting.
19 *
20 * @var string[]
21 */
22 private array $excluded_types = [ 'e-flexbox', 'template' ];
23
24 /**
25 * Tracks usage for each global class.
26 *
27 * @var array<string, Css_Class_Usage>
28 */
29 private array $class_usages = [];
30
31 /**
32 * Returns the total usage count per class ID (excluding template-only classes).
33 *
34 * @return array<string, int>
35 */
36 public function get(): array {
37 $this->build_class_usages();
38
39 $result = [];
40 foreach ( $this->class_usages as $class_id => $usage ) {
41 if ( $usage->get_total_usage() > 0 ) {
42 $result[ $class_id ] = $usage->get_total_usage();
43 }
44 }
45
46 return $result;
47 }
48
49 /**
50 * Returns detailed usage information per class ID.
51 * Each class ID maps to a list of document usages (excluding excluded types).
52 *
53 * @return array<string, array{
54 * pageId: int,
55 * title: string,
56 * type: string,
57 * total: int,
58 * elements: string[]
59 * }>
60 */
61 public function get_detailed_usage(): array {
62 $this->build_class_usages();
63
64 $result = [];
65
66 foreach ( $this->class_usages as $class_id => $usage ) {
67 $pages = $usage->get_pages();
68
69 $filtered_pages = array_filter(
70 $pages,
71 fn( $page_data ) => ! in_array( $page_data['type'], $this->excluded_types, true )
72 );
73
74 if ( empty( $filtered_pages ) ) {
75 continue;
76 }
77
78 foreach ( $filtered_pages as $page_id => $page_data ) {
79 $result[ $class_id ][] = [
80 'pageId' => $page_id,
81 'title' => $page_data['title'],
82 'type' => $page_data['type'],
83 'total' => $page_data['total'],
84 'elements' => $page_data['elements'],
85 ];
86 }
87 }
88
89 return $result;
90 }
91
92 /**
93 * Builds the internal usage map from all Elementor documents.
94 *
95 * This method initializes and aggregates class usage from all relevant documents,
96 * merging duplicate class IDs found in multiple pages.
97 */
98 private function build_class_usages(): void {
99 $this->class_usages = [];
100
101 $class_ids = array_keys( Global_Classes_Repository::make()->all_labels() );
102 $class_id_set = array_fill_keys( $class_ids, true );
103
104 Plugin::$instance->db->iterate_elementor_documents(
105 function ( $document ) use ( $class_id_set ) {
106 $usage = new Document_Usage( $document, $class_id_set );
107 $usage->analyze();
108
109 foreach ( $usage->get_usages() as $class_id => $class_usage ) {
110 if ( ! isset( $class_id_set[ $class_id ] ) ) {
111 continue;
112 }
113
114 if ( ! isset( $this->class_usages[ $class_id ] ) ) {
115 $this->class_usages[ $class_id ] = $class_usage;
116 } else {
117 $this->class_usages[ $class_id ]->merge( $class_usage );
118 }
119 }
120 }
121 );
122 }
123 }
124