EmbedPress – Embed Google Docs, YouTube, Maps, Vimeo, Wistia Videos & Upload PDF, PPT in Gutenberg & Elementor - Version 2.4.1

Version Description

Download this release

Release Info

Developer Asif2BD
Plugin Icon wp plugin EmbedPress – Embed Google Docs, YouTube, Maps, Vimeo, Wistia Videos & Upload PDF, PPT in Gutenberg & Elementor
Version 2.4.1
Comparing to
See all releases

Code changes from version 2.4.0 to 2.4.1

EmbedPress/Core.php CHANGED
@@ -453,6 +453,10 @@ class Core {
453
  $settings['enablePluginInFront'] = true;
454
  }
455
 
 
 
 
 
456
  if (!isset($settings['enableEmbedResizeHeight'])) {
457
  $settings['enableEmbedResizeHeight'] = 552;
458
  }
453
  $settings['enablePluginInFront'] = true;
454
  }
455
 
456
+ if (!isset($settings['enableGlobalEmbedResize'])) {
457
+ $settings['enableGlobalEmbedResize'] = false;
458
+ }
459
+
460
  if (!isset($settings['enableEmbedResizeHeight'])) {
461
  $settings['enableEmbedResizeHeight'] = 552;
462
  }
EmbedPress/Ends/Back/Settings.php CHANGED
@@ -4,7 +4,7 @@ namespace EmbedPress\Ends\Back;
4
 
5
  use EmbedPress\Compatibility;
6
 
7
- (defined('ABSPATH') && defined('EMBEDPRESS_IS_LOADED')) or die("No direct script access allowed.");
8
 
9
  /**
10
  * Entity that handles the plugin's settings page.
@@ -16,8 +16,7 @@ use EmbedPress\Compatibility;
16
  * @license GPLv2 or later
17
  * @since 1.0.0
18
  */
