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

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