WP Meta SEO - Version 2.1.0

Version Description

  • Add ImageRecycle images and PDF compression integration (www.imagerecycle.com)
Download this release

Release Info

Developer JoomUnited
Plugin Icon 128x128 WP Meta SEO
Version 2.1.0
Comparing to
See all releases

Code changes from version 2.0.3 to 2.1.0

inc/class.metaseo-admin.php CHANGED
@@ -713,6 +713,15 @@ class MetaSeo_Admin {
713
  array($this, 'load_page'),
714
  null,
715
  ),
 
 
 
 
 
 
 
 
 
716
  array(
717
  'metaseo_dashboard',
718
  '',
@@ -775,6 +784,9 @@ class MetaSeo_Admin {
775
  function load_page() {
776
  if (isset($_GET['page'])) {
777
  switch ($_GET['page']) {
 
 
 
778
  case 'metaseo_broken_link':
779
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/pages/metaseo-broken-link.php' );
780
  break;
713
  array($this, 'load_page'),
714
  null,
715
  ),
716
+ array(
717
+ 'metaseo_dashboard',
718
+ '',
719
+ __('Image compression', 'wp-meta-seo'),
720
+ $manage_options_cap,
721
+ 'metaseo_image_compression',
722
+ array($this, 'load_page'),
723
+ null,
724
+ ),
725
  array(
726
  'metaseo_dashboard',
727
  '',
784
  function load_page() {
785
  if (isset($_GET['page'])) {
786
  switch ($_GET['page']) {
787
+ case 'metaseo_image_compression':
788
+ require_once( WPMETASEO_PLUGIN_DIR . 'inc/pages/metaseo-image-compression.php' );
789
+ break;
790
  case 'metaseo_broken_link':
791
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/pages/metaseo-broken-link.php' );
792
  break;
inc/class.metaseo-dashboard.php CHANGED
@@ -294,4 +294,46 @@ class MetaSeo_Dashboard {
294
  }
295
  return array('count_404' => $count_404 , 'count_404_redirected' => $count_404_redirected , 'percent' => $percent);
296
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
294
  }
295
  return array('count_404' => $count_404 , 'count_404_redirected' => $count_404_redirected , 'percent' => $percent);
296
  }
297
+
298
+ public function wpmf_getImages_optimizer(){
299
+ global $wpdb;
300
+ $query = 'SELECT distinct file FROM '.$wpdb->prefix.'wpio_images';
301
+ $files = $wpdb->get_results($query);
302
+ $image_optimize = 0;
303
+ foreach ($files as $file){
304
+ if(file_exists(str_replace('/', DIRECTORY_SEPARATOR, ABSPATH . $file->file))){
305
+ $image_optimize++;
306
+ }
307
+ }
308
+ return $image_optimize;
309
+ }
310
+
311
+ public function wpmf_getImages_count(){
312
+ $wpio_settings = get_option('_wpio_settings');
313
+ $include_folders = $wpio_settings['wpio_api_include'];
314
+ $allowedPath = explode(',',$include_folders);
315
+ $images = array();
316
+ $image_optimize = $this->wpmf_getImages_optimizer();
317
+
318
+ $allowed_ext = array('jpg','jpeg','jpe','gif','png','pdf');
319
+ $min_size = (int)$wpio_settings['wpio_api_minfilesize'] *1024;
320
+ $max_size = (int)$wpio_settings['wpio_api_maxfilesize'] *1024;
321
+ if($max_size==0) $max_size = 5 * 1024 * 1024;
322
+ $count_image = 0;
323
+ $scan_dir = str_replace('/', DIRECTORY_SEPARATOR, ABSPATH) ;
324
+ foreach (new RecursiveIteratorIterator(new IgnorantRecursiveDirectoryIterator($scan_dir)) as $filename){
325
+ if(!in_array(strtolower(pathinfo($filename,PATHINFO_EXTENSION)),$allowed_ext)){
326
+ continue;
327
+ }
328
+
329
+ $count_image++;
330
+ }
331
+
332
+ if($count_image == 0){
333
+ $precent = 0;
334
+ }else{
335
+ $precent = ceil($image_optimize/$count_image*100);
336
+ }
337
+ return array('image_optimize' => $image_optimize, 'count_image' => $count_image , 'percent' => $precent);
338
+ }
339
  }
inc/class.metaseo-meta.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
-
3
  class WPMSEO_Meta {
4
 
5
  public static $meta_prefix = '_metaseo_meta';
@@ -13,97 +13,97 @@ class WPMSEO_Meta {
13
  'general' => array(
14
  'snippetpreview' => array(
15
  'type' => 'snippetpreview',
16
- 'title' => '', // Translation added later.
17
- 'help' => '', // Translation added later.
18
  ),
19
  'title' => array(
20
  'type' => 'textarea',
21
- 'title' => '', // Translation added later.
22
  'default_value' => '',
23
- 'description' => '', // Translation added later.
24
- 'help' => '', // Translation added later.
25
  'rows' => 2
26
  ),
27
  'keywords' => array(
28
  'type' => 'textarea',
29
- 'title' => '', // Translation added later.
30
  'default_value' => '',
31
- 'description' => '', // Translation added later.
32
- 'help' => '', // Translation added later.
33
  'rows' => 2
34
  ),
35
  'desc' => array(
36
  'type' => 'textarea',
37
- 'title' => '', // Translation added later.
38
  'default_value' => '',
39
  'class' => 'desc',
40
  'rows' => 3,
41
- 'description' => '', // Translation added later.
42
- 'help' => '', // Translation added later.
43
  ),
44
  'metaseo_chart' => array(
45
  'type' => 'metaseo_chart',
46
- 'title' => '', // Translation added later.
47
  'default_value' => '',
48
  'class' => 'metaseo_chart',
49
  'rows' => 2,
50
- 'description' => '', // Translation added later.
51
- 'help' => '', // Translation added later.
52
  ),
53
  ),
54
  'social' => array(
55
  'opengraph-title' => array(
56
  'type' => 'text',
57
- 'title' => '', // Translation added later.
58
  'default_value' => '',
59
- 'description' => '', // Translation added later.
60
- 'help' => '', // Translation added later.
61
  ),
62
  'opengraph-desc' => array(
63
  'type' => 'textarea',
64
- 'title' => '', // Translation added later.
65
  'default_value' => '',
66
  'class' => 'desc',
67
  'rows' => 3,
68
- 'description' => '', // Translation added later.
69
- 'help' => '', // Translation added later.
70
  ),
71
  'opengraph-image' => array(
72
  'type' => 'upload',
73
- 'title' => '', // Translation added later.
74
  'default_value' => '',
75
  'class' => 'desc',
76
- 'description' => '', // Translation added later.
77
- 'help' => '', // Translation added later.
78
  ),
79
 
80
  'twitter-title' => array(
81
  'type' => 'text',
82
- 'title' => '', // Translation added later.
83
  'default_value' => '',
84
- 'description' => '', // Translation added later.
85
- 'help' => '', // Translation added later.
86
  ),
87
  'twitter-desc' => array(
88
  'type' => 'textarea',
89
- 'title' => '', // Translation added later.
90
  'default_value' => '',
91
  'class' => 'desc',
92
  'rows' => 3,
93
- 'description' => '', // Translation added later.
94
- 'help' => '', // Translation added later.
95
  ),
96
  'twitter-image' => array(
97
  'type' => 'upload',
98
- 'title' => '', // Translation added later.
99
  'default_value' => '',
100
  'class' => 'desc',
101
- 'description' => '', // Translation added later.
102
- 'help' => '', // Translation added later.
103
  ),
104
 
105
  ),
106
- /* Fields we should validate & save, but not show on any form */
107
  'non_form' => array(
108
  'linkdex' => array(
109
  'type' => null,
@@ -135,10 +135,8 @@ class WPMSEO_Meta {
135
  }
136
 
137
  $field_defs = self::$meta_fields[$tab];
138
-
139
  switch ($tab) {
140
  case 'non-form':
141
- // Prevent non-form fields from being passed to forms.
142
  $field_defs = array();
143
  break;
144
 
@@ -146,226 +144,22 @@ class WPMSEO_Meta {
146
  case 'general':
147
  $options = get_option('wpmseo_titles');
148
  if ($options['usemetakeywords'] === true) {
149
- /* Adjust the link in the keywords description text string based on the post type */
150
  $field_defs['metakeywords']['description'] = sprintf($field_defs['metakeywords']['description'], '<a target="_blank" href="' . esc_url(admin_url('admin.php?page=wpmseo_titles#top#post_types')) . '">', '</a>');
151
  } else {
152
- /* Don't show the keywords field if keywords aren't enabled */
153
  unset($field_defs['metakeywords']);
154
  }
155
- /**
156
- * Filter the WPSEO metabox form field definitions for the general tab, backward compatibility
157
- *
158
- * @deprecated 1.5.0
159
- * @deprecated use the 'wpmseo_metabox_entries_general' filter instead
160
- * @see WPMSEO_Meta::get_meta_field_defs()
161
- *
162
- * @param array $field_defs Metabox orm definitions.
163
- *
164
- * @return array
165
- */
166
  $field_defs = apply_filters('wpmseo_metabox_entries', $field_defs);
167
  break;
168
 
169
 
170
  case 'advanced':
171
- // global $post;
172
- //
173
- // $options = WPSEO_Options::get_all();
174
- //
175
- // if ( ! current_user_can( 'manage_options' ) && $options['disableadvanced_meta'] ) {
176
- // return array();
177
- // }
178
- //
179
- // $post_type = '';
180
- // if ( isset( $post->post_type ) ) {
181
- // $post_type = $post->post_type;
182
- // }
183
- // elseif ( ! isset( $post->post_type ) && isset( $_GET['post_type'] ) ) {
184
- // $post_type = sanitize_text_field( $_GET['post_type'] );
185
- // }
186
- //
187
- // /* Adjust the no-index 'default for post type' text string based on the post type */
188
- // $field_defs['meta-robots-noindex']['options']['0'] = sprintf( $field_defs['meta-robots-noindex']['options']['0'], ( ( isset( $options[ 'noindex-' . $post_type ] ) && $options[ 'noindex-' . $post_type ] === true ) ? 'noindex' : 'index' ) );
189
- //
190
- // /* Adjust the robots advanced 'site-wide default' text string based on those settings */
191
- // if ( $options['noodp'] !== false || $options['noydir'] !== false ) {
192
- // $robots_adv = array();
193
- // foreach ( array( 'noodp', 'noydir' ) as $robot ) {
194
- // if ( $options[ $robot ] === true ) {
195
- // // Use translation from field def options - mind that $options and $field_def['options'] keys should be the same!
196
- // $robots_adv[] = $field_defs['meta-robots-adv']['options'][ $robot ];
197
- // }
198
- // }
199
- // unset( $robot );
200
- // $robots_adv = implode( ', ', $robots_adv );
201
- // }
202
- // else {
203
- // $robots_adv = __( 'None', 'wordpress-seo' );
204
- // }
205
- // $field_defs['meta-robots-adv']['options']['-'] = sprintf( $field_defs['meta-robots-adv']['options']['-'], $robots_adv );
206
- // unset( $robots_adv );
207
- //
208
- //
209
- // /* Don't show the breadcrumb title field if breadcrumbs aren't enabled */
210
- // if ( $options['breadcrumbs-enable'] !== true ) {
211
- // unset( $field_defs['bctitle'] );
212
- // }
213
- //
214
- // global $post;
215
- //
216
- // if ( empty( $post->ID ) || ( ! empty( $post->ID ) && self::get_value( 'redirect', $post->ID ) === '' ) ) {
217
- // unset( $field_defs['redirect'] );
218
- // }
219
  break;
220
  }
221
 
222
  return apply_filters('wpmseo_metabox_entries_' . $tab, $field_defs, $post_type);
223
  }
224
 
225
- public static function sanitize_post_meta($meta_value, $meta_key) {
226
- $field_def = self::$meta_fields[self::$fields_index[$meta_key]['subset']][self::$fields_index[$meta_key]['key']];
227
- $clean = self::$defaults[$meta_key];
228
-
229
- switch (true) {
230
- case ( $meta_key === self::$meta_prefix . 'linkdex' ):
231
- $int = WPMSEO_Utils::validate_int($meta_value);
232
- if ($int !== false && $int >= 0) {
233
- $clean = strval($int); // Convert to string to make sure default check works.
234
- }
235
- break;
236
-
237
-
238
- case ( $field_def['type'] === 'checkbox' ):
239
- // Only allow value if it's one of the predefined options.
240
- if (in_array($meta_value, array('on', 'off'), true)) {
241
- $clean = $meta_value;
242
- }
243
- break;
244
-
245
-
246
- case ( $field_def['type'] === 'select' || $field_def['type'] === 'radio' ):
247
- // Only allow value if it's one of the predefined options.
248
- if (isset($field_def['options'][$meta_value])) {
249
- $clean = $meta_value;
250
- }
251
- break;
252
-
253
-
254
- case ( $field_def['type'] === 'multiselect' && $meta_key === self::$meta_prefix . 'meta-robots-adv' ):
255
- $clean = self::validate_meta_robots_adv($meta_value);
256
- break;
257
-
258
-
259
- case ( $field_def['type'] === 'text' && $meta_key === self::$meta_prefix . 'canonical' ):
260
- case ( $field_def['type'] === 'text' && $meta_key === self::$meta_prefix . 'redirect' ):
261
- // Validate as url(-part).
262
- $url = WPMSEO_Utils::sanitize_url($meta_value);
263
- if ($url !== '') {
264
- $clean = $url;
265
- }
266
- break;
267
-
268
-
269
- case ( $field_def['type'] === 'upload' && $meta_key === self::$meta_prefix . 'opengraph-image' ):
270
- // Validate as url.
271
- $url = WPMSEO_Utils::sanitize_url($meta_value, array('http', 'https', 'ftp', 'ftps'));
272
- if ($url !== '') {
273
- $clean = $url;
274
- }
275
- break;
276
-
277
-
278
- case ( $field_def['type'] === 'textarea' ):
279
- if (is_string($meta_value)) {
280
- // Remove line breaks and tabs.
281
- // @todo [JRF => Yoast] verify that line breaks and the likes aren't allowed/recommended in meta header fields.
282
- $meta_value = str_replace(array("\n", "\r", "\t", ' '), ' ', $meta_value);
283
- $clean = WPMSEO_Utils::sanitize_text_field(trim($meta_value));
284
- }
285
- break;
286
-
287
- case ( 'multiselect' === $field_def['type'] ):
288
- $clean = $meta_value;
289
- break;
290
-
291
-
292
- case ( $field_def['type'] === 'text' ):
293
- default:
294
- if (is_string($meta_value)) {
295
- $clean = WPMSEO_Utils::sanitize_text_field(trim($meta_value));
296
- }
297
- break;
298
- }
299
-
300
- $clean = apply_filters('wpmseo_sanitize_post_meta_' . $meta_key, $clean, $meta_value, $field_def, $meta_key);
301
-
302
- return $clean;
303
- }
304
-
305
- public static function validate_meta_robots_adv($meta_value) {
306
- $clean = self::$meta_fields['advanced']['meta-robots-adv']['default_value'];
307
- $options = self::$meta_fields['advanced']['meta-robots-adv']['options'];
308
-
309
- if (is_string($meta_value)) {
310
- $meta_value = explode(',', $meta_value);
311
- }
312
-
313
- if (is_array($meta_value) && $meta_value !== array()) {
314
- $meta_value = array_map('trim', $meta_value);
315
-
316
- if (in_array('none', $meta_value, true)) {
317
- // None is one of the selected values, takes priority over everything else.
318
- $clean = 'none';
319
- } elseif (in_array('-', $meta_value, true)) {
320
- // Site-wide defaults is one of the selected values, takes priority over individual selected entries.
321
- $clean = '-';
322
- } else {
323
- // Individual selected entries.
324
- $cleaning = array();
325
- foreach ($meta_value as $value) {
326
- if (isset($options[$value])) {
327
- $cleaning[] = $value;
328
- }
329
- }
330
-
331
- if ($cleaning !== array()) {
332
- $clean = implode(',', $cleaning);
333
- }
334
- unset($cleaning, $value);
335
- }
336
- }
337
-
338
- return $clean;
339
- }
340
-
341
- public static function remove_meta_if_default($null, $object_id, $meta_key, $meta_value, $prev_value = '') {
342
- /* If it's one of our meta fields, check against default */
343
- if (isset(self::$fields_index[$meta_key]) && self::meta_value_is_default($meta_key, $meta_value) === true) {
344
- if ($prev_value !== '') {
345
- delete_post_meta($object_id, $meta_key, $prev_value);
346
- } else {
347
- delete_post_meta($object_id, $meta_key);
348
- }
349
-
350
- return true; // Stop saving the value.
351
- }
352
-
353
- return null; // Go on with the normal execution (update) in meta.php.
354
- }
355
-
356
- public static function dont_save_meta_if_default($null, $object_id, $meta_key, $meta_value) {
357
- /* If it's one of our meta fields, check against default */
358
- if (isset(self::$fields_index[$meta_key]) && self::meta_value_is_default($meta_key, $meta_value) === true) {
359
- return true; // Stop saving the value.
360
- }
361
-
362
- return null; // Go on with the normal execution (add) in meta.php.
363
- }
364
-
365
- public static function meta_value_is_default($meta_key, $meta_value) {
366
- return ( isset(self::$defaults[$meta_key]) && $meta_value === self::$defaults[$meta_key] );
367
- }
368
-
369
  public static function get_value($key, $postid = 0) {
370
  global $post;
371
 
@@ -378,7 +172,7 @@ class WPMSEO_Meta {
378
  }
379
  }
380
 
381
- $custom = get_post_custom($postid); // Array of strings or empty array.
382
 
383
  if (isset($custom[self::$meta_prefix . $key][0])) {
384
  $unserialized = maybe_unserialize($custom[self::$meta_prefix . $key][0]);
@@ -389,7 +183,6 @@ class WPMSEO_Meta {
389
  }
390
  }
391
 
392
- // Meta was either not found or found, but object/array while not allowed to be.
393
  if (isset(self::$defaults[self::$meta_prefix . $key])) {
394
  return self::$defaults[self::$meta_prefix . $key];
395
  } else {
@@ -400,184 +193,6 @@ class WPMSEO_Meta {
400
  public static function set_value($key, $meta_value, $post_id) {
401
  return update_post_meta($post_id, self::$meta_prefix . $key, $meta_value);
402
  }
403
-
404
- public static function replace_meta($old_metakey, $new_metakey, $delete_old = false) {
405
- global $wpdb;
406
- $query = $wpdb->prepare(
407
- "
408
- SELECT `a`.*
409
- FROM {$wpdb->postmeta} AS a
410
- WHERE `a`.`meta_key` = %s
411
- AND NOT EXISTS (
412
- SELECT DISTINCT `post_id` , count( `meta_id` ) AS count
413
- FROM {$wpdb->postmeta} AS b
414
- WHERE `a`.`post_id` = `b`.`post_id`
415
- AND `meta_key` LIKE %s
416
- AND `meta_key` <> %s
417
- GROUP BY `post_id`
418
- )
419
- ;", $old_metakey, $wpdb->esc_like(self::$meta_prefix . '%'), self::$meta_prefix . 'linkdex'
420
- );
421
- $oldies = $wpdb->get_results($query);
422
-
423
- if (is_array($oldies) && $oldies !== array()) {
424
- foreach ($oldies as $old) {
425
- update_post_meta($old->post_id, $new_metakey, $old->meta_value);
426
- }
427
- }
428
-
429
- // Delete old keys.
430
- if ($delete_old === true) {
431
- delete_post_meta_by_key($old_metakey);
432
- }
433
- }
434
-
435
- public static function clean_up() {
436
- global $wpdb;
437
- $query = $wpdb->prepare(
438
- "
439
- SELECT `a`.*
440
- FROM {$wpdb->postmeta} AS a
441
- WHERE `a`.`meta_key` = %s
442
- AND NOT EXISTS (
443
- SELECT DISTINCT `post_id` , count( `meta_id` ) AS count
444
- FROM {$wpdb->postmeta} AS b
445
- WHERE `a`.`post_id` = `b`.`post_id`
446
- AND ( `meta_key` = %s
447
- OR `meta_key` = %s )
448
- GROUP BY `post_id`
449
- )
450
- ;", self::$meta_prefix . 'meta-robots', self::$meta_prefix . 'meta-robots-noindex', self::$meta_prefix . 'meta-robots-nofollow'
451
- );
452
- $oldies = $wpdb->get_results($query);
453
-
454
- if (is_array($oldies) && $oldies !== array()) {
455
- foreach ($oldies as $old) {
456
- $old_values = explode(',', $old->meta_value);
457
- foreach ($old_values as $value) {
458
- if ($value === 'noindex') {
459
- update_post_meta($old->post_id, self::$meta_prefix . 'meta-robots-noindex', 1);
460
- } elseif ($value === 'nofollow') {
461
- update_post_meta($old->post_id, self::$meta_prefix . 'meta-robots-nofollow', 1);
462
- }
463
- }
464
- }
465
- }
466
- unset($query, $oldies, $old, $old_values, $value);
467
-
468
- // Delete old keys.
469
- delete_post_meta_by_key(self::$meta_prefix . 'meta-robots');
470
-
471
- $query = array();
472
-
473
- foreach (self::$meta_fields as $subset => $field_group) {
474
- foreach ($field_group as $key => $field_def) {
475
- if ($field_def['type'] === 'snippetpreview' || !isset($field_def['default_value'])) {
476
- continue;
477
- }
478
-
479
- if ($key === 'meta-robots-adv') {
480
- $query[] = $wpdb->prepare(
481
- "( meta_key = %s AND ( meta_value = 'none' OR meta_value = '-' ) )", self::$meta_prefix . $key
482
- );
483
- } elseif (isset($field_def['options']) && is_array($field_def['options']) && $field_def['options'] !== array()) {
484
- $valid = $field_def['options'];
485
- // Remove the default value from the valid options.
486
- unset($valid[$field_def['default_value']]);
487
- $valid = array_keys($valid);
488
-
489
- $query[] = $wpdb->prepare(
490
- "( meta_key = %s AND meta_value NOT IN ( '" . implode("','", esc_sql($valid)) . "' ) )", self::$meta_prefix . $key
491
- );
492
- unset($valid);
493
- } elseif (is_string($field_def['default_value']) && $field_def['default_value'] !== '') {
494
- $query[] = $wpdb->prepare(
495
- '( meta_key = %s AND meta_value = %s )', self::$meta_prefix . $key, $field_def['default_value']
496
- );
497
- } else {
498
- $query[] = $wpdb->prepare(
499
- "( meta_key = %s AND meta_value = '' )", self::$meta_prefix . $key
500
- );
501
- }
502
- }
503
- }
504
- unset($subset, $field_group, $key, $field_def);
505
-
506
- $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE " . implode(' OR ', $query) . ';';
507
- $meta_ids = $wpdb->get_col($query);
508
-
509
- if (is_array($meta_ids) && $meta_ids !== array()) {
510
- // WP native action.
511
- do_action('delete_post_meta', $meta_ids, null, null, null);
512
-
513
- $query = "DELETE FROM {$wpdb->postmeta} WHERE meta_id IN( " . implode(',', $meta_ids) . ' )';
514
- $count = $wpdb->query($query);
515
-
516
- if ($count) {
517
- foreach ($meta_ids as $object_id) {
518
- wp_cache_delete($object_id, 'post_meta');
519
- }
520
-
521
- // WP native action.
522
- do_action('deleted_post_meta', $meta_ids, null, null, null);
523
- }
524
- }
525
- unset($query, $meta_ids, $count, $object_id);
526
-
527
- $query = $wpdb->prepare(
528
- "SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s", self::$meta_prefix . 'meta-robots-adv'
529
- );
530
- $oldies = $wpdb->get_results($query);
531
-
532
- if (is_array($oldies) && $oldies !== array()) {
533
- foreach ($oldies as $old) {
534
- $clean = self::validate_meta_robots_adv($old->meta_value);
535
-
536
- if ($clean !== $old->meta_value) {
537
- if ($clean !== self::$meta_fields['advanced']['meta-robots-adv']['default_value']) {
538
- update_metadata_by_mid('post', $old->meta_id, $clean);
539
- } else {
540
- delete_metadata_by_mid('post', $old->meta_id);
541
- }
542
- }
543
- }
544
- }
545
- unset($query, $oldies, $old, $clean);
546
-
547
- do_action('wpmseo_meta_clean_up');
548
- }
549
-
550
- public static function array_merge_recursive_distinct() {
551
-
552
- $arrays = func_get_args();
553
- if (count($arrays) < 2) {
554
- if ($arrays === array()) {
555
- return array();
556
- } else {
557
- return $arrays[0];
558
- }
559
- }
560
-
561
- $merged = array_shift($arrays);
562
-
563
- foreach ($arrays as $array) {
564
- foreach ($array as $key => $value) {
565
- if (is_array($value) && ( isset($merged[$key]) && is_array($merged[$key]) )) {
566
- $merged[$key] = self::array_merge_recursive_distinct($merged[$key], $value);
567
- } else {
568
- $merged[$key] = $value;
569
- }
570
- }
571
- unset($key, $value);
572
- }
573
-
574
- return $merged;
575
- }
576
-
577
- public static function get_post_value($key) {
578
- return ( array_key_exists($key, $_POST) ) ? $_POST[$key] : '';
579
- }
580
-
581
  }
582
 
583
  /* End of class */
1
  <?php
2
+ /* Based on some work of Yoast SEO plugin */
3
  class WPMSEO_Meta {
4
 
5
  public static $meta_prefix = '_metaseo_meta';
13
  'general' => array(
14
  'snippetpreview' => array(
15
  'type' => 'snippetpreview',
16
+ 'title' => '',
17
+ 'help' => '',
18
  ),
19
  'title' => array(
20
  'type' => 'textarea',
21
+ 'title' => '',
22
  'default_value' => '',
23
+ 'description' => '',
24
+ 'help' => '',
25
  'rows' => 2
26
  ),
27
  'keywords' => array(
28
  'type' => 'textarea',
29
+ 'title' => '',
30
  'default_value' => '',
31
+ 'description' => '',
32
+ 'help' => '',
33
  'rows' => 2
34
  ),
35
  'desc' => array(
36
  'type' => 'textarea',
37
+ 'title' => '',
38
  'default_value' => '',
39
  'class' => 'desc',
40
  'rows' => 3,
41
+ 'description' => '',
42
+ 'help' => '',
43
  ),
44
  'metaseo_chart' => array(
45
  'type' => 'metaseo_chart',
46
+ 'title' => '',
47
  'default_value' => '',
48
  'class' => 'metaseo_chart',
49
  'rows' => 2,
50
+ 'description' => '',
51
+ 'help' => '',
52
  ),
53
  ),
54
  'social' => array(
55
  'opengraph-title' => array(
56
  'type' => 'text',
57
+ 'title' => '',
58
  'default_value' => '',
59
+ 'description' => '',
60
+ 'help' => '',
61
  ),
62
  'opengraph-desc' => array(
63
  'type' => 'textarea',
64
+ 'title' => '',
65
  'default_value' => '',
66
  'class' => 'desc',
67
  'rows' => 3,
68
+ 'description' => '',
69
+ 'help' => '',
70
  ),
71
  'opengraph-image' => array(
72
  'type' => 'upload',
73
+ 'title' => '',
74
  'default_value' => '',
75
  'class' => 'desc',
76
+ 'description' => '',
77
+ 'help' => '',
78
  ),
79
 
80
  'twitter-title' => array(
81
  'type' => 'text',
82
+ 'title' => '',
83
  'default_value' => '',
84
+ 'description' => '',
85
+ 'help' => '',
86
  ),
87
  'twitter-desc' => array(
88
  'type' => 'textarea',
89
+ 'title' => '',
90
  'default_value' => '',
91
  'class' => 'desc',
92
  'rows' => 3,
93
+ 'description' => '',
94
+ 'help' => '',
95
  ),
96
  'twitter-image' => array(
97
  'type' => 'upload',
98
+ 'title' => '',
99
  'default_value' => '',
100
  'class' => 'desc',
101
+ 'description' => '',
102
+ 'help' => '',
103
  ),
104
 
105
  ),
106
+
107
  'non_form' => array(
108
  'linkdex' => array(
109
  'type' => null,
135
  }
136
 
137
  $field_defs = self::$meta_fields[$tab];
 
138
  switch ($tab) {
139
  case 'non-form':
 
140
  $field_defs = array();
141
  break;
142
 
144
  case 'general':
145
  $options = get_option('wpmseo_titles');
146
  if ($options['usemetakeywords'] === true) {
 
147
  $field_defs['metakeywords']['description'] = sprintf($field_defs['metakeywords']['description'], '<a target="_blank" href="' . esc_url(admin_url('admin.php?page=wpmseo_titles#top#post_types')) . '">', '</a>');
148
  } else {
 
149
  unset($field_defs['metakeywords']);
150
  }
151
+
 
 
 
 
 
 
 
 
 
 
152
  $field_defs = apply_filters('wpmseo_metabox_entries', $field_defs);
153
  break;
154
 
155
 
156
  case 'advanced':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  break;
158
  }
159
 
160
  return apply_filters('wpmseo_metabox_entries_' . $tab, $field_defs, $post_type);
161
  }
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  public static function get_value($key, $postid = 0) {
164
  global $post;
165
 
172
  }
173
  }
174
 
175
+ $custom = get_post_custom($postid);
176
 
177
  if (isset($custom[self::$meta_prefix . $key][0])) {
178
  $unserialized = maybe_unserialize($custom[self::$meta_prefix . $key][0]);
183
  }
184
  }
185
 
 
186
  if (isset(self::$defaults[self::$meta_prefix . $key])) {
187
  return self::$defaults[self::$meta_prefix . $key];
188
  } else {
193
  public static function set_value($key, $meta_value, $post_id) {
194
  return update_post_meta($post_id, self::$meta_prefix . $key, $meta_value);
195
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  }
197
 
198
  /* End of class */
inc/class.metaseo-metabox.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/class.metaseo-meta.php' );
3
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/class.metaseo-snippet-preview.php' );
4
- require_once( WPMETASEO_PLUGIN_DIR . 'inc/class-metaseo-mutils.php' );
5
 
6
  class WPMSEO_Metabox extends WPMSEO_Meta {
7
 
@@ -28,7 +27,6 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
28
  $post = get_post($post_id);
29
 
30
  if (!is_object($post)) {
31
- // Non-existent post.
32
  return false;
33
  }
34
 
@@ -36,7 +34,6 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
36
 
37
  $meta_boxes = apply_filters('wpmseo_save_metaboxes', array());
38
  $meta_boxes = array_merge($meta_boxes, $this->get_meta_field_defs('general', $post->post_type), $this->get_meta_field_defs('advanced'),$this->get_meta_field_defs('social'));
39
-
40
  foreach ($meta_boxes as $key => $meta_box) {
41
  $data = null;
42
  if ('checkbox' === $meta_box['type']) {
@@ -608,7 +605,6 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
608
 
609
  $output = '';
610
  $circliful = ceil(100*($this->perc_score)/7);
611
- //$output .= '<div class="metaseo_right"><div id="metaseo_circliful"data-dimension="250" data-text="'.$circliful.'%" data-info="" data-width="20" data-fontsize="38" data-percent="'.$circliful.'" data-fgcolor="#7bd095" data-bgcolor="#e5e5e5" style="color:#7bd095" ></div><div>';
612
  $output .= '<div class="metaseo_left">
613
  <div class="metaseo-progress-bar" data-post_id="'.$post->ID.'">
614
  <canvas id="inactiveProgress" class="metaseo-progress-inactive" height="275px" width="275px"></canvas>
@@ -708,11 +704,7 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
708
 
709
  case 'multiselect':
710
  if (isset($meta_field_def['options']) && is_array($meta_field_def['options']) && $meta_field_def['options'] !== array()) {
711
-
712
- // Set $meta_value as $selected_arr.
713
  $selected_arr = $meta_value;
714
-
715
- // If the multiselect field is 'meta-robots-adv' we should explode on ,.
716
  if ('meta-robots-adv' === $key) {
717
  $selected_arr = explode(',', $meta_value);
718
  }
@@ -723,7 +715,6 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
723
 
724
  $options_count = count($meta_field_def['options']);
725
 
726
- // @todo [JRF => whomever] verify height calculation for older WP versions, was 16x, for WP3.8 20x is more appropriate.
727
  $content .= '<select multiple="multiple" size="' . esc_attr($options_count) . '" style="height: ' . esc_attr(( $options_count * 20 ) + 4) . 'px;" name="' . $esc_form_key . '[]" id="' . $esc_form_key . '" class="metaseo' . $class . '">';
728
  foreach ($meta_field_def['options'] as $val => $option) {
729
  $selected = '';
1
  <?php
2
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/class.metaseo-meta.php' );
3
  require_once( WPMETASEO_PLUGIN_DIR . 'inc/class.metaseo-snippet-preview.php' );
 
4
 
5
  class WPMSEO_Metabox extends WPMSEO_Meta {
6
 
27
  $post = get_post($post_id);
28
 
29
  if (!is_object($post)) {
 
30
  return false;
31
  }
32
 
34
 
35
  $meta_boxes = apply_filters('wpmseo_save_metaboxes', array());
36
  $meta_boxes = array_merge($meta_boxes, $this->get_meta_field_defs('general', $post->post_type), $this->get_meta_field_defs('advanced'),$this->get_meta_field_defs('social'));
 
37
  foreach ($meta_boxes as $key => $meta_box) {
38
  $data = null;
39
  if ('checkbox' === $meta_box['type']) {
605
 
606
  $output = '';
607
  $circliful = ceil(100*($this->perc_score)/7);
 
608
  $output .= '<div class="metaseo_left">
609
  <div class="metaseo-progress-bar" data-post_id="'.$post->ID.'">
610
  <canvas id="inactiveProgress" class="metaseo-progress-inactive" height="275px" width="275px"></canvas>
704
 
705
  case 'multiselect':
706
  if (isset($meta_field_def['options']) && is_array($meta_field_def['options']) && $meta_field_def['options'] !== array()) {
 
 
707
  $selected_arr = $meta_value;
 
 
708
  if ('meta-robots-adv' === $key) {
709
  $selected_arr = explode(',', $meta_value);
710
  }
715
 
716
  $options_count = count($meta_field_def['options']);
717
 
 
718
  $content .= '<select multiple="multiple" size="' . esc_attr($options_count) . '" style="height: ' . esc_attr(( $options_count * 20 ) + 4) . 'px;" name="' . $esc_form_key . '[]" id="' . $esc_form_key . '" class="metaseo' . $class . '">';
719
  foreach ($meta_field_def['options'] as $val => $option) {
720
  $selected = '';
inc/class.metaseo-snippet-preview.php CHANGED
@@ -21,17 +21,10 @@ class WPMSEO_Snippet_Preview {
21
  $this->set_content();
22
  }
23
 
24
- /**
25
- * Getter for $this->content
26
- * @return string html for snippet preview
27
- */
28
  public function get_content() {
29
  return $this->content;
30
  }
31
 
32
- /**
33
- * Sets date if available
34
- */
35
  protected function set_date() {
36
  if (is_object($this->post) && isset($this->options['showdate-' . $this->post->post_type]) && $this->options['showdate-' . $this->post->post_type] === true) {
37
  $date = $this->get_post_date();
@@ -39,11 +32,6 @@ class WPMSEO_Snippet_Preview {
39
  }
40
  }
41
 
42
- /**
43
- * Retrieves a post date when post is published, or return current date when it's not.
44
- *
45
- * @return string
46
- */
47
  protected function get_post_date() {
48
  if (isset($this->post->post_date) && $this->post->post_status == 'publish') {
49
  $date = date_i18n('j M Y', strtotime($this->post->post_date));
@@ -54,19 +42,11 @@ class WPMSEO_Snippet_Preview {
54
  return (string) $date;
55
  }
56
 
57
- /**
58
- * Generates the url that is displayed in the snippet preview.
59
- */
60
  protected function set_url() {
61
  $this->url = str_replace(array('http://', 'https://'), '', get_bloginfo('url')) . '/';
62
  $this->set_slug();
63
  }
64
 
65
- /**
66
- * Sets the slug and adds it to the url if the post has been published and the post name exists.
67
- *
68
- * If the post is set to be the homepage the slug is also not included.
69
- */
70
  protected function set_slug() {
71
  $frontpage_post_id = (int) ( get_option('page_on_front') );
72
 
@@ -76,9 +56,6 @@ class WPMSEO_Snippet_Preview {
76
  }
77
  }
78
 
79
- /**
80
- * Generates the html for the snippet preview and assign it to $this->content.
81
- */
82
  protected function set_content() {
83
  $content = <<<HTML
84
  <div id="wpmseosnippet">
@@ -90,11 +67,6 @@ HTML;
90
  $this->set_content_through_filter($content);
91
  }
92
 
93
- /**
94
- * Sets the html for the snippet preview through a filter
95
- *
96
- * @param string $content
97
- */
98
  protected function set_content_through_filter($content) {
99
  $properties = get_object_vars($this);
100
  $properties['desc'] = $properties['description'];
21
  $this->set_content();
22
  }
23
 
 
 
 
 
24
  public function get_content() {
25
  return $this->content;
26
  }
27
 
 
 
 
28
  protected function set_date() {
29
  if (is_object($this->post) && isset($this->options['showdate-' . $this->post->post_type]) && $this->options['showdate-' . $this->post->post_type] === true) {
30
  $date = $this->get_post_date();
32
  }
33
  }
34
 
 
 
 
 
 
35
  protected function get_post_date() {
36
  if (isset($this->post->post_date) && $this->post->post_status == 'publish') {
37
  $date = date_i18n('j M Y', strtotime($this->post->post_date));
42
  return (string) $date;
43
  }
44
 
 
 
 
45
  protected function set_url() {
46
  $this->url = str_replace(array('http://', 'https://'), '', get_bloginfo('url')) . '/';
47
  $this->set_slug();
48
  }
49
 
 
 
 
 
 
50
  protected function set_slug() {
51
  $frontpage_post_id = (int) ( get_option('page_on_front') );
52
 
56
  }
57
  }
58
 
 
 
 
59
  protected function set_content() {
60
  $content = <<<HTML
61
  <div id="wpmseosnippet">
67
  $this->set_content_through_filter($content);
68
  }
69
 
 
 
 
 
 
70
  protected function set_content_through_filter($content) {
71
  $properties = get_object_vars($this);
72
  $properties['desc'] = $properties['description'];
inc/pages/dashboard.php CHANGED
@@ -25,6 +25,8 @@ if(!empty($results_image['imgs_metas_statis'][1])){
25
  $percent_imeta = 100;
26
  }
27
 
 
 
28
  ?>
29
  <h1 style="text-align: center;"><?php _e('WP Meta SEO dashboard', 'wp-meta-seo') ?></h1>
30
  <div class="dashboard">
@@ -206,6 +208,59 @@ if(!empty($results_image['imgs_metas_statis'][1])){
206
  </div>
207
  </div>
208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
  </div>
210
  </div>
211
 
25
  $percent_imeta = 100;
26
  }
27
 
28
+ $plugin_imgRecycle_file = 'imagerecycle-pdf-image-compression/wp-image-recycle.php';
29
+
30
  ?>
31
  <h1 style="text-align: center;"><?php _e('WP Meta SEO dashboard', 'wp-meta-seo') ?></h1>
32
  <div class="dashboard">
208
  </div>
209
  </div>
210
 
211
+ <?php if (file_exists(WP_PLUGIN_DIR . '/imagerecycle-pdf-image-compression')) : ?>
212
+ <?php
213
+ if (!is_plugin_active($plugin_imgRecycle_file)) :
214
+ ?>
215
+
216
+ <div class="col-sm-6 metaseo_tool" alt="<?php _e('Images represent around 60% of a web page weight. An image compression reduce the image size by up to 70% while preserving the same visual quality. Small loading time is great for SEO!','wp-meta-seo') ?>">
217
+ <div class="panel panel-updates">
218
+ <div class="panel-body">
219
+ <div class="row">
220
+ <div class="col-xs-7 col-lg-8">
221
+ <h4 class="panel-title text-success"><?php _e('Image compression','wp-meta-seo') ?></h4>
222
+ <h3>0%</h3>
223
+ <div class="progress">
224
+ <div style="width:0%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" role="progressbar" class="progress-bar progress-bar-success">
225
+ <span class="sr-only">0% Complete (success)</span>
226
+ </div>
227
+ </div>
228
+ <p><?php _e('Use ImageRecycle image compression plugin to activate this feature','wp-meta-seo') ?>: 0%</p>
229
+ </div>
230
+ <div class="col-xs-5 col-lg-4 text-right">
231
+ <input type="text" value="0" class="dial-success">
232
+ </div>
233
+ </div>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <?php else: ?>
239
+ <?php $optimizer_results = $dashboard->wpmf_getImages_count(); ?>
240
+ <div class="col-sm-6 metaseo_tool" alt="<?php _e('Images represent around 60% of a web page weight. An image compression reduce the image size by up to 70% while preserving the same visual quality. Small loading time is great for SEO!','wp-meta-seo') ?>">
241
+ <div class="panel panel-updates">
242
+ <div class="panel-body">
243
+ <div class="row">
244
+ <div class="col-xs-7 col-lg-8">
245
+ <h4 class="panel-title text-success"><?php _e('Image compression','wp-meta-seo') ?></h4>
246
+ <h3><?php echo $optimizer_results['percent'].'%' ?></h3>
247
+ <div class="progress">
248
+ <div style="width: <?php echo $optimizer_results['percent'].'%' ?>" aria-valuemax="100" aria-valuemin="0" aria-valuenow="<?php echo $optimizer_results['percent'] ?>" role="progressbar" class="progress-bar progress-bar-success">
249
+ <span class="sr-only"><?php echo $optimizer_results['percent'].'%' ?> Complete (success)</span>
250
+ </div>
251
+ </div>
252
+ <p><?php _e('Compressed images','wp-meta-seo') ?>: <?php echo $optimizer_results['image_optimize'].'/'.$optimizer_results['count_image'] ?></p>
253
+ </div>
254
+ <div class="col-xs-5 col-lg-4 text-right">
255
+ <input type="text" value="<?php echo $optimizer_results['percent'] ?>" class="dial-success">
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ <?php endif; ?>
262
+ <?php endif; ?>
263
+
264
  </div>
265
  </div>
266
 
inc/pages/metaseo-image-compression.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('IFRAME_REQUEST') && isset($_GET['action']) && in_array($_GET['action'], array('update-selected', 'activate-plugin', 'update-selected-themes')))
3
+ define('IFRAME_REQUEST', true);
4
+
5
+ require_once( ABSPATH . 'wp-admin/admin.php' );
6
+ include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
7
+
8
+ $slug = 'imagerecycle-pdf-image-compression';
9
+ $plugin_file = 'imagerecycle-pdf-image-compression/wp-image-recycle.php';
10
+ if (isset($_GET['action'])) {
11
+ $plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';
12
+ $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
13
+ if ('install-plugin' == $action) {
14
+
15
+ if (!current_user_can('install_plugins'))
16
+ wp_die(__('You do not have sufficient permissions to install plugins on this site.'));
17
+
18
+ include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); //for plugins_api..
19
+
20
+ check_admin_referer('install-plugin_' . $plugin);
21
+ $api = plugins_api('plugin_information', array(
22
+ 'slug' => $plugin,
23
+ 'fields' => array(
24
+ 'short_description' => false,
25
+ 'sections' => false,
26
+ 'requires' => false,
27
+ 'rating' => false,
28
+ 'ratings' => false,
29
+ 'downloaded' => false,
30
+ 'last_updated' => false,
31
+ 'added' => false,
32
+ 'tags' => false,
33
+ 'compatibility' => false,
34
+ 'homepage' => false,
35
+ 'donate_link' => false,
36
+ ),
37
+ ));
38
+
39
+ if (is_wp_error($api)) {
40
+ wp_die($api);
41
+ }
42
+
43
+ $title = __('Plugin Install');
44
+ $parent_file = 'plugins.php';
45
+ $submenu_file = 'plugin-install.php';
46
+ // require_once(ABSPATH . 'wp-admin/admin-header.php');
47
+
48
+ $title = sprintf(__('Installing Plugin: %s'), $api->name . ' ' . $api->version);
49
+ $nonce = 'install-plugin_' . $plugin;
50
+ $url = 'update.php?action=install-plugin&plugin=' . urlencode($plugin);
51
+ if (isset($_GET['from']))
52
+ $url .= '&from=' . urlencode(stripslashes($_GET['from']));
53
+
54
+ $type = 'web'; //Install plugin type, From Web or an Upload.
55
+
56
+ $upgrader = new Plugin_Upgrader(new Plugin_Installer_Skin(compact('title', 'url', 'nonce', 'plugin', 'api')));
57
+ $upgrader->install($api->download_link);
58
+ // include(ABSPATH . 'wp-admin/admin-footer.php');
59
+ }elseif ('activate' == $action) {
60
+ if (!current_user_can('activate_plugins'))
61
+ wp_die(__('You do not have sufficient permissions to activate plugins for this site.'));
62
+
63
+ if (is_multisite() && !is_network_admin() && is_network_only_plugin($plugin)) {
64
+ wp_redirect(self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s"));
65
+ exit;
66
+ }
67
+
68
+ check_admin_referer('activate-plugin_' . $plugin);
69
+
70
+ $result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), is_network_admin());
71
+ if (is_wp_error($result)) {
72
+ if ('unexpected_output' == $result->get_error_code()) {
73
+ $redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . "&plugin_status=$status&paged=$page&s=$s");
74
+ wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
75
+ exit;
76
+ } else {
77
+ wp_die($result);
78
+ }
79
+ }
80
+
81
+ if (!is_network_admin()) {
82
+ $recent = (array) get_option('recently_activated');
83
+ unset($recent[$plugin]);
84
+ update_option('recently_activated', $recent);
85
+ } else {
86
+ $recent = (array) get_site_option('recently_activated');
87
+ unset($recent[$plugin]);
88
+ update_site_option('recently_activated', $recent);
89
+ }
90
+
91
+ if (isset($_GET['from']) && 'import' == $_GET['from']) {
92
+ wp_redirect(self_admin_url("import.php?import=" . str_replace('-importer', '', dirname($plugin)))); // overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix
93
+ } else {
94
+ wp_redirect(self_admin_url("admin.php?page=metaseo_image_compression&wpmsactive=imagerecycle")); // overrides the ?error=true one above
95
+ }
96
+ }
97
+ }
98
+ $button = '';
99
+ $check_install = false;
100
+ if (!file_exists(WP_PLUGIN_DIR . '/imagerecycle-pdf-image-compression')) {
101
+ $url = wp_nonce_url(self_admin_url('admin.php?page=metaseo_image_compression&action=install-plugin&plugin=' . $slug), 'install-plugin_' . $slug);
102
+ if (is_multisite()) {
103
+ if (current_user_can('manage_network_plugins')) {
104
+ $button = '<a style="float: right; background: #554766; font-size: 12px; line-height: 18px; text-align: center; color: #fff;font-size: 14px;text-decoration: none; text-transform: uppercase; padding: 5px 20px; font-weight:bold;" target="_blank" class="edit" data-slug="imagerecycle-pdf-image-compression" href="' . $url . '" aria-label="Install ImageRecycle pdf &amp; image compression 2.1.1 now" data-name="ImageRecycle pdf &amp; image compression 2.1.1">' . __('Install ImageRecycle plugin', 'wp-meta-seo') . '</a>';
105
+ }
106
+ } else {
107
+ $button = '<a style="float: right; background: #554766; font-size: 12px; line-height: 18px; text-align: center;color: #fff;font-size: 14px;text-decoration: none; text-transform: uppercase; padding: 5px 20px; font-weight:bold;" target="_blank" class="edit" data-slug="imagerecycle-pdf-image-compression" href="' . $url . '" aria-label="Install ImageRecycle pdf &amp; image compression 2.1.1 now" data-name="ImageRecycle pdf &amp; image compression 2.1.1">' . __('Install ImageRecycle plugin', 'wp-meta-seo') . '</a>';
108
+ }
109
+ } else {
110
+ if (!is_plugin_active($plugin_file)) {
111
+ $url = wp_nonce_url('admin.php?page=metaseo_image_compression&action=activate&amp;plugin=' . $plugin_file, 'activate-plugin_' . $plugin_file);
112
+ if (is_multisite()) {
113
+ if (current_user_can('manage_network_plugins')) {
114
+ $button = '<a style="float: right; background: #554766; font-size: 12px; line-height: 18px; text-align: center; color: #fff;font-size: 14px;text-decoration: none; text-transform: uppercase; padding: 5px 20px; font-weight:bold;" href="' . $url . '" class="edit" aria-label="Activate ImageRecycle pdf &amp; image compression">' . __('Activate Plugin', 'wp-meta-seo') . '</a>';
115
+ }
116
+ } else {
117
+ $button = '<a style="float: right; background: #554766; font-size: 12px; line-height: 18px; text-align: center;color: #fff;font-size: 14px;text-decoration: none; text-transform: uppercase; padding: 5px 20px; font-weight:bold;" href="' . $url . '" class="edit" aria-label="Activate ImageRecycle pdf &amp; image compression">' . __('Activate Plugin', 'wp-meta-seo') . '</a>';
118
+ }
119
+ } else {
120
+ $check_install = true;
121
+ $button = '<a style="width: 250px; float: right; background: #554766; font-size: 12px; line-height: 18px; text-align: center; margin-left:4px;color: #fff;font-size: 14px;text-decoration: none; text-transform: uppercase; padding: 8px 20px; font-weight:bold;" class="edit" href="upload.php?page=wp-image-recycle-page" aria-label="Activate ImageRecycle pdf &amp; image compression">' . __('ImageRecycle is properly installed: manage images', 'wp-meta-seo') . '</a>';
122
+ }
123
+ }
124
+ ?>
125
+
126
+ <?php if($check_install == true): ?>
127
+ <div class="main-presentation" style="margin: 0px auto; max-width: 1200px; background-color:#f0f1f4;font-family: helvetica,arial,sans-serif;">
128
+ <div class="main-textcontent" style="margin: 0px auto; min-height: 400px; border-left: 1px dotted #d2d3d5; border-right: 1px dotted #d2d3d5; width: 840px; background-color:#fff;border-top: 5px solid #544766;" cellspacing="0" cellpadding="0" align="center">
129
+ <a href="https://www.imagerecycle.com/" target="_blank"> <img src="https://www.imagerecycle.com/images/Notification-mail/logo-image-recycle.png" alt="logo image recycle" width="500" height="84" class="CToWUd" style="display: block; outline: medium none; text-decoration: none; margin-left: auto; margin-right: auto; margin-top:15px;"> </a>
130
+ <p style="background-color: #ffffff; color: #445566; font-family: helvetica,arial,sans-serif; font-size: 24px; line-height: 24px; padding-right: 10px; padding-left: 10px;" align="center"><strong>Great! ImageRecycle is installed<br></strong></p>
131
+ <p style="background-color: #ffffff; color: #445566; font-family: helvetica,arial,sans-serif; font-size: 14px; line-height: 22px; padding-left: 20px; padding-right: 20px; text-align: center;">
132
+ <strong>Speed optimization of your WordPress website is highly recommended for SEO. The image compression is one of the tools that help to reduce your page size significantly while preserving the image quality.<br /><br />You can now manage all you images and compression from the ImageRecycle plugin, menu Media > ImageRecycle.<br /><br /></strong> ImageRecycle got a dedicated plugin for WordPress that run the images optimization automatically on your website &amp; PDF
133
+ <br />In order to start the optimization process, please install the WordPress plugin. Enjoy!</p>
134
+ <p></p>
135
+ <p><?php echo $button; ?></p>
136
+ </div>
137
+ </div>
138
+ <?php else: ?>
139
+
140
+ <div class="main-presentation" style="margin: 0px auto; max-width: 1200px; background-color:#f0f1f4;font-family: helvetica,arial,sans-serif;">
141
+ <div class="main-textcontent" style="margin: 0px auto; min-height: 400px; border-left: 1px dotted #d2d3d5; border-right: 1px dotted #d2d3d5; width: 840px; background-color:#fff;border-top: 5px solid #544766;" cellspacing="0" cellpadding="0" align="center">
142
+ <a href="https://www.imagerecycle.com/" target="_blank"> <img src="https://www.imagerecycle.com/images/Notification-mail/logo-image-recycle.png" alt="logo image recycle" width="500" height="84" class="CToWUd" style="display: block; outline: medium none; text-decoration: none; margin-left: auto; margin-right: auto; margin-top:15px;"> </a>
143
+ <p style="background-color: #ffffff; color: #445566; font-family: helvetica,arial,sans-serif; font-size: 24px; line-height: 24px; padding-right: 10px; padding-left: 10px;" align="center"><strong>Welcome on board!<br></strong></p>
144
+ <p style="background-color: #ffffff; color: #445566; font-family: helvetica,arial,sans-serif; font-size: 14px; line-height: 22px; padding-left: 20px; padding-right: 20px; text-align: center;">
145
+ <strong>Speed optimization of your WordPress website is highly recommended for SEO. The image compression is one of the tools that help to reduce your page size significantly while preserving the image quality.<br /><br />WP Meta SEO is fully integrated with ImageRecycle service, give a try, you have a free trial with no engagement or just make a test on an image here: <a href="https://www.imagerecycle.com/" target="_blank">www.imagerecycle.com</a><br /><br /></strong>
146
+ ImageRecycle got a dedicated plugin for WordPress that run the images optimization automatically on your website &amp; PDF<br />In order to start the optimization process, please install the WordPress plugin. Enjoy!</p>
147
+ <p></p>
148
+ <p><?php echo $button; ?></p>
149
+ </div>
150
+ </div>
151
+
152
+ <?php endif; ?>
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: JoomUnited
3
  Tags: google, webmaster tools, keywords, meta, meta description, meta keywords, meta title, robots meta, search engine optimization, seo, wordpress seo, yahoo, image optimization, image resize, custom post seo, redirect, redirection, 301, broken link
4
  Requires at least: 4.0
5
- Tested up to: 4.4.2
6
- Stable tag: 2.0.3
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -89,7 +89,8 @@ The redirect manager will help you to fix all types of 404 errors you can encoun
89
  * Custom post type meta edition
90
  * All custom post type and WooCommerce SEO optimization
91
  * Yoast SEO import & sync
92
- * All in one SEO importer and sync
 
93
  * Alexa traffic rank
94
  * Meta content filtering by type
95
  * Optimize images and replace all inside your content
@@ -202,6 +203,9 @@ This manual SEO validation on click on the reload analysis button.
202
 
203
  == Changelog ==
204
 
 
 
 
205
  = 2.0.3 =
206
  * Fix On page analysis return wrong result on header title in content
207
  * Fix Update language on image bluk edit view
@@ -306,10 +310,10 @@ You WON'T lose any SEO content: meta, alt, titles...
306
 
307
  == Requirements ==
308
 
309
- = !!NEW in latest & fresh 1.7 version!! =
310
- Manage link titles from the link manager in the WordPress default editor and from a bulk edition view.
311
- Note that the title attribute does not have direct SEO value for links. Links titles can influence click behavior for users, which may indirectly affect SEO, but it has no direct impact on rankings.
312
- Category view like a blog of a category of posts meta title and description is now automatic taking the category title and description as meta content.
313
 
314
  = SEO vision =
315
 
2
  Contributors: JoomUnited
3
  Tags: google, webmaster tools, keywords, meta, meta description, meta keywords, meta title, robots meta, search engine optimization, seo, wordpress seo, yahoo, image optimization, image resize, custom post seo, redirect, redirection, 301, broken link
4
  Requires at least: 4.0
5
+ Tested up to: 4.5.0
6
+ Stable tag: 2.1.0
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
89
  * Custom post type meta edition
90
  * All custom post type and WooCommerce SEO optimization
91
  * Yoast SEO import & sync
92
+ * All in one SEO importer and sync
93
+ * ImageRecycle image compression integration
94
  * Alexa traffic rank
95
  * Meta content filtering by type
96
  * Optimize images and replace all inside your content
203
 
204
  == Changelog ==
205
 
206
+ = 2.1.0 =
207
+ * Add ImageRecycle images and PDF compression integration (www.imagerecycle.com)
208
+
209
  = 2.0.3 =
210
  * Fix On page analysis return wrong result on header title in content
211
  * Fix Update language on image bluk edit view
310
 
311
  == Requirements ==
312
 
313
+ = !!NEW in latest & fresh 2.1 version!! =
314
+ Speed optimization of your WordPress website is highly recommended for SEO. The image compression is one of the tools that help to reduce your page size significantly while preserving the image quality.
315
+ You can now manage all you images and compression from the ImageRecycle plugin, menu Media > ImageRecycle.
316
+ ImageRecycle got a dedicated plugin for WordPress that run the images optimization automatically on your website & PDF. In order to start the optimization process, please install the WordPress plugin. Enjoy!
317
 
318
  = SEO vision =
319
 
wp-meta-seo.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: WP Meta SEO
5
  * Plugin URI: http://www.joomunited.com/wordpress-products/wp-meta-seo
6
  * Description: WP Meta SEO is a plugin for WordPress to fill meta for content, images and main SEO info in a single view.
7
- * Version: 2.0.3
8
  * Text Domain: wp-meta-seo
9
  * Domain Path: /languages
10
  * Author: JoomUnited
@@ -172,22 +172,33 @@ if (is_admin()) {
172
  $meta_facebook_image = get_post_meta($wp_query->post->ID,'_metaseo_metaopengraph-image',true);
173
 
174
  // check homepage is latest post
175
- if((empty($mpage_for_posts) && empty($mpage_on_front) && $mshow_on_front == 'posts' && is_home()) || (empty($mpage_on_front) && !empty($mpage_for_posts) && $mshow_on_front== 'page' && is_home())){
176
- $settings_title_home = esc_attr($settings['metaseo_title_home']);
177
- $settings_desc_home = esc_attr($settings['metaseo_desc_home']);
178
- if($settings_title_home != maybe_unserialize($settings_title_home)) $settings_title_home = '';
179
- if($settings_desc_home != maybe_unserialize($settings_desc_home)) $settings_desc_home = '';
180
- $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = $settings_title_home;
181
- $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = $settings_desc_home;
182
-
183
- if($settings['metaseo_title_home'] == ''){
184
- $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = esc_attr(get_bloginfo('name').' - '.get_bloginfo('description'));
185
- }
186
-
187
- if($settings['metaseo_desc_home'] == ''){
188
- $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = esc_attr(get_bloginfo('description'));
 
 
 
 
 
189
  }
190
  }
 
 
 
 
 
 
191
 
192
  if ( is_category() || is_tag() || is_tax() ) {
193
  $term = $wp_query->get_queried_object();
@@ -220,7 +231,7 @@ if (is_admin()) {
220
  '#<meta name="twitter:title" [^<>]+ ?>#i',
221
  '<meta name="twitter:title" content="' . $meta_twitter_title . '" />',
222
  ($meta_twitter_title != '' ? true : false)),
223
- '_title' => array('#<title>[^<>]+?<\/title>#i', '<title>' . $meta_title . '</title>',
224
  ($meta_title != '' ? true : false)),
225
  'facebook_admin' => array(
226
  '#<meta property="fb:admins" [^<>]+ ?>#i',
4
  * Plugin Name: WP Meta SEO
5
  * Plugin URI: http://www.joomunited.com/wordpress-products/wp-meta-seo
6
  * Description: WP Meta SEO is a plugin for WordPress to fill meta for content, images and main SEO info in a single view.
7
+ * Version: 2.1.0
8
  * Text Domain: wp-meta-seo
9
  * Domain Path: /languages
10
  * Author: JoomUnited
172
  $meta_facebook_image = get_post_meta($wp_query->post->ID,'_metaseo_metaopengraph-image',true);
173
 
174
  // check homepage is latest post
175
+ if(is_home()){
176
+ if($mshow_on_front == 'posts'){
177
+ $settings_title_home = esc_attr($settings['metaseo_title_home']);
178
+ $settings_desc_home = esc_attr($settings['metaseo_desc_home']);
179
+ if($settings_title_home != maybe_unserialize($settings_title_home)) $settings_title_home = '';
180
+ if($settings_desc_home != maybe_unserialize($settings_desc_home)) $settings_desc_home = '';
181
+ $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = $settings_title_home;
182
+ $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = $settings_desc_home;
183
+
184
+ if($settings['metaseo_title_home'] == ''){
185
+ $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = esc_attr(get_bloginfo('name').' - '.get_bloginfo('description'));
186
+ }
187
+
188
+ if($settings['metaseo_desc_home'] == ''){
189
+ $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = esc_attr(get_bloginfo('description'));
190
+ }
191
+ }elseif($mshow_on_front == 'page'){ // is page posts
192
+ $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = esc_attr(get_post_meta($mpage_for_posts, '_metaseo_metatitle', true));
193
+ $meta_description = $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = esc_attr(get_post_meta($mpage_for_posts, '_metaseo_metadesc', true));
194
  }
195
  }
196
+
197
+ // is front page
198
+ if(is_front_page()){
199
+ $meta_title = $meta_title_esc = $meta_twitter_title = $meta_facebook_title = esc_attr(get_post_meta($mpage_on_front, '_metaseo_metatitle', true));
200
+ $meta_description = $meta_description_esc = $meta_twitter_desc = $meta_facebook_desc = esc_attr(get_post_meta($mpage_on_front, '_metaseo_metadesc', true));
201
+ }
202
 
203
  if ( is_category() || is_tag() || is_tax() ) {
204
  $term = $wp_query->get_queried_object();
231
  '#<meta name="twitter:title" [^<>]+ ?>#i',
232
  '<meta name="twitter:title" content="' . $meta_twitter_title . '" />',
233
  ($meta_twitter_title != '' ? true : false)),
234
+ '_title' => array('/<title.*?\/title>/i', '<title>' . $meta_title . '</title>',
235
  ($meta_title != '' ? true : false)),
236
  'facebook_admin' => array(
237
  '#<meta property="fb:admins" [^<>]+ ?>#i',