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

93 lines 3.3 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\Global_Classes\Usage;
4
5 use Elementor\Core\Base\Document;
6 use Elementor\Core\Utils\Collection;
7 use Elementor\Modules\AtomicWidgets\Elements\Atomic_Element_Base;
8 use Elementor\Modules\AtomicWidgets\Elements\Atomic_Widget_Base;
9 use Elementor\Modules\GlobalClasses\Global_Classes_Repository;
10 use Elementor\Modules\GlobalClasses\Utils\Atomic_Elements_Utils;
11 use Elementor\Plugin;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit; // Exit if accessed directly.
15 }
16
17 class Applied_Global_Classes_Usage {
18 /**
19 * Get data about how global classes are applied across Elementor elements.
20 *
21 * @return array<string, int> Statistics about applied global classes per global class
22 */
23 public function get() {
24 $total_count_per_class_id = [];
25 $global_class_ids = Global_Classes_Repository::make()->all()->get_items()->keys()->all();
26
27 if ( empty( $global_class_ids ) ) {
28 return [];
29 }
30
31 Plugin::$instance->db->iterate_elementor_documents( function( $document, $elements_data ) use ( &$total_count_per_class_id, $global_class_ids ) {
32 $count_per_global_class = $this->get_classes_count_per_class( $elements_data, $global_class_ids );
33
34 $total_count_per_class_id = Collection::make( $count_per_global_class )->reduce( function( $carry, $count, $class_id ) {
35 $carry[ $class_id ] ??= 0;
36 $carry[ $class_id ] += $count;
37
38 return $carry;
39 }, $total_count_per_class_id );
40 });
41
42 foreach ( $global_class_ids as $global_class_id ) {
43 $total_count_per_class_id[ $global_class_id ] ??= 0;
44 }
45
46 return $total_count_per_class_id;
47 }
48
49 private function get_classes_count_per_class( $elements_data, $global_class_ids ) {
50 $count_per_class = [];
51
52 Plugin::$instance->db->iterate_data( $elements_data, function( $element_data ) use ( $global_class_ids, &$count_per_class ) {
53 $element_type = Atomic_Elements_Utils::get_element_type( $element_data );
54 $element_instance = Atomic_Elements_Utils::get_element_instance( $element_type );
55
56 if ( ! Atomic_Elements_Utils::is_atomic_element( $element_instance ) ) {
57 return;
58 }
59
60 /** @var Atomic_Element_Base | Atomic_Widget_Base $element_instance */
61 $applied_classes_per_element = $this->get_applied_global_classes_per_element( $element_instance->get_props_schema(), $element_data, $global_class_ids );
62
63 foreach ( $applied_classes_per_element as $global_class_id => $count ) {
64 $count_per_class[ $global_class_id ] ??= 0;
65 $count_per_class[ $global_class_id ] += $count;
66 }
67 });
68
69 return $count_per_class;
70 }
71
72 private function get_applied_global_classes_per_element( $atomic_props_schema, $atomic_element_data, $global_class_ids ) {
73 return Collection::make( $atomic_props_schema )->reduce( function( $carry, $prop_value, $prop_name ) use ( $atomic_element_data, $global_class_ids ) {
74 if ( ! Atomic_Elements_Utils::is_classes_prop( $prop_value ) ) {
75 return $carry;
76 }
77
78 $prop_applied_global_class_ids = $this->get_applied_global_classes( $atomic_element_data['settings'][ $prop_name ]['value'] ?? [], $global_class_ids );
79
80 foreach ( $prop_applied_global_class_ids as $global_class_id ) {
81 $carry[ $global_class_id ] ??= 0;
82 $carry[ $global_class_id ] += 1;
83 }
84
85 return $carry;
86 }, [] );
87 }
88
89 private function get_applied_global_classes( $prop, $global_class_ids ) {
90 return array_intersect( $prop, $global_class_ids );
91 }
92 }
93