19
- class Settings
20
- {
21
  /**
22
  * This class namespace.
23
  *
@@ -67,8 +66,7 @@ class Settings
67
  *
68
  * @since 1.0.0
69
  */
70
- public function __construct()
71
- {
72
  }
73
 
74
  /**
@@ -76,8 +74,7 @@ class Settings
76
  *
77
  * @since 1.0.0
78
  */
79
- public function __clone()
80
- {
81
  }
82
 
83
  /**
@@ -86,10 +83,9 @@ class Settings
86
  * @since 1.0.0
87
  * @static
88
  */
89
- public static function registerMenuItem()
90
- {
91
- add_menu_page('EmbedPress Settings', 'EmbedPress', 'manage_options', 'embedpress',
92
- [self::$namespace, 'renderForm'], null, 64);
93
  }
94
 
95
  /**
@@ -98,38 +94,41 @@ class Settings
98
  * @since 1.0.0
99
  * @static
100
  */
101
- public static function registerActions()
102
- {
103
- $activeTab = isset($_GET['tab']) ? strtolower($_GET['tab']) : "";
104
- if ($activeTab !== "embedpress") {
105
  $action = "embedpress:{$activeTab}:settings:register";
106
  } else {
107
  $activeTab = "";
108
  }
109
 
110
- if ( ! empty($activeTab) && has_action($action)) {
111
- do_action($action, [
112
  'id' => self::$sectionAdminIdentifier,
113
  'slug' => self::$identifier,
114
- ]);
115
  } else {
116
- register_setting(self::$sectionGroupIdentifier, self::$sectionGroupIdentifier,
117
- [self::$namespace, "validateForm"]);
118
 
119
- add_settings_section(self::$sectionAdminIdentifier, '', null, self::$identifier);
120
 
121
  $fieldMap = [];
122
- if ( ! Compatibility::isWordPress5() || Compatibility::isClassicalEditorActive()) {
123
  $fieldMap = [
124
- 'enablePluginInAdmin' => [
125
  'label' => "Load previews in the admin editor",
126
  'section' => "admin",
127
  ],
128
- 'enablePluginInFront' => [
129
  'label' => "Load previews in the frontend editor",
130
  'section' => "admin",
131
  ],
132
- 'enableEmbedResizeWidth' => [
 
 
 
 
133
  'label' => "Embed Iframe Width",
134
  'section' => "admin",
135
  ],
@@ -145,9 +144,9 @@ class Settings
145
  'section' => "admin",
146
  ];
147
 
148
- foreach ($fieldMap as $fieldName => $field) {
149
- add_settings_field($fieldName, $field['label'], [self::$namespace, "renderField_{$fieldName}"],
150
- self::$identifier, self::${"section" . ucfirst($field['section']) . "Identifier"});
151
  }
152
  }
153
  }
@@ -155,25 +154,23 @@ class Settings
155
  /**
156
  * Returns true if the plugin is active
157
  *
158
- * @param string $plugin
159
  *
160
  * @return boolean
161
  */
162
- protected static function is_plugin_active($plugin)
163
- {
164
- return is_plugin_active("{$plugin}/{$plugin}.php");
165
  }
166
 
167
  /**
168
  * Returns true if the plugin is installed
169
  *
170
- * @param string $plugin
171
  *
172
  * @return boolean
173
  */
174
- protected static function is_plugin_installed($plugin)
175
- {
176
- return file_exists(plugin_dir_path(EMBEDPRESS_ROOT) . "{$plugin}/{$plugin}.php");
177
  }
178
 
179
  /**
@@ -182,17 +179,16 @@ class Settings
182
  * @since 1.0.0
183
  * @static
184
  */
185
- public static function renderForm()
186
- {
187
  // Add the color picker css file
188
- wp_enqueue_style('wp-color-picker');
189
  // Include our custom jQuery file with WordPress Color Picker dependency
190
- wp_enqueue_script('ep-settings', EMBEDPRESS_URL_ASSETS . 'js/settings.js', ['wp-color-picker'],
191
- EMBEDPRESS_VERSION, true);
192
 
193
- $activeTab = isset($_GET['tab']) ? strtolower($_GET['tab']) : "";
194
- $settingsFieldsIdentifier = ! empty($activeTab) ? "embedpress:{$activeTab}" : self::$sectionGroupIdentifier;
195
- $settingsSectionsIdentifier = ! empty($activeTab) ? "embedpress:{$activeTab}" : self::$identifier;
196
  ?>
197
  <div id="embedpress-settings-wrapper">
198
  <header>
@@ -208,25 +204,26 @@ class Settings
208
  <div>
209
  <h2 class="nav-tab-wrapper">
210
  <a href="?page=embedpress"
211
- class="nav-tab<?php echo $activeTab === 'embedpress' || empty($activeTab) ? ' nav-tab-active' : ''; ?> ">
212
  General settings
213
  </a>
214
- <?php do_action('embedpress:settings:render:tab', $activeTab); ?>
215
- <?php do_action('embedpress_license_tab',$activeTab); ?>
216
 
217
  </h2>
218
 
219
- <?php if ($activeTab !== 'addons') : ?>
220
  <form action="options.php" method="POST" style="padding-bottom: 20px;">
221
- <?php settings_fields($settingsFieldsIdentifier); ?>
222
- <?php do_settings_sections($settingsSectionsIdentifier); ?>
223
- <?php if ($activeTab !== 'embedpress_license') : ?>
224
- <button type="submit" class="button button-primary embedpress-setting-save">Save changes</button>
 
225
  <?php endif; ?>
226
  </form>
227
  <?php endif; ?>
228
- <?php if ($activeTab == 'embedpress_license') : ?>
229
- <?php echo do_action('embedpress_license'); ?>
230
  <?php endif; ?>
231
  </div>
232
 
@@ -288,21 +285,21 @@ class Settings
288
  /**
289
  * Method that validates the form data.
290
  *
 
 
 
291
  * @since 1.0.0
292
  * @static
293
  *
294
- * @param mixed $freshData Data received from the form.
295
- *
296
- * @return array
297
  */
298
- public static function validateForm($freshData)
299
- {
300
  $data = [
301
- 'enablePluginInAdmin' => isset($freshData['enablePluginInAdmin']) ? (bool)$freshData['enablePluginInAdmin'] : true,
302
- 'enablePluginInFront' => isset($freshData['enablePluginInFront']) ? (bool)$freshData['enablePluginInFront'] : true,
303
- 'enableEmbedResizeHeight' => isset($freshData['enableEmbedResizeHeight']) ? $freshData['enableEmbedResizeHeight'] : 552,
304
- 'enableEmbedResizeWidth' => isset($freshData['enableEmbedResizeWidth']) ? $freshData['enableEmbedResizeWidth'] : 652,
305
- 'fbLanguage' => $freshData['fbLanguage'],
 
306
  ];
307
 
308
  return $data;
@@ -314,15 +311,14 @@ class Settings
314
  * @since 1.0.0
315
  * @static
316
  */
317
- public static function renderField_enablePluginInAdmin()
318
- {
319
  $fieldName = "enablePluginInAdmin";
320
 
321
- $options = get_option(self::$sectionGroupIdentifier);
322
 
323
- $options[$fieldName] = ! isset($options[$fieldName]) ? true : (bool)$options[$fieldName];
324
 
325
- echo '<label><input type="radio" id="' . $fieldName . '_0" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="0" ' . (! $options[$fieldName] ? "checked" : "") . ' /> No</label>';
326
  echo "&nbsp;&nbsp;";
327
  echo '<label><input type="radio" id="' . $fieldName . '_1" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="1" ' . ($options[$fieldName] ? "checked" : "") . ' /> Yes</label>';
328
  echo '<p class="description">Do you want EmbedPress to run here in the admin area? Disabling this <strong>will not</strong> affect your frontend embeds.</p>';
@@ -334,37 +330,54 @@ class Settings
334
  * @since 1.6.0
335
  * @static
336
  */
337
- public static function renderField_enablePluginInFront()
338
- {
339
  $fieldName = "enablePluginInFront";
340
 
341
- $options = get_option(self::$sectionGroupIdentifier);
342
 
343
- $options[$fieldName] = ! isset($options[$fieldName]) ? true : (bool)$options[$fieldName];
344
 
345
- echo '<label><input type="radio" id="' . $fieldName . '_0" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="0" ' . (! $options[$fieldName] ? "checked" : "") . ' /> No</label>';
346
  echo "&nbsp;&nbsp;";
347
  echo '<label><input type="radio" id="' . $fieldName . '_1" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="1" ' . ($options[$fieldName] ? "checked" : "") . ' /> Yes</label>';
348
  echo '<p class="description">Do you want EmbedPress to run within editors in frontend (if there\'s any)? Disabling this <strong>will not</strong> affect embeds seem by your regular users in frontend.</p>';
349
  }
350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  /**
352
  * Method that renders the enableEmbedResizeHeight input.
353
  *
354
  * @since 2.4.0
355
  * @static
356
  */
357
- public static function renderField_enableEmbedResizeHeight()
358
- {
359
  $fieldName = "enableEmbedResizeHeight";
360
 
361
- $options = get_option(self::$sectionGroupIdentifier);
362
 
363
- $value = ! isset($options[$fieldName]) ? '552' : $options[$fieldName];
364
 
365
- echo '<input type="number" value="'.absint($value).'" class="regular-text" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
366
 
367
- echo '<p class="description">Global Embed Iframe Height</p>';
368
  }
369
 
370
  /**
@@ -373,14 +386,13 @@ class Settings
373
  * @since 2.4.0
374
  * @static
375
  */
376
- public static function renderField_enableEmbedResizeWidth()
377
- {
378
  $fieldName = "enableEmbedResizeWidth";
379
- $options = get_option(self::$sectionGroupIdentifier);
380
- $value = ! isset($options[$fieldName]) ? '652' : $options[$fieldName];
381
 
382
- echo '<input type="number" value="'.absint($value).'" class="regular-text" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
383
- echo '<p class="description">Global Embed Iframe Width </p>';
384
  }
385
 
386
  /**
@@ -389,20 +401,19 @@ class Settings
389
  * @since 1.3.0
390
  * @static
391
  */
392
- public static function renderField_forceFacebookLanguage()
393
- {
394
  $fieldName = "fbLanguage";
395
 
396
- $options = get_option(self::$sectionGroupIdentifier);
397
 
398
- $options[$fieldName] = ! isset($options[$fieldName]) ? "" : $options[$fieldName];
399
 
400
  $facebookLocales = self::getFacebookAvailableLocales();
401
 
402
  echo '<select name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
403
  echo '<option value="0">Automatic (by Facebook)</option>';
404
  echo '<optgroup label="Available">';
405
- foreach ($facebookLocales as $locale => $localeName) {
406
  echo '<option value="' . $locale . '"' . ($options[$fieldName] === $locale ? ' selected' : '') . '>' . $localeName . '</option>';
407
  }
408
  echo '</optgroup>';
@@ -414,13 +425,12 @@ class Settings
414
  /**
415
  * Returns a list of locales that can be used on Facebook embeds.
416
  *
 
417
  * @since 1.3.0
418
  * @static
419
  *
420
- * @return array
421
  */
422
- public static function getFacebookAvailableLocales()
423
- {
424
  $locales = [
425
  'af_ZA' => "Afrikaans",
426
  'ak_GH' => "Akan",
4
 
5
  use EmbedPress\Compatibility;
6
 
7
+ (defined( 'ABSPATH' ) && defined( 'EMBEDPRESS_IS_LOADED' )) or die( "No direct script access allowed." );
8
 
9
  /**
10
  * Entity that handles the plugin's settings page.
16
  * @license GPLv2 or later
17
  * @since 1.0.0
18
  */
19
+ class Settings {
 
20
  /**
21
  * This class namespace.
22
  *
66
  *
67
  * @since 1.0.0
68
  */
69
+ public function __construct() {
 
70
  }
71
 
72
  /**
74
  *
75
  * @since 1.0.0
76
  */
77
+ public function __clone() {
 
78
  }
79
 
80
  /**
83
  * @since 1.0.0
84
  * @static
85
  */
86
+ public static function registerMenuItem() {
87
+ add_menu_page( 'EmbedPress Settings', 'EmbedPress', 'manage_options', 'embedpress',
88
+ [ self::$namespace, 'renderForm' ], null, 64 );
 
89
  }
90
 
91
  /**
94
  * @since 1.0.0
95
  * @static
96
  */
97
+ public static function registerActions() {
98
+ $activeTab = isset( $_GET['tab'] ) ? strtolower( $_GET['tab'] ) : "";
99
+ if ( $activeTab !== "embedpress" ) {
 
100
  $action = "embedpress:{$activeTab}:settings:register";
101
  } else {
102
  $activeTab = "";
103
  }
104
 
105
+ if ( !empty( $activeTab ) && has_action( $action ) ) {
106
+ do_action( $action, [
107
  'id' => self::$sectionAdminIdentifier,
108
  'slug' => self::$identifier,
109
+ ] );
110
  } else {
111
+ register_setting( self::$sectionGroupIdentifier, self::$sectionGroupIdentifier,
112
+ [ self::$namespace, "validateForm" ] );
113
 
114
+ add_settings_section( self::$sectionAdminIdentifier, '', null, self::$identifier );
115
 
116
  $fieldMap = [];
117
+ if ( !Compatibility::isWordPress5() || Compatibility::isClassicalEditorActive() ) {
118
  $fieldMap = [
119
+ 'enablePluginInAdmin' => [
120
  'label' => "Load previews in the admin editor",
121
  'section' => "admin",
122
  ],
123
+ 'enablePluginInFront' => [
124
  'label' => "Load previews in the frontend editor",
125
  'section' => "admin",
126
  ],
127
+ 'enableGlobalEmbedResize' => [
128
+ 'label' => "Enable Global Embed Dimension",
129
+ 'section' => "admin",
130
+ ],
131
+ 'enableEmbedResizeWidth' => [
132
  'label' => "Embed Iframe Width",
133
  'section' => "admin",
134
  ],
144
  'section' => "admin",
145
  ];
146
 
147
+ foreach ( $fieldMap as $fieldName => $field ) {
148
+ add_settings_field( $fieldName, $field['label'], [ self::$namespace, "renderField_{$fieldName}" ],
149
+ self::$identifier, self::${"section" . ucfirst( $field['section'] ) . "Identifier"} );
150
  }
151
  }
152
  }
154
  /**
155
  * Returns true if the plugin is active
156
  *
157
+ * @param string $plugin
158
  *
159
  * @return boolean
160
  */
161
+ protected static function is_plugin_active( $plugin ) {
162
+ return is_plugin_active( "{$plugin}/{$plugin}.php" );
 
163
  }
164
 
165
  /**
166
  * Returns true if the plugin is installed
167
  *
168
+ * @param string $plugin
169
  *
170
  * @return boolean
171
  */
172
+ protected static function is_plugin_installed( $plugin ) {
173
+ return file_exists( plugin_dir_path( EMBEDPRESS_ROOT ) . "{$plugin}/{$plugin}.php" );
 
174
  }
175
 
176
  /**
179
  * @since 1.0.0
180
  * @static
181
  */
182
+ public static function renderForm() {
 
183
  // Add the color picker css file
184
+ wp_enqueue_style( 'wp-color-picker' );
185
  // Include our custom jQuery file with WordPress Color Picker dependency
186
+ wp_enqueue_script( 'ep-settings', EMBEDPRESS_URL_ASSETS . 'js/settings.js', [ 'wp-color-picker' ],
187
+ EMBEDPRESS_VERSION, true );
188
 
189
+ $activeTab = isset( $_GET['tab'] ) ? strtolower( $_GET['tab'] ) : "";
190
+ $settingsFieldsIdentifier = !empty( $activeTab ) ? "embedpress:{$activeTab}" : self::$sectionGroupIdentifier;
191
+ $settingsSectionsIdentifier = !empty( $activeTab ) ? "embedpress:{$activeTab}" : self::$identifier;
192
  ?>
193
  <div id="embedpress-settings-wrapper">
194
  <header>
204
  <div>
205
  <h2 class="nav-tab-wrapper">
206
  <a href="?page=embedpress"
207
+ class="nav-tab<?php echo $activeTab === 'embedpress' || empty( $activeTab ) ? ' nav-tab-active' : ''; ?> ">
208
  General settings
209
  </a>
210
+ <?php do_action( 'embedpress:settings:render:tab', $activeTab ); ?>
211
+ <?php do_action( 'embedpress_license_tab', $activeTab ); ?>
212
 
213
  </h2>
214
 
215
+ <?php if ( $activeTab !== 'addons' ) : ?>
216
  <form action="options.php" method="POST" style="padding-bottom: 20px;">
217
+ <?php settings_fields( $settingsFieldsIdentifier ); ?>
218
+ <?php do_settings_sections( $settingsSectionsIdentifier ); ?>
219
+ <?php if ( $activeTab !== 'embedpress_license' ) : ?>
220
+ <button type="submit" class="button button-primary embedpress-setting-save">Save changes
221
+ </button>
222
  <?php endif; ?>
223
  </form>
224
  <?php endif; ?>
225
+ <?php if ( $activeTab == 'embedpress_license' ) : ?>
226
+ <?php echo do_action( 'embedpress_license' ); ?>
227
  <?php endif; ?>
228
  </div>
229
 
285
  /**
286
  * Method that validates the form data.
287
  *
288
+ * @param mixed $freshData Data received from the form.
289
+ *
290
+ * @return array
291
  * @since 1.0.0
292
  * @static
293
  *
 
 
 
294
  */
295
+ public static function validateForm( $freshData ) {
 
296
  $data = [
297
+ 'enablePluginInAdmin' => isset( $freshData['enablePluginInAdmin'] ) ? (bool)$freshData['enablePluginInAdmin'] : true,
298
+ 'enablePluginInFront' => isset( $freshData['enablePluginInFront'] ) ? (bool)$freshData['enablePluginInFront'] : true,
299
+ 'enableGlobalEmbedResize' => isset( $freshData['enableGlobalEmbedResize'] ) ? (bool)$freshData['enableGlobalEmbedResize'] : false,
300
+ 'enableEmbedResizeHeight' => isset( $freshData['enableEmbedResizeHeight'] ) ? $freshData['enableEmbedResizeHeight'] : 552,
301
+ 'enableEmbedResizeWidth' => isset( $freshData['enableEmbedResizeWidth'] ) ? $freshData['enableEmbedResizeWidth'] : 652,
302
+ 'fbLanguage' => $freshData['fbLanguage'],
303
  ];
304
 
305
  return $data;
311
  * @since 1.0.0
312
  * @static
313
  */
314
+ public static function renderField_enablePluginInAdmin() {
 
315
  $fieldName = "enablePluginInAdmin";
316
 
317
+ $options = get_option( self::$sectionGroupIdentifier );
318
 
319
+ $options[$fieldName] = !isset( $options[$fieldName] ) ? true : (bool)$options[$fieldName];
320
 
321
+ echo '<label><input type="radio" id="' . $fieldName . '_0" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="0" ' . (!$options[$fieldName] ? "checked" : "") . ' /> No</label>';
322
  echo "&nbsp;&nbsp;";
323
  echo '<label><input type="radio" id="' . $fieldName . '_1" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="1" ' . ($options[$fieldName] ? "checked" : "") . ' /> Yes</label>';
324
  echo '<p class="description">Do you want EmbedPress to run here in the admin area? Disabling this <strong>will not</strong> affect your frontend embeds.</p>';
330
  * @since 1.6.0
331
  * @static
332
  */
333
+ public static function renderField_enablePluginInFront() {
 
334
  $fieldName = "enablePluginInFront";
335
 
336
+ $options = get_option( self::$sectionGroupIdentifier );
337
 
338
+ $options[$fieldName] = !isset( $options[$fieldName] ) ? true : (bool)$options[$fieldName];
339
 
340
+ echo '<label><input type="radio" id="' . $fieldName . '_0" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="0" ' . (!$options[$fieldName] ? "checked" : "") . ' /> No</label>';
341
  echo "&nbsp;&nbsp;";
342
  echo '<label><input type="radio" id="' . $fieldName . '_1" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="1" ' . ($options[$fieldName] ? "checked" : "") . ' /> Yes</label>';
343
  echo '<p class="description">Do you want EmbedPress to run within editors in frontend (if there\'s any)? Disabling this <strong>will not</strong> affect embeds seem by your regular users in frontend.</p>';
344
  }
345
 
346
+ /**
347
+ * Method that renders the enablePluginInAdmin input.
348
+ *
349
+ * @since 2.4.1
350
+ * @static
351
+ */
352
+ public static function renderField_enableGlobalEmbedResize() {
353
+ $fieldName = "enableGlobalEmbedResize";
354
+
355
+ $options = get_option( self::$sectionGroupIdentifier );
356
+
357
+ $options[$fieldName] = !isset( $options[$fieldName] ) ? false : (bool)$options[$fieldName];
358
+
359
+ echo '<label><input class="enableglobalembedresize" type="radio" id="' . $fieldName . '_0" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="0" ' . (!$options[$fieldName] ? "checked" : "") . ' /> No</label>';
360
+ echo "&nbsp;&nbsp;";
361
+ echo '<label><input class="enableglobalembedresize" type="radio" id="' . $fieldName . '_1" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']" value="1" ' . ($options[$fieldName] ? "checked" : "") . ' /> Yes</label>';
362
+ echo '<p class="description">Do you want use global embed dimension, Disabling this <strong>will not</strong> affect embeds.</p>';
363
+ }
364
+
365
  /**
366
  * Method that renders the enableEmbedResizeHeight input.
367
  *
368
  * @since 2.4.0
369
  * @static
370
  */
371
+ public static function renderField_enableEmbedResizeHeight() {
 
372
  $fieldName = "enableEmbedResizeHeight";
373
 
374
+ $options = get_option( self::$sectionGroupIdentifier );
375
 
376
+ $value = !isset( $options[$fieldName] ) ? '552' : $options[$fieldName];
377
 
378
+ echo '<span class="embedpress-allow-globla-dimension"><input type="number" value="' . absint( $value ) . '" class="regular-text" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
379
 
380
+ echo '<p class="description">Global Embed Iframe Height</p></span>';
381
  }
382
 
383
  /**
386
  * @since 2.4.0
387
  * @static
388
  */
389
+ public static function renderField_enableEmbedResizeWidth() {
 
390
  $fieldName = "enableEmbedResizeWidth";
391
+ $options = get_option( self::$sectionGroupIdentifier );
392
+ $value = !isset( $options[$fieldName] ) ? '652' : $options[$fieldName];
393
 
394
+ echo '<span class="embedpress-allow-globla-dimension"><input type="number" value="' . absint( $value ) . '" class="regular-text" name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
395
+ echo '<p class="description">Global Embed Iframe Width </p></span>';
396
  }
397
 
398
  /**
401
  * @since 1.3.0
402
  * @static
403
  */
404
+ public static function renderField_forceFacebookLanguage() {
 
405
  $fieldName = "fbLanguage";
406
 
407
+ $options = get_option( self::$sectionGroupIdentifier );
408
 
409
+ $options[$fieldName] = !isset( $options[$fieldName] ) ? "" : $options[$fieldName];
410
 
411
  $facebookLocales = self::getFacebookAvailableLocales();
412
 
413
  echo '<select name="' . self::$sectionGroupIdentifier . '[' . $fieldName . ']">';
414
  echo '<option value="0">Automatic (by Facebook)</option>';
415
  echo '<optgroup label="Available">';
416
+ foreach ( $facebookLocales as $locale => $localeName ) {
417
  echo '<option value="' . $locale . '"' . ($options[$fieldName] === $locale ? ' selected' : '') . '>' . $localeName . '</option>';
418
  }
419
  echo '</optgroup>';
425
  /**
426
  * Returns a list of locales that can be used on Facebook embeds.
427
  *
428
+ * @return array
429
  * @since 1.3.0
430
  * @static
431
  *
 
432
  */
433
+ public static function getFacebookAvailableLocales() {
 
434
  $locales = [
435
  'af_ZA' => "Afrikaans",
436
  'ak_GH' => "Akan",
EmbedPress/Shortcode.php CHANGED
@@ -5,7 +5,7 @@ namespace EmbedPress;
5
  use Embera\Embera;
6
  use Embera\Formatter;
7
 
8
- (defined('ABSPATH') && defined('EMBEDPRESS_IS_LOADED')) or die("No direct script access allowed.");
9
 
10
  /**
11
  * Entity responsible to handle the plugin's shortcode events and behaviors.
@@ -16,8 +16,7 @@ use Embera\Formatter;
16
  * @license GPLv2 or later
17
  * @since 1.0.0
18
  */
19
- class Shortcode
20
- {
21
  /**
22
  * The WP_oEmbed class instance.
23
  *
@@ -32,68 +31,69 @@ class Shortcode
32
  /**
33
  * Register the plugin's shortcode into WordPress.
34
  *
 
35
  * @since 1.0.0
36
  * @static
37
  *
38
- * @return void
39
  */
40
- public static function register()
41
- {
42
  // Register the new shortcode for embeds.
43
- add_shortcode(EMBEDPRESS_SHORTCODE, ['\\EmbedPress\\Shortcode', 'do_shortcode']);
44
- add_shortcode('embed_oembed_html', ['\\EmbedPress\\Shortcode', 'do_shortcode']);
45
  }
46
 
47
  /**
48
  * Method that converts the plugin shortcoded-string into its complex content.
49
  *
 
 
 
 
50
  * @since 1.0.0
51
  * @static
52
  *
53
- * @param array $attributes Array of attributes
54
- * @param string $subject The given string
55
- *
56
- * @return string
57
  */
58
 
59
- public static function do_shortcode($attributes = [], $subject = null)
60
- {
61
  $plgSettings = Core::getSettings();
62
- $attributes = wp_parse_args($attributes,[
63
- 'width' => $plgSettings->enableEmbedResizeWidth,
64
- 'height' => $plgSettings->enableEmbedResizeHeight
65
- ]);
66
- $embed = self::parseContent($subject, true, $attributes);
 
 
 
 
67
 
68
- return is_object($embed) ? $embed->embed : $embed;
69
  }
70
 
71
  /**
72
  * Replace a given content with its embeded HTML code.
73
  *
 
 
 
 
74
  * @since 1.0.0
75
  * @static
76
  *
77
- * @param string The raw content that will be replaced.
78
- * @param boolean Optional. If true, new lines at the end of the embeded code are stripped.
79
- *
80
- * @return string
81
  */
82
- public static function parseContent($subject, $stripNewLine = false, $customAttributes = [])
83
- {
84
- if ( ! empty($subject)) {
85
- if (empty($customAttributes)) {
86
- $customAttributes = self::parseContentAttributesFromString($subject);
87
  }
88
 
89
- $content = preg_replace('/(\[' . EMBEDPRESS_SHORTCODE . '(?:\]|.+?\])|\[\/' . EMBEDPRESS_SHORTCODE . '\])/i',
90
- "", $subject);
91
 
92
  // Converts any special HTML entities back to characters.
93
- $content = htmlspecialchars_decode($content);
94
 
95
  // Check if the WP_oEmbed class is loaded
96
- if ( ! self::$oEmbedInstance) {
97
  require_once ABSPATH . 'wp-includes/class-wp-oembed.php';
98
 
99
  self::$oEmbedInstance = _wp_oembed_get_object();
@@ -103,205 +103,205 @@ class Shortcode
103
  'params' => [],
104
  ];
105
 
106
- $content_uid = md5($content);
107
 
108
- $attributes = self::parseContentAttributes($customAttributes, $content_uid);
109
- if (isset($attributes['width']) || isset($attributes['height'])) {
110
- if (isset($attributes['width'])) {
111
  $emberaInstanceSettings['params']['width'] = $attributes['width'];
112
- unset($attributes['width']);
113
  }
114
 
115
- if (isset($attributes['height'])) {
116
  $emberaInstanceSettings['params']['height'] = $attributes['height'];
117
- unset($attributes['height']);
118
  }
119
  }
120
 
121
  // Identify what service provider the shortcode's link belongs to
122
- $serviceProvider = self::$oEmbedInstance->get_provider($content);
123
 
124
 
125
  // Check if OEmbed was unable to detect the url service provider.
126
- if (empty($serviceProvider)) {
127
  // Attempt to do the same using Embera.
128
- $emberaInstance = new Embera($emberaInstanceSettings);
129
  // Add support to the user's custom service providers
130
  $additionalServiceProviders = Core::getAdditionalServiceProviders();
131
- if ( ! empty($additionalServiceProviders)) {
132
- foreach ($additionalServiceProviders as $serviceProviderClassName => $serviceProviderUrls) {
133
- self::addServiceProvider($serviceProviderClassName, $serviceProviderUrls, $emberaInstance);
134
  }
135
 
136
- unset($serviceProviderUrls, $serviceProviderClassName);
137
  }
138
 
139
  // Attempt to fetch more info about the url-embed.
140
- $urlData = $emberaInstance->getUrlInfo($content);
141
  } else {
142
  // Attempt to fetch more info about the url-embed.
143
- $urlData = self::$oEmbedInstance->fetch($serviceProvider, $content, $attributes);
144
  }
145
 
146
  // Sanitize the data
147
- $urlData = self::sanitizeUrlData($urlData);
148
 
149
  // Stores the original content
150
- if (is_object($urlData)) {
151
  $urlData->originalContent = $content;
152
  }
153
 
154
- $eventResults = apply_filters('embedpress:onBeforeEmbed', $urlData);
155
- if (empty($eventResults)) {
156
  // EmbedPress seems unable to embed the url.
157
  return $subject;
158
  }
159
 
160
  // Transform all shortcode attributes into html form. I.e.: {foo: "joe"} -> foo="joe"
161
  $attributesHtml = [];
162
- foreach ($attributes as $attrName => $attrValue) {
163
  $attributesHtml[] = $attrName . '="' . $attrValue . '"';
164
  }
165
 
166
  // Define the EmbedPress html template where the generated embed will be injected in
167
- $embedTemplate = '<div ' . implode(' ', $attributesHtml) . '>{html}</div>';
168
 
169
  // Check if $content is a google shortened url and tries to extract from it which Google service it refers to.
170
- if (preg_match('/http[s]?:\/\/goo\.gl\/(?:([a-z]+)\/)?[a-z0-9]+\/?$/i', $content, $matches)) {
171
  // Fetch all headers from the short-url so we can know how to handle its original content depending on the service.
172
- $headers = get_headers($content);
173
 
174
  $supportedServicesHeadersPatterns = [
175
  'maps' => '/^Location:\s+(http[s]?:\/\/.+)$/i',
176
  ];
177
 
178
- $service = isset($matches[1]) ? strtolower($matches[1]) : null;
179
  // No specific service was found in the url.
180
- if (empty($service)) {
181
  // Let's try to guess which service the original url belongs to.
182
- foreach ($headers as $header) {
183
  // Check if the short-url reffers to a Google Maps url.
184
- if (preg_match($supportedServicesHeadersPatterns['maps'], $header, $matches)) {
185
  // Replace the shortened url with its original url.
186
  $content = $matches[1];
187
  break;
188
  }
189
  }
190
- unset($header);
191
  } else {
192
  // Check if the Google service is supported atm.
193
- if (isset($supportedServicesHeadersPatterns[$service])) {
194
  // Tries to extract the url based on its headers.
195
- $originalUrl = self::extractContentFromHeaderAsArray($supportedServicesHeadersPatterns[$service],
196
- $headers);
197
  // Replace the shortened url with its original url if the specific header was found.
198
- if ( ! empty($originalUrl)) {
199
  $content = $originalUrl;
200
  }
201
- unset($originalUrl);
202
  }
203
  }
204
- unset($service, $supportedServicesHeadersPatterns, $headers, $matches);
205
  }
206
 
207
  // Facebook is a special case. WordPress will try to embed them using OEmbed, but they always end up embedding the profile page, regardless
208
  // if the url was pointing to a photo, a post, etc. So, since Embera can embed only facebook-media/posts, we'll use it only for that.
209
- if (isset($urlData->provider_name) && in_array($urlData->provider_name, ['Facebook'])) {
210
  // Check if this is a Facebook profile url.
211
- if (preg_match('/facebook\.com\/(?:[^\/]+?)\/?$/', $content, $match)) {
212
  // Try to embed the url using WP's OSEmbed.
213
- $parsedContent = self::$oEmbedInstance->get_html($content, $attributes);
214
  } else {
215
  // Try to embed the url using EmbedPress' Embera.
216
  $parsedContent = false;
217
  }
218
  } else {
219
  // Try to embed the url using WP's OSEmbed.
220
- $parsedContent = self::$oEmbedInstance->get_html($content, $attributes);
221
  }
222
 
223
- if ( ! $parsedContent) {
224
- if ( ! isset($emberaInstance)) {
225
  // If the embed couldn't be generated, we'll try to use Embera's API
226
- $emberaInstance = new Embera($emberaInstanceSettings);
227
  // Add support to the user's custom service providers
228
  $additionalServiceProviders = Core::getAdditionalServiceProviders();
229
- if ( ! empty($additionalServiceProviders)) {
230
- foreach ($additionalServiceProviders as $serviceProviderClassName => $serviceProviderUrls) {
231
- self::addServiceProvider($serviceProviderClassName, $serviceProviderUrls, $emberaInstance);
232
  }
233
 
234
- unset($serviceProviderUrls, $serviceProviderClassName);
235
  }
236
  }
237
 
238
  // Register the html template
239
- $emberaFormaterInstance = new Formatter($emberaInstance, true);
240
- $emberaFormaterInstance->setTemplate($embedTemplate);
241
 
242
  // Try to generate the embed using Embera API
243
- $parsedContent = $emberaFormaterInstance->transform($content);
244
 
245
- unset($emberaFormaterInstance, $additionalServiceProviders, $emberaInstance);
246
  } else {
247
  // Inject the generated code inside the html template
248
- $parsedContent = str_replace('{html}', $parsedContent, $embedTemplate);
249
 
250
  // Replace all single quotes to double quotes. I.e: foo='joe' -> foo="joe"
251
- $parsedContent = str_replace("'", '"', $parsedContent);
252
 
253
  // Replace the flag `{provider_alias}` which is used by Embera with the "ose-<serviceProviderAlias>". I.e: YouTube -> "ose-youtube"
254
- $parsedContent = preg_replace('/((?:ose-)?\{provider_alias\})/i',
255
- "ose-" . strtolower($urlData->provider_name), $parsedContent);
256
  }
257
 
258
- if (isset($urlData->provider_name) || (is_array($urlData) && isset($urlData[$content]['provider_name']))) {
259
  // NFB seems to always return their embed code with all HTML entities into their applicable characters string.
260
- if ((isset($urlData->provider_name) && strtoupper($urlData->provider_name) === "NATIONAL FILM BOARD OF CANADA") || (is_array($urlData) && isset($urlData[$content]['provider_name']) && strtoupper($urlData[$content]['provider_name']) === "NATIONAL FILM BOARD OF CANADA")) {
261
- $parsedContent = html_entity_decode($parsedContent);
262
- } elseif ((isset($urlData->provider_name) && strtoupper($urlData->provider_name) === "FACEBOOK") || (is_array($urlData) && isset($urlData[$content]['provider_name']) && strtoupper($urlData[$content]['provider_name']) === "FACEBOOK")) {
263
  $plgSettings = Core::getSettings();
264
 
265
  // Check if the user wants to force a certain language into Facebook embeds.
266
- $locale = isset($plgSettings->fbLanguage) && ! empty($plgSettings->fbLanguage) ? $plgSettings->fbLanguage : false;
267
- if ( ! ! $locale) {
268
  // Replace the automatically detected language by Facebook's API with the language chosen by the user.
269
- $parsedContent = preg_replace('/\/[a-z]{2}\_[a-z]{2}\/sdk\.js/i', "/{$locale}/sdk.js",
270
- $parsedContent);
271
  }
272
 
273
  // Make sure `adapt_container_width` parameter is set to false. Setting to true, as it is by default, might cause Facebook to render embeds inside editors (in admin) with only 180px wide.
274
- if (is_admin()) {
275
- $parsedContent = preg_replace('~data\-adapt\-container\-width=\"(?:true|1)\"~i',
276
- 'data-adapt-container-width="0"', $parsedContent);
277
  }
278
 
279
- unset($locale, $plgSettings);
280
  }
281
  }
282
 
283
- unset($embedTemplate, $serviceProvider);
284
 
285
  // This assure that the iframe has the same dimensions the user wants to
286
- if (isset($emberaInstanceSettings['params']['width']) || isset($emberaInstanceSettings['params']['height'])) {
287
- if (isset($emberaInstanceSettings['params']['width']) && isset($emberaInstanceSettings['params']['height'])) {
288
  $customWidth = (int)$emberaInstanceSettings['params']['width'];
289
  $customHeight = (int)$emberaInstanceSettings['params']['height'];
290
  } else {
291
- if (preg_match('~width="(\d+)"|width\s+:\s+(\d+)~i', $parsedContent, $matches)) {
292
  $iframeWidth = (int)$matches[1];
293
  }
294
 
295
- if (preg_match('~height="(\d+)"|height\s+:\s+(\d+)~i', $parsedContent, $matches)) {
296
  $iframeHeight = (int)$matches[1];
297
  }
298
 
299
- if (isset($iframeWidth) && isset($iframeHeight) && $iframeWidth > 0 && $iframeHeight > 0) {
300
- $iframeRatio = ceil($iframeWidth / $iframeHeight);
301
 
302
- if (isset($emberaInstanceSettings['params']['width'])) {
303
  $customWidth = (int)$emberaInstanceSettings['params']['width'];
304
- $customHeight = ceil($customWidth / $iframeRatio);
305
  } else {
306
  $customHeight = (int)$emberaInstanceSettings['params']['height'];
307
  $customWidth = $iframeRatio * $customHeight;
@@ -309,41 +309,41 @@ class Shortcode
309
  }
310
  }
311
 
312
- if (isset($customWidth) && isset($customHeight)) {
313
- if (preg_match('~width="(\d+)"~i', $parsedContent)) {
314
- $parsedContent = preg_replace('~width="(\d+)"~i', 'width="' . $customWidth . '"',
315
- $parsedContent);
316
  }
317
 
318
- if (preg_match('~height="(\d+)"~i', $parsedContent)) {
319
- $parsedContent = preg_replace('~height="(\d+)"~i', 'height="' . $customHeight . '"',
320
- $parsedContent);
321
  }
322
 
323
- if (preg_match('~width\s+:\s+(\d+)~i', $parsedContent)) {
324
- $parsedContent = preg_replace('~width\s+:\s+(\d+)~i', 'width: ' . $customWidth, $parsedContent);
325
  }
326
 
327
- if (preg_match('~height\s+:\s+(\d+)~i', $parsedContent)) {
328
- $parsedContent = preg_replace('~height\s+:\s+(\d+)~i', 'height: ' . $customHeight,
329
- $parsedContent);
330
  }
331
  }
332
  }
333
 
334
- if ($stripNewLine) {
335
- $parsedContent = preg_replace('/\n/', '', $parsedContent);
336
  }
337
 
338
- $parsedContent = apply_filters('pp_embed_parsed_content', $parsedContent, $urlData, $attributes);
339
 
340
- if ( ! empty($parsedContent)) {
341
- $embed = (object)array_merge((array)$urlData, [
342
  'attributes' => (object)$attributes,
343
  'embed' => $parsedContent,
344
  'url' => $content,
345
- ]);
346
- $embed = apply_filters('embedpress:onAfterEmbed', $embed);
347
  return $embed;
348
  }
349
  }
@@ -354,26 +354,25 @@ class Shortcode
354
  /**
355
  * Method that adds support to a given new service provider (SP).
356
  *
 
 
 
 
 
357
  * @since 1.0.0
358
  * @static
359
  *
360
- * @param string $className The new SP class name.
361
- * @param string $reference The new SP reference name.
362
- * @param \Embera\Embera $emberaInstance The embera's instance where the SP will be registered in.
363
- *
364
- * @return boolean
365
  */
366
- public static function addServiceProvider($className, $reference, &$emberaInstance)
367
- {
368
- if (empty($className) || empty($reference)) {
369
  return false;
370
  }
371
 
372
- if (is_string($reference)) {
373
- $emberaInstance->addProvider($reference, EMBEDPRESS_NAMESPACE . "\\Providers\\{$className}");
374
- } elseif (is_array($reference)) {
375
- foreach ($reference as $serviceProviderUrl) {
376
- self::addServiceProvider($className, $serviceProviderUrl, $emberaInstance);
377
  }
378
  } else {
379
  return false;
@@ -383,22 +382,21 @@ class Shortcode
383
  /**
384
  * Method that retrieves all custom parameters from a shortcoded string.
385
  *
 
 
 
386
  * @since 1.0.0
387
  * @static
388
  *
389
- * @param string $subject The given shortcoded string.
390
- *
391
- * @return array
392
  */
393
- public static function parseContentAttributesFromString($subject)
394
- {
395
  $customAttributes = [];
396
- if (preg_match('/\[embed\s*(.*?)\]/i', stripslashes($subject), $m)) {
397
- if (preg_match_all('/(\!?\w+-?\w*)(?:="(.+?)")?/i', stripslashes($m[1]), $matches)) {
398
  $attributes = $matches[1];
399
  $attrValues = $matches[2];
400
 
401
- foreach ($attributes as $attrIndex => $attrName) {
402
  $customAttributes[$attrName] = $attrValues[$attrIndex];
403
  }
404
  }
@@ -410,62 +408,61 @@ class Shortcode
410
  /**
411
  * Method that parses and adds the "data-" prefix to the given custom shortcode attributes.
412
  *
 
 
 
 
413
  * @since 1.0.0
414
  * @access private
415
  * @static
416
  *
417
- * @param array $customAttributes The array containing the embed attributes.
418
- * @param string $content_uid An optional string specifying a unique ID for the embed
419
- *
420
- * @return array
421
  */
422
- private static function parseContentAttributes(array $customAttributes, $content_uid = null)
423
- {
424
  $attributes = [
425
- 'class' => ["embedpress-wrapper"],
426
  ];
427
 
428
  $embedShouldBeResponsive = true;
429
  $embedShouldHaveCustomDimensions = false;
430
- if ( ! empty($customAttributes)) {
431
- if (isset($customAttributes['class'])) {
432
- if ( ! empty($customAttributes['class'])) {
433
- $customAttributes['class'] = explode(' ', $customAttributes['class']);
434
 
435
- $attributes['class'] = array_merge($attributes['class'], $customAttributes['class']);
436
  }
437
 
438
- unset($customAttributes['class']);
439
  }
440
 
441
- if (isset($customAttributes['width'])) {
442
- if ( ! empty($customAttributes['width'])) {
443
  $attributes['width'] = (int)$customAttributes['width'];
444
  $embedShouldHaveCustomDimensions = true;
445
  }
446
  }
447
 
448
- if (isset($customAttributes['height'])) {
449
- if ( ! empty($customAttributes['height'])) {
450
  $attributes['height'] = (int)$customAttributes['height'];
451
  $embedShouldHaveCustomDimensions = true;
452
  }
453
  }
454
 
455
- if ( ! empty($customAttributes)) {
456
  $attrNameDefaultPrefix = "data-";
457
- foreach ($customAttributes as $attrName => $attrValue) {
458
- if (is_numeric($attrName)) {
459
  $attrName = $attrValue;
460
  $attrValue = "";
461
  }
462
 
463
- $attrName = str_replace($attrNameDefaultPrefix, "", $attrName);
464
 
465
- if ( ! strlen($attrValue)) {
466
- if ($attrName[0] === "!") {
467
  $attrValue = "false";
468
- $attrName = substr($attrName, 1);
469
  } else {
470
  $attrValue = "true";
471
  }
@@ -476,35 +473,35 @@ class Shortcode
476
  }
477
 
478
  // Check if there's any "responsive" parameter
479
- $responsiveAttributes = ["responsive", "data-responsive"];
480
- foreach ($responsiveAttributes as $responsiveAttr) {
481
- if (isset($attributes[$responsiveAttr])) {
482
- if ( ! strlen($attributes[$responsiveAttr])) { // If the parameter is passed but have no value, it will be true by default
483
  $embedShouldBeResponsive = true;
484
  } else {
485
- $embedShouldBeResponsive = ! self::valueIsFalse($attributes[$responsiveAttr]);
486
  }
487
 
488
  break;
489
  }
490
  }
491
- unset($responsiveAttr, $responsiveAttributes);
492
  }
493
 
494
  $attributes['class'][] = 'ose-{provider_alias}';
495
 
496
- if ( ! empty($content_uid)) {
497
  $attributes['class'][] = 'ose-uid-' . $content_uid;
498
  }
499
 
500
- if ($embedShouldBeResponsive && ! $embedShouldHaveCustomDimensions) {
501
  $attributes['class'][] = 'responsive';
502
  } else {
503
  $attributes['data-responsive'] = "false";
504
  }
505
 
506
- $attributes['class'] = implode(' ', array_unique(array_filter($attributes['class'])));
507
- if(isset($attributes['width'])){
508
  $attributes['style'] = "width:{$attributes['width'] }px;height:{$attributes['height'] }px;";
509
  }
510
 
@@ -514,17 +511,16 @@ class Shortcode
514
  /**
515
  * Method that checks if a given value is/can be identified as (bool)false.
516
  *
 
 
 
517
  * @since 1.0.0
518
  * @static
519
  *
520
- * @param mixed $subject The value to be checked.
521
- *
522
- * @return boolean
523
  */
524
- public static function valueIsFalse($subject)
525
- {
526
- $subject = strtolower(trim((string)$subject));
527
- switch ($subject) {
528
  case "0":
529
  case "false":
530
  case "off":
@@ -542,21 +538,20 @@ class Shortcode
542
  * Return the value from a header which is in an array resulted from a get_headers() call.
543
  * If the header cannot be found, this method will return null instead.
544
  *
 
 
 
 
545
  * @since 1.1.0
546
  * @access private
547
  * @static
548
  *
549
- * @param string $headerPattern Regex pattern the header and its value must match.
550
- * @param array $headersList A list of headers resulted from a get_headers() call.
551
- *
552
- * @return mixed
553
  */
554
- private static function extractContentFromHeaderAsArray($headerPattern, $headersList)
555
- {
556
  $headerValue = null;
557
 
558
- foreach ($headersList as $header) {
559
- if (preg_match($headerPattern, $header, $matches)) {
560
  $headerValue = $matches[1];
561
  break;
562
  }
@@ -570,33 +565,32 @@ class Shortcode
570
  * attributes from "dash" separated to "underline" separated to be able to access
571
  * those attributes from the object, without having to convert it to an array.
572
  *
 
 
 
573
  * @since 1.6.1
574
  * @access private
575
  * @static
576
  *
577
- * @param object $data
578
- *
579
- * @return object
580
  */
581
- private static function sanitizeUrlData($data)
582
- {
583
- if (is_object($data)) {
584
- $attributes = get_object_vars($data);
585
 
586
- foreach ($attributes as $key => $value) {
587
- if (substr_count($key, '-')) {
588
- unset($data->$key);
589
 
590
- $key = str_replace('-', '_', $key);
591
  $data->$key = $value;
592
  }
593
  }
594
- } elseif (is_array($data)) {
595
- foreach ($data as $key => $value) {
596
- if (substr_count($key, '-')) {
597
- unset($data[$key]);
598
 
599
- $key = str_replace('-', '_', $key);
600
  $data[$key] = $value;
601
  }
602
  }
5
  use Embera\Embera;
6
  use Embera\Formatter;
7
 
8
+ (defined( 'ABSPATH' ) && defined( 'EMBEDPRESS_IS_LOADED' )) or die( "No direct script access allowed." );
9
 
10
  /**
11
  * Entity responsible to handle the plugin's shortcode events and behaviors.
16
  * @license GPLv2 or later
17
  * @since 1.0.0
18
  */
19
+ class Shortcode {
 
20
  /**
21
  * The WP_oEmbed class instance.
22
  *
31
  /**
32
  * Register the plugin's shortcode into WordPress.
33
  *
34
+ * @return void
35
  * @since 1.0.0
36
  * @static
37
  *
 
38
  */
39
+ public static function register() {
 
40
  // Register the new shortcode for embeds.
41
+ add_shortcode( EMBEDPRESS_SHORTCODE, [ '\\EmbedPress\\Shortcode', 'do_shortcode' ] );
42
+ add_shortcode( 'embed_oembed_html', [ '\\EmbedPress\\Shortcode', 'do_shortcode' ] );
43
  }
44
 
45
  /**
46
  * Method that converts the plugin shortcoded-string into its complex content.
47
  *
48
+ * @param array $attributes Array of attributes
49
+ * @param string $subject The given string
50
+ *
51
+ * @return string
52
  * @since 1.0.0
53
  * @static
54
  *
 
 
 
 
55
  */
56
 
57
+ public static function do_shortcode( $attributes = [], $subject = null ) {
 
58
  $plgSettings = Core::getSettings();
59
+ $default = [];
60
+ if ( $plgSettings->enableGlobalEmbedResize ) {
61
+ $default = [
62
+ 'width' => $plgSettings->enableEmbedResizeWidth,
63
+ 'height' => $plgSettings->enableEmbedResizeHeight
64
+ ];
65
+ }
66
+ $attributes = wp_parse_args( $attributes, $default );
67
+ $embed = self::parseContent( $subject, true, $attributes );
68
 
69
+ return is_object( $embed ) ? $embed->embed : $embed;
70
  }
71
 
72
  /**
73
  * Replace a given content with its embeded HTML code.
74
  *
75
+ * @param string The raw content that will be replaced.
76
+ * @param boolean Optional. If true, new lines at the end of the embeded code are stripped.
77
+ *
78
+ * @return string
79
  * @since 1.0.0
80
  * @static
81
  *
 
 
 
 
82
  */
83
+ public static function parseContent( $subject, $stripNewLine = false, $customAttributes = [] ) {
84
+ if ( !empty( $subject ) ) {
85
+ if ( empty( $customAttributes ) ) {
86
+ $customAttributes = self::parseContentAttributesFromString( $subject );
 
87
  }
88
 
89
+ $content = preg_replace( '/(\[' . EMBEDPRESS_SHORTCODE . '(?:\]|.+?\])|\[\/' . EMBEDPRESS_SHORTCODE . '\])/i',
90
+ "", $subject );
91
 
92
  // Converts any special HTML entities back to characters.
93
+ $content = htmlspecialchars_decode( $content );
94
 
95
  // Check if the WP_oEmbed class is loaded
96
+ if ( !self::$oEmbedInstance ) {
97
  require_once ABSPATH . 'wp-includes/class-wp-oembed.php';
98
 
99
  self::$oEmbedInstance = _wp_oembed_get_object();
103
  'params' => [],
104
  ];
105
 
106
+ $content_uid = md5( $content );
107
 
108
+ $attributes = self::parseContentAttributes( $customAttributes, $content_uid );
109
+ if ( isset( $attributes['width'] ) || isset( $attributes['height'] ) ) {
110
+ if ( isset( $attributes['width'] ) ) {
111
  $emberaInstanceSettings['params']['width'] = $attributes['width'];
112
+ unset( $attributes['width'] );
113
  }
114
 
115
+ if ( isset( $attributes['height'] ) ) {
116
  $emberaInstanceSettings['params']['height'] = $attributes['height'];
117
+ unset( $attributes['height'] );
118
  }
119
  }
120
 
121
  // Identify what service provider the shortcode's link belongs to
122
+ $serviceProvider = self::$oEmbedInstance->get_provider( $content );
123
 
124
 
125
  // Check if OEmbed was unable to detect the url service provider.
126
+ if ( empty( $serviceProvider ) ) {
127
  // Attempt to do the same using Embera.
128
+ $emberaInstance = new Embera( $emberaInstanceSettings );
129
  // Add support to the user's custom service providers
130
  $additionalServiceProviders = Core::getAdditionalServiceProviders();
131
+ if ( !empty( $additionalServiceProviders ) ) {
132
+ foreach ( $additionalServiceProviders as $serviceProviderClassName => $serviceProviderUrls ) {
133
+ self::addServiceProvider( $serviceProviderClassName, $serviceProviderUrls, $emberaInstance );
134
  }
135
 
136
+ unset( $serviceProviderUrls, $serviceProviderClassName );
137
  }
138
 
139
  // Attempt to fetch more info about the url-embed.
140
+ $urlData = $emberaInstance->getUrlInfo( $content );
141
  } else {
142
  // Attempt to fetch more info about the url-embed.
143
+ $urlData = self::$oEmbedInstance->fetch( $serviceProvider, $content, $attributes );
144
  }
145
 
146
  // Sanitize the data
147
+ $urlData = self::sanitizeUrlData( $urlData );
148
 
149
  // Stores the original content
150
+ if ( is_object( $urlData ) ) {
151
  $urlData->originalContent = $content;
152
  }
153
 
154
+ $eventResults = apply_filters( 'embedpress:onBeforeEmbed', $urlData );
155
+ if ( empty( $eventResults ) ) {
156
  // EmbedPress seems unable to embed the url.
157
  return $subject;
158
  }
159
 
160
  // Transform all shortcode attributes into html form. I.e.: {foo: "joe"} -> foo="joe"
161
  $attributesHtml = [];
162
+ foreach ( $attributes as $attrName => $attrValue ) {
163
  $attributesHtml[] = $attrName . '="' . $attrValue . '"';
164
  }
165
 
166
  // Define the EmbedPress html template where the generated embed will be injected in
167
+ $embedTemplate = '<div ' . implode( ' ', $attributesHtml ) . '>{html}</div>';
168
 
169
  // Check if $content is a google shortened url and tries to extract from it which Google service it refers to.
170
+ if ( preg_match( '/http[s]?:\/\/goo\.gl\/(?:([a-z]+)\/)?[a-z0-9]+\/?$/i', $content, $matches ) ) {
171
  // Fetch all headers from the short-url so we can know how to handle its original content depending on the service.
172
+ $headers = get_headers( $content );
173
 
174
  $supportedServicesHeadersPatterns = [
175
  'maps' => '/^Location:\s+(http[s]?:\/\/.+)$/i',
176
  ];
177
 
178
+ $service = isset( $matches[1] ) ? strtolower( $matches[1] ) : null;
179
  // No specific service was found in the url.
180
+ if ( empty( $service ) ) {
181
  // Let's try to guess which service the original url belongs to.
182
+ foreach ( $headers as $header ) {
183
  // Check if the short-url reffers to a Google Maps url.
184
+ if ( preg_match( $supportedServicesHeadersPatterns['maps'], $header, $matches ) ) {
185
  // Replace the shortened url with its original url.
186
  $content = $matches[1];
187
  break;
188
  }
189
  }
190
+ unset( $header );
191
  } else {
192
  // Check if the Google service is supported atm.
193
+ if ( isset( $supportedServicesHeadersPatterns[$service] ) ) {
194
  // Tries to extract the url based on its headers.
195
+ $originalUrl = self::extractContentFromHeaderAsArray( $supportedServicesHeadersPatterns[$service],
196
+ $headers );
197
  // Replace the shortened url with its original url if the specific header was found.
198
+ if ( !empty( $originalUrl ) ) {
199
  $content = $originalUrl;
200
  }
201
+ unset( $originalUrl );
202
  }
203
  }
204
+ unset( $service, $supportedServicesHeadersPatterns, $headers, $matches );
205
  }
206
 
207
  // Facebook is a special case. WordPress will try to embed them using OEmbed, but they always end up embedding the profile page, regardless
208
  // if the url was pointing to a photo, a post, etc. So, since Embera can embed only facebook-media/posts, we'll use it only for that.
209
+ if ( isset( $urlData->provider_name ) && in_array( $urlData->provider_name, [ 'Facebook' ] ) ) {
210
  // Check if this is a Facebook profile url.
211
+ if ( preg_match( '/facebook\.com\/(?:[^\/]+?)\/?$/', $content, $match ) ) {
212
  // Try to embed the url using WP's OSEmbed.
213
+ $parsedContent = self::$oEmbedInstance->get_html( $content, $attributes );
214
  } else {
215
  // Try to embed the url using EmbedPress' Embera.
216
  $parsedContent = false;
217
  }
218
  } else {
219
  // Try to embed the url using WP's OSEmbed.
220
+ $parsedContent = self::$oEmbedInstance->get_html( $content, $attributes );
221
  }
222
 
223
+ if ( !$parsedContent ) {
224
+ if ( !isset( $emberaInstance ) ) {
225
  // If the embed couldn't be generated, we'll try to use Embera's API
226
+ $emberaInstance = new Embera( $emberaInstanceSettings );
227
  // Add support to the user's custom service providers
228
  $additionalServiceProviders = Core::getAdditionalServiceProviders();
229
+ if ( !empty( $additionalServiceProviders ) ) {
230
+ foreach ( $additionalServiceProviders as $serviceProviderClassName => $serviceProviderUrls ) {
231
+ self::addServiceProvider( $serviceProviderClassName, $serviceProviderUrls, $emberaInstance );
232
  }
233
 
234
+ unset( $serviceProviderUrls, $serviceProviderClassName );
235
  }
236
  }
237
 
238
  // Register the html template
239
+ $emberaFormaterInstance = new Formatter( $emberaInstance, true );
240
+ $emberaFormaterInstance->setTemplate( $embedTemplate );
241
 
242
  // Try to generate the embed using Embera API
243
+ $parsedContent = $emberaFormaterInstance->transform( $content );
244
 
245
+ unset( $emberaFormaterInstance, $additionalServiceProviders, $emberaInstance );
246
  } else {
247
  // Inject the generated code inside the html template
248
+ $parsedContent = str_replace( '{html}', $parsedContent, $embedTemplate );
249
 
250
  // Replace all single quotes to double quotes. I.e: foo='joe' -> foo="joe"
251
+ $parsedContent = str_replace( "'", '"', $parsedContent );
252
 
253
  // Replace the flag `{provider_alias}` which is used by Embera with the "ose-<serviceProviderAlias>". I.e: YouTube -> "ose-youtube"
254
+ $parsedContent = preg_replace( '/((?:ose-)?\{provider_alias\})/i',
255
+ "ose-" . strtolower( $urlData->provider_name ), $parsedContent );
256
  }
257
 
258
+ if ( isset( $urlData->provider_name ) || (is_array( $urlData ) && isset( $urlData[$content]['provider_name'] )) ) {
259
  // NFB seems to always return their embed code with all HTML entities into their applicable characters string.
260
+ if ( (isset( $urlData->provider_name ) && strtoupper( $urlData->provider_name ) === "NATIONAL FILM BOARD OF CANADA") || (is_array( $urlData ) && isset( $urlData[$content]['provider_name'] ) && strtoupper( $urlData[$content]['provider_name'] ) === "NATIONAL FILM BOARD OF CANADA") ) {
261
+ $parsedContent = html_entity_decode( $parsedContent );
262
+ } elseif ( (isset( $urlData->provider_name ) && strtoupper( $urlData->provider_name ) === "FACEBOOK") || (is_array( $urlData ) && isset( $urlData[$content]['provider_name'] ) && strtoupper( $urlData[$content]['provider_name'] ) === "FACEBOOK") ) {
263
  $plgSettings = Core::getSettings();
264
 
265
  // Check if the user wants to force a certain language into Facebook embeds.
266
+ $locale = isset( $plgSettings->fbLanguage ) && !empty( $plgSettings->fbLanguage ) ? $plgSettings->fbLanguage : false;
267
+ if ( !!$locale ) {
268
  // Replace the automatically detected language by Facebook's API with the language chosen by the user.
269
+ $parsedContent = preg_replace( '/\/[a-z]{2}\_[a-z]{2}\/sdk\.js/i', "/{$locale}/sdk.js",
270
+ $parsedContent );
271
  }
272
 
273
  // Make sure `adapt_container_width` parameter is set to false. Setting to true, as it is by default, might cause Facebook to render embeds inside editors (in admin) with only 180px wide.
274
+ if ( is_admin() ) {
275
+ $parsedContent = preg_replace( '~data\-adapt\-container\-width=\"(?:true|1)\"~i',
276
+ 'data-adapt-container-width="0"', $parsedContent );
277
  }
278
 
279
+ unset( $locale, $plgSettings );
280
  }
281
  }
282
 
283
+ unset( $embedTemplate, $serviceProvider );
284
 
285
  // This assure that the iframe has the same dimensions the user wants to
286
+ if ( isset( $emberaInstanceSettings['params']['width'] ) || isset( $emberaInstanceSettings['params']['height'] ) ) {
287
+ if ( isset( $emberaInstanceSettings['params']['width'] ) && isset( $emberaInstanceSettings['params']['height'] ) ) {
288
  $customWidth = (int)$emberaInstanceSettings['params']['width'];
289
  $customHeight = (int)$emberaInstanceSettings['params']['height'];
290
  } else {
291
+ if ( preg_match( '~width="(\d+)"|width\s+:\s+(\d+)~i', $parsedContent, $matches ) ) {
292
  $iframeWidth = (int)$matches[1];
293
  }
294
 
295
+ if ( preg_match( '~height="(\d+)"|height\s+:\s+(\d+)~i', $parsedContent, $matches ) ) {
296
  $iframeHeight = (int)$matches[1];
297
  }
298
 
299
+ if ( isset( $iframeWidth ) && isset( $iframeHeight ) && $iframeWidth > 0 && $iframeHeight > 0 ) {
300
+ $iframeRatio = ceil( $iframeWidth / $iframeHeight );
301
 
302
+ if ( isset( $emberaInstanceSettings['params']['width'] ) ) {
303
  $customWidth = (int)$emberaInstanceSettings['params']['width'];
304
+ $customHeight = ceil( $customWidth / $iframeRatio );
305
  } else {
306
  $customHeight = (int)$emberaInstanceSettings['params']['height'];
307
  $customWidth = $iframeRatio * $customHeight;
309
  }
310
  }
311
 
312
+ if ( isset( $customWidth ) && isset( $customHeight ) ) {
313
+ if ( preg_match( '~width="(\d+)"~i', $parsedContent ) ) {
314
+ $parsedContent = preg_replace( '~width="(\d+)"~i', 'width="' . $customWidth . '"',
315
+ $parsedContent );
316
  }
317
 
318
+ if ( preg_match( '~height="(\d+)"~i', $parsedContent ) ) {
319
+ $parsedContent = preg_replace( '~height="(\d+)"~i', 'height="' . $customHeight . '"',
320
+ $parsedContent );
321
  }
322
 
323
+ if ( preg_match( '~width\s+:\s+(\d+)~i', $parsedContent ) ) {
324
+ $parsedContent = preg_replace( '~width\s+:\s+(\d+)~i', 'width: ' . $customWidth, $parsedContent );
325
  }
326
 
327
+ if ( preg_match( '~height\s+:\s+(\d+)~i', $parsedContent ) ) {
328
+ $parsedContent = preg_replace( '~height\s+:\s+(\d+)~i', 'height: ' . $customHeight,
329
+ $parsedContent );
330
  }
331
  }
332
  }
333
 
334
+ if ( $stripNewLine ) {
335
+ $parsedContent = preg_replace( '/\n/', '', $parsedContent );
336
  }
337
 
338
+ $parsedContent = apply_filters( 'pp_embed_parsed_content', $parsedContent, $urlData, $attributes );
339
 
340
+ if ( !empty( $parsedContent ) ) {
341
+ $embed = (object)array_merge( (array)$urlData, [
342
  'attributes' => (object)$attributes,
343
  'embed' => $parsedContent,
344
  'url' => $content,
345
+ ] );
346
+ $embed = apply_filters( 'embedpress:onAfterEmbed', $embed );
347
  return $embed;
348
  }
349
  }
354
  /**
355
  * Method that adds support to a given new service provider (SP).
356
  *
357
+ * @param string $className The new SP class name.
358
+ * @param string $reference The new SP reference name.
359
+ * @param \Embera\Embera $emberaInstance The embera's instance where the SP will be registered in.
360
+ *
361
+ * @return boolean
362
  * @since 1.0.0
363
  * @static
364
  *
 
 
 
 
 
365
  */
366
+ public static function addServiceProvider( $className, $reference, &$emberaInstance ) {
367
+ if ( empty( $className ) || empty( $reference ) ) {
 
368
  return false;
369
  }
370
 
371
+ if ( is_string( $reference ) ) {
372
+ $emberaInstance->addProvider( $reference, EMBEDPRESS_NAMESPACE . "\\Providers\\{$className}" );
373
+ } elseif ( is_array( $reference ) ) {
374
+ foreach ( $reference as $serviceProviderUrl ) {
375
+ self::addServiceProvider( $className, $serviceProviderUrl, $emberaInstance );
376
  }
377
  } else {
378
  return false;
382
  /**
383
  * Method that retrieves all custom parameters from a shortcoded string.
384
  *
385
+ * @param string $subject The given shortcoded string.
386
+ *
387
+ * @return array
388
  * @since 1.0.0
389
  * @static
390
  *
 
 
 
391
  */
392
+ public static function parseContentAttributesFromString( $subject ) {
 
393
  $customAttributes = [];
394
+ if ( preg_match( '/\[embed\s*(.*?)\]/i', stripslashes( $subject ), $m ) ) {
395
+ if ( preg_match_all( '/(\!?\w+-?\w*)(?:="(.+?)")?/i', stripslashes( $m[1] ), $matches ) ) {
396
  $attributes = $matches[1];
397
  $attrValues = $matches[2];
398
 
399
+ foreach ( $attributes as $attrIndex => $attrName ) {
400
  $customAttributes[$attrName] = $attrValues[$attrIndex];
401
  }
402
  }
408
  /**
409
  * Method that parses and adds the "data-" prefix to the given custom shortcode attributes.
410
  *
411
+ * @param array $customAttributes The array containing the embed attributes.
412
+ * @param string $content_uid An optional string specifying a unique ID for the embed
413
+ *
414
+ * @return array
415
  * @since 1.0.0
416
  * @access private
417
  * @static
418
  *
 
 
 
 
419
  */
420
+ private static function parseContentAttributes( array $customAttributes, $content_uid = null ) {
 
421
  $attributes = [
422
+ 'class' => [ "embedpress-wrapper" ],
423
  ];
424
 
425
  $embedShouldBeResponsive = true;
426
  $embedShouldHaveCustomDimensions = false;
427
+ if ( !empty( $customAttributes ) ) {
428
+ if ( isset( $customAttributes['class'] ) ) {
429
+ if ( !empty( $customAttributes['class'] ) ) {
430
+ $customAttributes['class'] = explode( ' ', $customAttributes['class'] );
431
 
432
+ $attributes['class'] = array_merge( $attributes['class'], $customAttributes['class'] );
433
  }
434
 
435
+ unset( $customAttributes['class'] );
436
  }
437
 
438
+ if ( isset( $customAttributes['width'] ) ) {
439
+ if ( !empty( $customAttributes['width'] ) ) {
440
  $attributes['width'] = (int)$customAttributes['width'];
441
  $embedShouldHaveCustomDimensions = true;
442
  }
443
  }
444
 
445
+ if ( isset( $customAttributes['height'] ) ) {
446
+ if ( !empty( $customAttributes['height'] ) ) {
447
  $attributes['height'] = (int)$customAttributes['height'];
448
  $embedShouldHaveCustomDimensions = true;
449
  }
450
  }
451
 
452
+ if ( !empty( $customAttributes ) ) {
453
  $attrNameDefaultPrefix = "data-";
454
+ foreach ( $customAttributes as $attrName => $attrValue ) {
455
+ if ( is_numeric( $attrName ) ) {
456
  $attrName = $attrValue;
457
  $attrValue = "";
458
  }
459
 
460
+ $attrName = str_replace( $attrNameDefaultPrefix, "", $attrName );
461
 
462
+ if ( !strlen( $attrValue ) ) {
463
+ if ( $attrName[0] === "!" ) {
464
  $attrValue = "false";
465
+ $attrName = substr( $attrName, 1 );
466
  } else {
467
  $attrValue = "true";
468
  }
473
  }
474
 
475
  // Check if there's any "responsive" parameter
476
+ $responsiveAttributes = [ "responsive", "data-responsive" ];
477
+ foreach ( $responsiveAttributes as $responsiveAttr ) {
478
+ if ( isset( $attributes[$responsiveAttr] ) ) {
479
+ if ( !strlen( $attributes[$responsiveAttr] ) ) { // If the parameter is passed but have no value, it will be true by default
480
  $embedShouldBeResponsive = true;
481
  } else {
482
+ $embedShouldBeResponsive = !self::valueIsFalse( $attributes[$responsiveAttr] );
483
  }
484
 
485
  break;
486
  }
487
  }
488
+ unset( $responsiveAttr, $responsiveAttributes );
489
  }
490
 
491
  $attributes['class'][] = 'ose-{provider_alias}';
492
 
493
+ if ( !empty( $content_uid ) ) {
494
  $attributes['class'][] = 'ose-uid-' . $content_uid;
495
  }
496
 
497
+ if ( $embedShouldBeResponsive && !$embedShouldHaveCustomDimensions ) {
498
  $attributes['class'][] = 'responsive';
499
  } else {
500
  $attributes['data-responsive'] = "false";
501
  }
502
 
503
+ $attributes['class'] = implode( ' ', array_unique( array_filter( $attributes['class'] ) ) );
504
+ if ( isset( $attributes['width'] ) ) {
505
  $attributes['style'] = "width:{$attributes['width'] }px;height:{$attributes['height'] }px;";
506
  }
507
 
511
  /**
512
  * Method that checks if a given value is/can be identified as (bool)false.
513
  *
514
+ * @param mixed $subject The value to be checked.
515
+ *
516
+ * @return boolean
517
  * @since 1.0.0
518
  * @static
519
  *
 
 
 
520
  */
521
+ public static function valueIsFalse( $subject ) {
522
+ $subject = strtolower( trim( (string)$subject ) );
523
+ switch ( $subject ) {
 
524
  case "0":
525
  case "false":
526
  case "off":
538
  * Return the value from a header which is in an array resulted from a get_headers() call.
539
  * If the header cannot be found, this method will return null instead.
540
  *
541
+ * @param string $headerPattern Regex pattern the header and its value must match.
542
+ * @param array $headersList A list of headers resulted from a get_headers() call.
543
+ *
544
+ * @return mixed
545
  * @since 1.1.0
546
  * @access private
547
  * @static
548
  *
 
 
 
 
549
  */
550
+ private static function extractContentFromHeaderAsArray( $headerPattern, $headersList ) {
 
551
  $headerValue = null;
552
 
553
+ foreach ( $headersList as $header ) {
554
+ if ( preg_match( $headerPattern, $header, $matches ) ) {
555
  $headerValue = $matches[1];
556
  break;
557
  }
565
  * attributes from "dash" separated to "underline" separated to be able to access
566
  * those attributes from the object, without having to convert it to an array.
567
  *
568
+ * @param object $data
569
+ *
570
+ * @return object
571
  * @since 1.6.1
572
  * @access private
573
  * @static
574
  *
 
 
 
575
  */
576
+ private static function sanitizeUrlData( $data ) {
577
+ if ( is_object( $data ) ) {
578
+ $attributes = get_object_vars( $data );
 
579
 
580
+ foreach ( $attributes as $key => $value ) {
581
+ if ( substr_count( $key, '-' ) ) {
582
+ unset( $data->$key );
583
 
584
+ $key = str_replace( '-', '_', $key );
585
  $data->$key = $value;
586
  }
587
  }
588
+ } elseif ( is_array( $data ) ) {
589
+ foreach ( $data as $key => $value ) {
590
+ if ( substr_count( $key, '-' ) ) {
591
+ unset( $data[$key] );
592
 
593
+ $key = str_replace( '-', '_', $key );
594
  $data[$key] = $value;
595
  }
596
  }
Gutenberg/src/init.php CHANGED
@@ -93,4 +93,4 @@ add_filter( 'block_categories', 'embedpress_block_category', 10, 2);
93
 
94
  foreach ( glob( plugin_dir_path(__FILE__) . '*/index.php' ) as $block_logic ) {
95
  require $block_logic;
96
- }
93
 
94
  foreach ( glob( plugin_dir_path(__FILE__) . '*/index.php' ) as $block_logic ) {
95
  require $block_logic;
96
+ }
assets/js/settings.js CHANGED
@@ -11,4 +11,19 @@
11
  $(function () {
12
  $('.color-field').wpColorPicker();
13
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  })(jQuery);
11
  $(function () {
12
  $('.color-field').wpColorPicker();
13
  });
14
+
15
+ //control global embed iframe size
16
+ $('.enableglobalembedresize').on('change', embedpressEnableglobalembedresize);
17
+ embedpressEnableglobalembedresize();
18
+
19
+ function embedpressEnableglobalembedresize(e) {
20
+ var check = $('.enableglobalembedresize:checked').val();
21
+ var selector = $('.embedpress-allow-globla-dimension').closest( "tr" );
22
+ if(check!=='1'){
23
+ selector.hide();
24
+ }else{
25
+ selector.show();
26
+ }
27
+ }
28
+
29
  })(jQuery);
embedpress.php CHANGED
@@ -6,7 +6,7 @@
6
  * Facebook, Google Maps, Google Docs, UStream! Just use the URL!
7
  * Author: WPDeveloper
8
  * Author URI: https://wpdeveloper.net
9
- * Version: 2.4.0
10
  * Text Domain: embedpress
11
  * Domain Path: /languages
12
  *
6
  * Facebook, Google Maps, Google Docs, UStream! Just use the URL!
7
  * Author: WPDeveloper
8
  * Author URI: https://wpdeveloper.net
9
+ * Version: 2.4.1
10
  * Text Domain: embedpress
11
  * Domain Path: /languages
12
  *
includes.php CHANGED
@@ -22,7 +22,7 @@ if ( ! defined('EMBEDPRESS_PLG_NAME')) {
22
  }
23
 
24
  if ( ! defined('EMBEDPRESS_VERSION')) {
25
- define('EMBEDPRESS_VERSION', "2.4.0");
26
  /**
27
  * @deprecated 2.2.0
28
  */
@@ -30,7 +30,7 @@ if ( ! defined('EMBEDPRESS_VERSION')) {
30
  }
31
 
32
  if ( ! defined('EMBEDPRESS_PRO_VERSION')) {
33
- define('EMBEDPRESS_PRO_VERSION', "2.0.0");
34
  }
35
 
36
  if ( ! defined('EMBEDPRESS_ROOT')) {
22
  }
23
 
24
  if ( ! defined('EMBEDPRESS_VERSION')) {
25
+ define('EMBEDPRESS_VERSION', "2.4.1");
26
  /**
27
  * @deprecated 2.2.0
28
  */
30
  }
31
 
32
  if ( ! defined('EMBEDPRESS_PRO_VERSION')) {
33
+ define('EMBEDPRESS_PRO_VERSION', "2.3.1");
34
  }
35
 
36
  if ( ! defined('EMBEDPRESS_ROOT')) {
readme.txt CHANGED
@@ -1,4 +1,3 @@
1
-
2
  === EmbedPress – Embed Google Docs, Vimeo and Wistia videos, Giphy and Imgur photos, and more ===
3
  Contributors: EmbedPress, asif2bd, re_enter_rupok, wpdevteam, manzurahammed, andergmartins, stevejburge, pressshack, deenison
4
  Author: WPDeveloper
@@ -7,7 +6,7 @@ Tags: embed, code, video embed, Youtube embed, map embed, content embed, iframes
7
  Requires at least: 4.6
8
  Tested up to: 5.3
9
  Requires PHP: 5.6
10
- Stable tag: 2.4.0
11
  License: GPLv2 or later
12
  License URI: https://opensource.org/licenses/GPL-3.0
13
 
@@ -265,6 +264,8 @@ Not at all. You can set up everything your team needs without any coding knowled
265
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
266
  and this project adheres to [Semantic Versioning](http://semver.org/).
267
 
 
 
268
 
269
  = [2.4.0] - 2020-03-02 =
270
  * Gutenberg Compatibility improvement
@@ -575,4 +576,4 @@ Added Wistia and Twitch blocks for Gutenberg
575
 
576
  == Upgrade Notice ==
577
 
578
- * Must Update. Compatibility release.
 
1
  === EmbedPress – Embed Google Docs, Vimeo and Wistia videos, Giphy and Imgur photos, and more ===
2
  Contributors: EmbedPress, asif2bd, re_enter_rupok, wpdevteam, manzurahammed, andergmartins, stevejburge, pressshack, deenison
3
  Author: WPDeveloper
6
  Requires at least: 4.6
7
  Tested up to: 5.3
8
  Requires PHP: 5.6
9
+ Stable tag: 2.4.1
10
  License: GPLv2 or later
11
  License URI: https://opensource.org/licenses/GPL-3.0
12
 
264
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
265
  and this project adheres to [Semantic Versioning](http://semver.org/).
266
 
267
+ = [2.4.1] - 2020-03-04 =
268
+ * Fixed global iFrame resize capacity
269
 
270
  = [2.4.0] - 2020-03-02 =
271
  * Gutenberg Compatibility improvement
576
 
577
  == Upgrade Notice ==
578
 
579
+ * [Minor after 2.4.0] Fixed global iFrame resize capacity