Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/compatibility.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
namespace Elementor;
3
+
4
+
use Elementor\Core\Base\Document;
5
+
use Elementor\Core\DocumentTypes\PageBase;
6
+
use Elementor\TemplateLibrary\Source_Local;
7
+
use Elementor\Utils;
8
+
9
+
if ( ! defined( 'ABSPATH' ) ) {
10
+
exit; // Exit if accessed directly.
11
+
}
12
+
13
+
/**
14
+
* Elementor compatibility.
15
+
*
16
+
* Elementor compatibility handler class is responsible for compatibility with
17
+
* external plugins. The class resolves different issues with non-compatible
18
+
* plugins.
19
+
*
20
+
* @since 1.0.0
21
+
*/
22
+
class Compatibility {
23
+
24
+
/**
25
+
* Register actions.
26
+
*
27
+
* Run Elementor compatibility with external plugins using custom filters and
28
+
* actions.
29
+
*
30
+
* @since 1.0.0
31
+
* @access public
32
+
* @static
33
+
*/
34
+
public static function register_actions() {
35
+
add_action( 'init', [ __CLASS__, 'init' ] );
36
+
37
+
self::polylang_compatibility();
38
+
self::yoast_duplicate_post();
39
+
40
+
if ( is_admin() || defined( 'WP_LOAD_IMPORTERS' ) ) {
41
+
add_filter( 'wp_import_post_meta', [ __CLASS__, 'on_wp_import_post_meta' ] );
42
+
add_filter( 'wxr_importer.pre_process.post_meta', [ __CLASS__, 'on_wxr_importer_pre_process_post_meta' ] );
43
+
}
44
+
45
+
add_action( 'elementor/maintenance_mode/mode_changed', [ __CLASS__, 'clear_3rd_party_cache' ] );
46
+
47
+
// Enable floating buttons and link in bio experiment for all.
48
+
// TODO Remove in version 3.26.
49
+
add_filter( 'pre_option_elementor_experiment-floating-buttons', [ __CLASS__, 'return_active' ] );
50
+
add_filter( 'pre_option_elementor_experiment-link-in-bio', [ __CLASS__, 'return_active' ] );
51
+
}
52
+
53
+
public static function return_active() {
54
+
return 'active';
55
+
}
56
+
57
+
public static function clear_3rd_party_cache() {
58
+
// W3 Total Cache.
59
+
if ( function_exists( 'w3tc_flush_all' ) ) {
60
+
w3tc_flush_all();
61
+
}
62
+
63
+
// WP Fastest Cache.
64
+
if ( ! empty( $GLOBALS['wp_fastest_cache'] ) && method_exists( $GLOBALS['wp_fastest_cache'], 'deleteCache' ) ) {
65
+
$GLOBALS['wp_fastest_cache']->deleteCache();
66
+
}
67
+
68
+
// WP Super Cache.
69
+
if ( function_exists( 'wp_cache_clean_cache' ) ) {
70
+
global $file_prefix;
71
+
wp_cache_clean_cache( $file_prefix, true );
72
+
}
73
+
}
74
+
75
+
/**
76
+
* Add new button to gutenberg.
77
+
*
78
+
* Insert new "Elementor" button to the gutenberg editor to create new post
79
+
* using Elementor page builder.
80
+
*
81
+
* @since 1.9.0
82
+
* @access public
83
+
* @static
84
+
*/
85
+
public static function add_new_button_to_gutenberg() {
86
+
global $typenow;
87
+
if ( ! User::is_current_user_can_edit_post_type( $typenow ) ) {
88
+
return;
89
+
}
90
+
91
+
// Introduced in WP 5.0.
92
+
if ( function_exists( 'use_block_editor_for_post' ) && ! use_block_editor_for_post( $typenow ) ) {
93
+
return;
94
+
}
95
+
96
+
// Deprecated/removed in Gutenberg plugin v5.3.0.
97
+
if ( function_exists( 'gutenberg_can_edit_post_type' ) && ! gutenberg_can_edit_post_type( $typenow ) ) {
98
+
return;
99
+
}
100
+
101
+
?>
102
+
<script>
103
+
document.addEventListener( 'DOMContentLoaded', function() {
104
+
var dropdown = document.querySelector( '#split-page-title-action .dropdown' );
105
+
106
+
if ( ! dropdown ) {
107
+
return;
108
+
}
109
+
110
+
var url = '<?php echo esc_url( Plugin::$instance->documents->get_create_new_post_url( $typenow ) ); ?>';
111
+
112
+
dropdown.insertAdjacentHTML( 'afterbegin', '<a href="' + url + '">Elementor</a>' );
113
+
} );
114
+
</script>
115
+
<?php
116
+
}
117
+
118
+
/**
119
+
* Init.
120
+
*
121
+
* Initialize Elementor compatibility with external plugins.
122
+
*
123
+
* Fired by `init` action.
124
+
*
125
+
* @since 1.0.0
126
+
* @access public
127
+
* @static
128
+
*/
129
+
public static function init() {
130
+
// Hotfix for NextGEN Gallery plugin.
131
+
if ( defined( 'NGG_PLUGIN_VERSION' ) ) {
132
+
add_filter( 'elementor/document/urls/edit', function( $edit_link ) {
133
+
return add_query_arg( 'display_gallery_iframe', '', $edit_link );
134
+
} );
135
+
}
136
+
137
+
// Exclude our Library from Yoast SEO plugin.
138
+
add_filter( 'wpseo_sitemaps_supported_post_types', [ __CLASS__, 'filter_library_post_type' ] );
139
+
add_filter( 'wpseo_accessible_post_types', [ __CLASS__, 'filter_library_post_type' ] );
140
+
add_filter( 'wpseo_sitemap_exclude_post_type', function( $retval, $post_type ) {
141
+
if ( Source_Local::CPT === $post_type ) {
142
+
$retval = true;
143
+
}
144
+
145
+
return $retval;
146
+
}, 10, 2 );
147
+
148
+
// Disable optimize files in Editor from Autoptimize plugin.
149
+
add_filter( 'autoptimize_filter_noptimize', function( $retval ) {
150
+
if ( Plugin::$instance->editor->is_edit_mode() ) {
151
+
$retval = true;
152
+
}
153
+
154
+
return $retval;
155
+
} );
156
+
157
+
// Add the description (content) tab for a new product, so it can be edited with Elementor.
158
+
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
159
+
if ( ! isset( $tabs['description'] ) && Plugin::$instance->preview->is_preview_mode() ) {
160
+
$post = get_post();
161
+
if ( empty( $post->post_content ) ) {
162
+
$tabs['description'] = [
163
+
'title' => esc_html__( 'Description', 'elementor' ),
164
+
'priority' => 10,
165
+
'callback' => 'woocommerce_product_description_tab',
166
+
];
167
+
}
168
+
}
169
+
170
+
return $tabs;
171
+
} );
172
+
173
+
// Fix WC session not defined in editor.
174
+
if ( class_exists( 'woocommerce' ) ) {
175
+
add_action( 'elementor/editor/before_enqueue_scripts', function() {
176
+
remove_action( 'woocommerce_shortcode_before_product_cat_loop', 'wc_print_notices' );
177
+
remove_action( 'woocommerce_before_shop_loop', 'wc_print_notices' );
178
+
remove_action( 'woocommerce_before_single_product', 'wc_print_notices' );
179
+
} );
180
+
181
+
add_filter( 'elementor/maintenance_mode/is_login_page', function( $value ) {
182
+
183
+
// Support Woocommerce Account Page.
184
+
if ( is_account_page() && ! is_user_logged_in() ) {
185
+
$value = true;
186
+
}
187
+
return $value;
188
+
} );
189
+
}
190
+
191
+
// Fix Jetpack Contact Form in Editor Mode.
192
+
if ( class_exists( 'Grunion_Editor_View' ) ) {
193
+
add_action( 'elementor/editor/before_enqueue_scripts', function() {
194
+
remove_action( 'media_buttons', 'grunion_media_button', 999 );
195
+
remove_action( 'admin_enqueue_scripts', 'grunion_enable_spam_recheck' );
196
+
197
+
remove_action( 'admin_notices', [ 'Grunion_Editor_View', 'handle_editor_view_js' ] );
198
+
remove_action( 'admin_head', [ 'Grunion_Editor_View', 'admin_head' ] );
199
+
} );
200
+
}
201
+
202
+
// Fix Popup Maker in Editor Mode.
203
+
if ( class_exists( 'PUM_Admin_Shortcode_UI' ) ) {
204
+
add_action( 'elementor/editor/before_enqueue_scripts', function() {
205
+
$pum_admin_instance = \PUM_Admin_Shortcode_UI::instance();
206
+
207
+
remove_action( 'print_media_templates', [ $pum_admin_instance, 'print_media_templates' ] );
208
+
remove_action( 'admin_print_footer_scripts', [ $pum_admin_instance, 'admin_print_footer_scripts' ], 100 );
209
+
remove_action( 'wp_ajax_pum_do_shortcode', [ $pum_admin_instance, 'wp_ajax_pum_do_shortcode' ] );
210
+
211
+
remove_action( 'admin_enqueue_scripts', [ $pum_admin_instance, 'admin_enqueue_scripts' ] );
212
+
213
+
remove_filter( 'pum_admin_var', [ $pum_admin_instance, 'pum_admin_var' ] );
214
+
} );
215
+
}
216
+
217
+
// Fix Preview URL for https://github.com/wpmudev/domain-mapping plugin.
218
+
if ( class_exists( 'domain_map' ) ) {
219
+
add_filter( 'elementor/document/urls/preview', function( $preview_url ) {
220
+
if ( wp_parse_url( $preview_url, PHP_URL_HOST ) !== Utils::get_super_global_value( $_SERVER, 'HTTP_HOST' ) ) {
221
+
$preview_url = \domain_map::utils()->unswap_url( $preview_url );
222
+
$preview_url = add_query_arg( [
223
+
'dm' => \Domainmap_Module_Mapping::BYPASS,
224
+
], $preview_url );
225
+
}
226
+
227
+
return $preview_url;
228
+
} );
229
+
}
230
+
231
+
// Gutenberg.
232
+
if ( function_exists( 'gutenberg_init' ) ) {
233
+
add_action( 'admin_print_scripts-edit.php', [ __CLASS__, 'add_new_button_to_gutenberg' ], 11 );
234
+
}
235
+
}
236
+
237
+
public static function filter_library_post_type( $post_types ) {
238
+
unset( $post_types[ Source_Local::CPT ] );
239
+
240
+
return $post_types;
241
+
}
242
+
243
+
/**
244
+
* Polylang compatibility.
245
+
*
246
+
* Fix Polylang compatibility with Elementor.
247
+
*
248
+
* @since 2.0.0
249
+
* @access private
250
+
* @static
251
+
*/
252
+
private static function polylang_compatibility() {
253
+
// Copy elementor data while polylang creates a translation copy.
254
+
add_filter( 'pll_copy_post_metas', [ __CLASS__, 'save_polylang_meta' ], 10, 4 );
255
+
}
256
+
257
+
/**
258
+
* Save polylang meta.
259
+
*
260
+
* Copy elementor data while polylang creates a translation copy.
261
+
*
262
+
* Fired by `pll_copy_post_metas` filter.
263
+
*
264
+
* @since 1.6.0
265
+
* @access public
266
+
* @static
267
+
*
268
+
* @param array $keys List of custom fields names.
269
+
* @param bool $sync True if it is synchronization, false if it is a copy.
270
+
* @param int $from ID of the post from which we copy information.
271
+
* @param int $to ID of the post to which we paste information.
272
+
*
273
+
* @return array List of custom fields names.
274
+
*/
275
+
public static function save_polylang_meta( $keys, $sync, $from, $to ) {
276
+
// Copy only for a new post.
277
+
if ( ! $sync ) {
278
+
Plugin::$instance->db->copy_elementor_meta( $from, $to );
279
+
}
280
+
281
+
return $keys;
282
+
}
283
+
284
+
private static function yoast_duplicate_post() {
285
+
add_filter( 'duplicate_post_excludelist_filter', function( $meta_excludelist ) {
286
+
$exclude_list = [
287
+
Document::TYPE_META_KEY,
288
+
'_elementor_page_assets',
289
+
'_elementor_controls_usage',
290
+
'_elementor_css',
291
+
'_elementor_screenshot',
292
+
];
293
+
294
+
return array_merge( $meta_excludelist, $exclude_list );
295
+
} );
296
+
297
+
add_action( 'duplicate_post_post_copy', function( $new_post_id, $post ) {
298
+
$original_template_type = get_post_meta( $post->ID, Document::TYPE_META_KEY, true );
299
+
if ( ! empty( $original_template_type ) ) {
300
+
update_post_meta( $new_post_id, Document::TYPE_META_KEY, $original_template_type );
301
+
}
302
+
}, 10, 2 );
303
+
}
304
+
305
+
/**
306
+
* Process post meta before WP importer.
307
+
*
308
+
* Normalize Elementor post meta on import, We need the `wp_slash` in order
309
+
* to avoid the unslashing during the `add_post_meta`.
310
+
*
311
+
* Fired by `wp_import_post_meta` filter.
312
+
*
313
+
* @since 1.0.0
314
+
* @access public
315
+
* @static
316
+
*
317
+
* @param array $post_meta Post meta.
318
+
*
319
+
* @return array Updated post meta.
320
+
*/
321
+
public static function on_wp_import_post_meta( $post_meta ) {
322
+
$is_wp_importer_before_0_7 = self::is_wp_importer_before_0_7();
323
+
324
+
if ( $is_wp_importer_before_0_7 ) {
325
+
foreach ( $post_meta as &$meta ) {
326
+
if ( '_elementor_data' === $meta['key'] ) {
327
+
$meta['value'] = wp_slash( $meta['value'] );
328
+
break;
329
+
}
330
+
}
331
+
}
332
+
333
+
return $post_meta;
334
+
}
335
+
336
+
/**
337
+
* Is WP Importer Before 0.7
338
+
*
339
+
* Checks if WP Importer is installed, and whether its version is older than 0.7.
340
+
*
341
+
* @return bool
342
+
*/
343
+
public static function is_wp_importer_before_0_7() {
344
+
$wp_importer = get_plugins( '/wordpress-importer' );
345
+
346
+
if ( ! empty( $wp_importer ) ) {
347
+
$wp_importer_version = $wp_importer['wordpress-importer.php']['Version'];
348
+
349
+
if ( version_compare( $wp_importer_version, '0.7', '<' ) ) {
350
+
return true;
351
+
}
352
+
}
353
+
354
+
return false;
355
+
}
356
+
357
+
/**
358
+
* Process post meta before WXR importer.
359
+
*
360
+
* Normalize Elementor post meta on import with the new WP_importer, We need
361
+
* the `wp_slash` in order to avoid the unslashing during the `add_post_meta`.
362
+
*
363
+
* Fired by `wxr_importer.pre_process.post_meta` filter.
364
+
*
365
+
* @since 1.0.0
366
+
* @access public
367
+
* @static
368
+
*
369
+
* @param array $post_meta Post meta.
370
+
*
371
+
* @return array Updated post meta.
372
+
*/
373
+
public static function on_wxr_importer_pre_process_post_meta( $post_meta ) {
374
+
$is_wp_importer_before_0_7 = self::is_wp_importer_before_0_7();
375
+
376
+
if ( $is_wp_importer_before_0_7 ) {
377
+
if ( '_elementor_data' === $post_meta['key'] ) {
378
+
$post_meta['value'] = wp_slash( $post_meta['value'] );
379
+
}
380
+
}
381
+
382
+
return $post_meta;
383
+
}
384
+
}
385
+