PluginProbe
Elementor Website Builder – more than just a page builder / 4.1.0
Elementor Website Builder – more than just a page builder v4.1.0
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 / promotions / module.php

module.php in Elementor Website Builder – more than just a page builder 4.1.0, at modules/promotions/module.php

298 lines 8.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\Promotions;
4
5 use Elementor\Api;
6 use Elementor\Controls_Manager;
7 use Elementor\Core\Base\Module as Base_Module;
8 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Custom_Code_Menu;
9 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Custom_Elements_Menu;
10 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Fonts_Menu;
11 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Icons_Menu;
12 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Popups_Menu;
13 use Elementor\Modules\Promotions\AdminMenuItems\Editor_One_Submissions_Menu;
14 use Elementor\Modules\Promotions\AdminMenuItems\Go_Pro_Promotion_Item;
15 use Elementor\Modules\Promotions\Controls\Atomic_Promotion_Control;
16 use Elementor\Modules\Promotions\Pointers\Birthday;
17 use Elementor\Modules\Promotions\Pointers\Black_Friday;
18 use Elementor\Modules\Promotions\PropTypes\Promotion_Prop_Type;
19 use Elementor\Modules\Promotions\Widgets\Ally_Dashboard_Widget;
20 use Elementor\Modules\Promotions\Widgets\Atomic_Form_Widget_Promotion;
21 use Elementor\Widgets_Manager;
22 use Elementor\Utils;
23 use Elementor\Includes\EditorAssetsAPI;
24 use Elementor\Plugin;
25 use Elementor\Modules\EditorOne\Classes\Menu_Data_Provider;
26
27 if ( ! defined( 'ABSPATH' ) ) {
28 exit; // Exit if accessed directly.
29 }
30
31 class Module extends Base_Module {
32
33 const ADMIN_MENU_PRIORITY = 100;
34
35 const ADMIN_MENU_PROMOTIONS_PRIORITY = 120;
36
37 public static function is_active() {
38 return ! Utils::has_pro();
39 }
40
41 public function get_name() {
42 return 'promotions';
43 }
44
45 public function __construct() {
46 parent::__construct();
47
48 add_action( 'admin_init', function () {
49 $this->handle_external_redirects();
50 } );
51
52 add_action( 'elementor/editor-one/menu/register', function ( Menu_Data_Provider $menu_data_provider ) {
53 $this->register_editor_one_menu_items( $menu_data_provider );
54 } );
55
56 add_action( 'elementor/widgets/register', function( Widgets_Manager $manager ) {
57 foreach ( Api::get_promotion_widgets() as $widget_data ) {
58 $manager->register( new Widgets\Pro_Widget_Promotion( [], [
59 'widget_name' => $widget_data['name'],
60 'widget_title' => $widget_data['title'],
61 ] ) );
62 }
63 } );
64
65 if ( Birthday::should_display_notice() ) {
66 new Birthday();
67 }
68
69 if ( Black_Friday::should_display_notice() ) {
70 new Black_Friday();
71 }
72
73 add_filter( 'elementor/editor/localize_settings', [ $this, 'add_v4_promotions_data' ] );
74
75 if ( Utils::has_pro() ) {
76 return;
77 }
78
79 add_action( 'elementor/controls/register', function ( Controls_Manager $controls_manager ) {
80 $controls_manager->register( new Controls\Promotion_Control() );
81 } );
82
83 add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue_react_data' ] );
84 add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue_editor_v4_alphachip' ] );
85
86 // Add Ally promo
87 Ally_Dashboard_Widget::init();
88
89 $this->register_atomic_promotions();
90 }
91
92 /**
93 * Get Ally Scanner URL
94 *
95 * @return string
96 */
97 public static function get_ally_external_scanner_url(): string {
98 return apply_filters( 'elementor/ally_external_scanner_url', 'https://go.elementor.com/acc-checker-dashboard-plg' );
99 }
100
101 private function handle_external_redirects() {
102 $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
103 if ( empty( $page ) ) {
104 return;
105 }
106
107 if ( 'go_elementor_pro' === $page ) {
108 wp_redirect( Go_Pro_Promotion_Item::get_url() ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
109 die;
110 }
111 }
112
113 private function register_editor_one_menu_items( Menu_Data_Provider $menu_data_provider ) {
114 $menu_data_provider->register_menu( new Editor_One_Custom_Elements_Menu() );
115 $menu_data_provider->register_menu( new Editor_One_Submissions_Menu() );
116 $menu_data_provider->register_menu( new Editor_One_Fonts_Menu() );
117 $menu_data_provider->register_menu( new Editor_One_Icons_Menu() );
118 $menu_data_provider->register_menu( new Editor_One_Custom_Code_Menu() );
119 $menu_data_provider->register_menu( new Editor_One_Popups_Menu() );
120 }
121
122 public function enqueue_react_data(): void {
123 if ( ! current_user_can( 'manage_options' ) ) {
124 return;
125 }
126
127 $min_suffix = Utils::is_script_debug() ? '' : '.min';
128
129 wp_enqueue_script(
130 'e-react-promotions',
131 ELEMENTOR_ASSETS_URL . 'js/e-react-promotions' . $min_suffix . '.js',
132 [
133 'react',
134 'react-dom',
135 'backbone-marionette',
136 'elementor-editor-modules',
137 'elementor-v2-ui',
138 ],
139 ELEMENTOR_VERSION,
140 true
141 );
142
143 wp_set_script_translations( 'e-react-promotions', 'elementor' );
144
145 wp_localize_script(
146 'e-react-promotions',
147 'elementorPromotionsData',
148 $this->get_app_js_config()
149 );
150 }
151
152 public function enqueue_editor_v4_alphachip(): void {
153 if ( ! current_user_can( 'manage_options' ) ) {
154 return;
155 }
156
157 $min_suffix = Utils::is_script_debug() ? '' : '.min';
158
159 wp_enqueue_script(
160 'editor-v4-opt-in-alphachip',
161 ELEMENTOR_ASSETS_URL . 'js/editor-v4-opt-in-alphachip' . $min_suffix . '.js',
162 [
163 'react',
164 'react-dom',
165 'elementor-common',
166 'elementor-v2-ui',
167 ],
168 ELEMENTOR_VERSION,
169 true
170 );
171 }
172
173 private function get_app_js_config(): array {
174 $editor_assets_api = new EditorAssetsAPI( $this->get_api_config() );
175 $promotion_data = new PromotionData( $editor_assets_api );
176
177 return $promotion_data->get_promotion_data();
178 }
179
180 private function get_api_config(): array {
181 return [
182 EditorAssetsAPI::ASSETS_DATA_URL => 'https://assets.elementor.com/free-to-pro-upsell/v1/free-to-pro-upsell.json',
183 EditorAssetsAPI::ASSETS_DATA_TRANSIENT_KEY => '_elementor_free_to_pro_upsell',
184 EditorAssetsAPI::ASSETS_DATA_KEY => 'free-to-pro-upsell',
185 ];
186 }
187
188 public function add_v4_promotions_data( array $settings ): array {
189 if ( ! current_user_can( 'manage_options' ) ) {
190 return $settings;
191 }
192
193 $editor_assets_api = new EditorAssetsAPI( $this->get_v4_promotions_api_config() );
194 $promotion_data = new PromotionData( $editor_assets_api );
195
196 $settings['v4Promotions'] = $promotion_data->get_v4_promotions_data();
197
198 return $settings;
199 }
200
201 private function get_v4_promotions_api_config(): array {
202 return [
203 EditorAssetsAPI::ASSETS_DATA_URL => 'https://assets.elementor.com/packages/v1/promotions.json',
204 EditorAssetsAPI::ASSETS_DATA_TRANSIENT_KEY => '_elementor_v4_promotions',
205 EditorAssetsAPI::ASSETS_DATA_KEY => 'promotions',
206 ];
207 }
208
209 private function is_atomic_widgets_active(): bool {
210 return Plugin::$instance->experiments->is_feature_active( 'e_atomic_elements' );
211 }
212
213 private function get_atomic_promotion_configs(): array {
214 return [
215 [
216 'key' => 'attributes',
217 'label' => __( 'Attributes', 'elementor' ),
218 'section' => 'settings',
219 'priority' => 40,
220 ],
221 [
222 'key' => 'display-conditions',
223 'label' => __( 'Display Conditions', 'elementor' ),
224 'section' => 'settings',
225 'priority' => 50,
226 ],
227 ];
228 }
229
230 private function register_atomic_promotions(): void {
231 add_action( 'elementor/init', function() {
232 if ( ! $this->is_atomic_widgets_active() ) {
233 return;
234 }
235
236 add_filter(
237 'elementor/atomic-widgets/props-schema',
238 [ $this, 'inject_atomic_promotion_props' ]
239 );
240
241 foreach ( $this->get_atomic_promotion_configs() as $config ) {
242 add_filter(
243 'elementor/atomic-widgets/controls',
244 fn( array $controls, $element ) => $this->inject_atomic_promotion_control( $controls, $element, $config ),
245 $config['priority'],
246 2
247 );
248 }
249 } );
250
251 ( new Atomic_Form_Widget_Promotion() )->register();
252 }
253
254 public function inject_atomic_promotion_props( array $schema ): array {
255 foreach ( $this->get_atomic_promotion_configs() as $config ) {
256 $key = $config['key'];
257
258 if ( isset( $schema[ $key ] ) ) {
259 continue;
260 }
261
262 $schema[ $key ] = Promotion_Prop_Type::make( $key );
263 }
264
265 return $schema;
266 }
267
268 protected function inject_atomic_promotion_control( array $element_controls, $atomic_element, array $config ): array {
269 $key = $config['key'];
270 $schema = $atomic_element::get_props_schema();
271
272 if ( ! array_key_exists( $key, $schema ) ) {
273 return $element_controls;
274 }
275
276 foreach ( $element_controls as $item ) {
277 if ( ! ( $item instanceof \Elementor\Modules\AtomicWidgets\Controls\Section ) ) {
278 continue;
279 }
280
281 if ( $item->get_id() !== $config['section'] ) {
282 continue;
283 }
284
285 $control = Atomic_Promotion_Control::make( $key )
286 ->set_label( $config['label'] )
287 ->set_meta( [
288 'topDivider' => true,
289 ] );
290
291 $item->add_item( $control );
292 break;
293 }
294
295 return $element_controls;
296 }
297 }
298