PluginProbe
Elementor Website Builder – more than just a page builder / 3.35.3
Elementor Website Builder – more than just a page builder v3.35.3
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 3.35.3, at modules/promotions/module.php

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