WP Meta SEO - Version 1.4.0

Version Description

  • Bulk copy new option: content title to meta title
  • Bulk copy new option: image name to alt text
  • Bulk copy new option: image name to image title
  • Fix twitter card on SEO on page optimization
  • Fix SEO meta empty in some themes
Download this release

Release Info

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

Code changes from version 1.3.0 to 1.4.0

css/metaseo_admin.css CHANGED
@@ -340,7 +340,7 @@ strong {
340
color: #eee;
341
}
342
.note-no-data .col-pad {
343
- background: url("../img/no-data-alert.png") no-repeat scroll 0 50% transparent;
344
display: block;
345
padding-left: 45px;
346
}
340
color: #eee;
341
}
342
.note-no-data .col-pad {
343
+ background: url("../img/loop.png") no-repeat scroll 0 50% transparent;
344
display: block;
345
padding-left: 45px;
346
}
css/style.css CHANGED
@@ -274,4 +274,8 @@ span.hz-loading{
274
275
.metaseo-img-meta{
276
max-width: 100%;
277
}
274
275
.metaseo-img-meta{
276
max-width: 100%;
277
+ }
278
+
279
+ #wp-seo-meta-form #post-query-submit{
280
+ float: left;
281
}
inc/class.metaseo-admin.php CHANGED
@@ -8,12 +8,21 @@ class MetaSeo_Admin {
8
public static $desc_length = 156;
9
public static $title_length = 69;
10
11
function __construct() {
12
$this->settings = array(
13
"metaseo_title_home"=>"",
14
"metaseo_desc_home"=>"",
15
"metaseo_showfacebook"=>"",
16
"metaseo_showtwitter"=>"",
17
"metaseo_showtmetablock"=>0
18
);
19
$settings = get_option( '_metaseo_settings' );
@@ -193,6 +202,7 @@ class MetaSeo_Admin {
193
add_settings_field('metaseo_desc_home', __('Homepage meta description ', 'wpms'), array( $this, 'metaseo_desc_home' ), 'metaseo_settings', 'metaseo_dashboard');
194
add_settings_field('metaseo_showfacebook', __('Facebook profile URL ', 'wpms'), array( $this, 'showfacebook' ), 'metaseo_settings', 'metaseo_dashboard');
195
add_settings_field('metaseo_showtwitter', __('Twitter Username ', 'wpms'), array( $this, 'showtwitter' ), 'metaseo_settings', 'metaseo_dashboard');
196
add_settings_field('metaseo_showtmetablock', __('Meta block edition ', 'wpms'), array( $this, 'showtmetablock' ), 'metaseo_settings', 'metaseo_dashboard');
197
}
198
@@ -237,6 +247,18 @@ class MetaSeo_Admin {
237
echo '<input id="metaseo_showtwitter" name="_metaseo_settings[metaseo_showtwitter]" type="text" value="'.esc_attr( $twitter ).'" size="50"/>';
238
}
239
240
241
private function load_meta_boxes() {
242
if ( in_array( $this->pagenow, array(
@@ -310,12 +332,18 @@ class MetaSeo_Admin {
310
wp_enqueue_script('jquery');
311
312
wp_enqueue_script(
313
- 'wpmetaseoAdmin', plugins_url('js/metaseo_admin.js', dirname(__FILE__)), array('jquery'), '0.1', true
314
);
315
if($current_screen->base == 'toplevel_page_metaseo_dashboard'){
316
- wp_enqueue_script('Chart', plugins_url('js/Chart.js', dirname(__FILE__)), array('jquery'), '0.1', true);
317
- wp_enqueue_script('jquery-knob', plugins_url('js/jquery.knob.js', dirname(__FILE__)), array('jquery'), '0.1', true);
318
- wp_enqueue_script('metaseo-dashboard', plugins_url('js/dashboard.js', dirname(__FILE__)), array('jquery'), '0.1', true);
319
wp_enqueue_style('chart', plugins_url('/css/chart.css', dirname(__FILE__) ) );
320
wp_enqueue_style('metaseo-quirk', plugins_url('/css/metaseo-quirk.css', dirname(__FILE__) ) );
321
}
@@ -328,6 +356,12 @@ class MetaSeo_Admin {
328
array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
329
}
330
331
/**
332
* Load additional admin stylesheets
333
* of jquery-ui
@@ -439,6 +473,201 @@ class MetaSeo_Admin {
439
break;
440
}
441
}
442
}
443
444
private function ajaxHandle(){
@@ -451,6 +680,9 @@ class MetaSeo_Admin {
451
//
452
add_action( 'wp_ajax_import_meta_data', array('MetaSeo_Content_List_Table', 'importMetaData') );
453
add_action( 'wp_ajax_dismiss_import_meta', array('MetaSeo_Content_List_Table', 'dismissImport') );
454
//
455
add_action( 'added_post_meta' , array( 'MetaSeo_Content_List_Table', 'updateMetaSync' ), 99, 4);
456
add_action( 'updated_post_meta', array( 'MetaSeo_Content_List_Table', 'updateMetaSync' ), 99, 4);
8
public static $desc_length = 156;
9
public static $title_length = 69;
10
11
+ public static $metaseo_twitter_card = array(
12
+ 'summary' => '',
13
+ 'summary_large_image' => '',
14
+ );
15
+
16
function __construct() {
17
+ self::$metaseo_twitter_card['summary'] = __( 'Summary', 'wpms' );
18
+ self::$metaseo_twitter_card['summary_large_image'] = __( 'Summary with large image', 'wpms' );
19
+
20
$this->settings = array(
21
"metaseo_title_home"=>"",
22
"metaseo_desc_home"=>"",
23
"metaseo_showfacebook"=>"",
24
"metaseo_showtwitter"=>"",
25
+ "metaseo_twitter_card"=>"summary",
26
"metaseo_showtmetablock"=>0
27
);
28
$settings = get_option( '_metaseo_settings' );
202
add_settings_field('metaseo_desc_home', __('Homepage meta description ', 'wpms'), array( $this, 'metaseo_desc_home' ), 'metaseo_settings', 'metaseo_dashboard');
203
add_settings_field('metaseo_showfacebook', __('Facebook profile URL ', 'wpms'), array( $this, 'showfacebook' ), 'metaseo_settings', 'metaseo_dashboard');
204
add_settings_field('metaseo_showtwitter', __('Twitter Username ', 'wpms'), array( $this, 'showtwitter' ), 'metaseo_settings', 'metaseo_dashboard');
205
+ add_settings_field('metaseo_twitter_card', __('The default card type to use ', 'wpms'), array( $this, 'showtwittercard' ), 'metaseo_settings', 'metaseo_dashboard');
206
add_settings_field('metaseo_showtmetablock', __('Meta block edition ', 'wpms'), array( $this, 'showtmetablock' ), 'metaseo_settings', 'metaseo_dashboard');
207
}
208
247
echo '<input id="metaseo_showtwitter" name="_metaseo_settings[metaseo_showtwitter]" type="text" value="'.esc_attr( $twitter ).'" size="50"/>';
248
}
249
250
+ public function showtwittercard(){
251
+ $twitter_card = isset( $this->settings['metaseo_twitter_card'] ) ? $this->settings['metaseo_twitter_card'] : 'summary';
252
+ echo '<select class="select" name="_metaseo_settings[metaseo_twitter_card]" id="metaseo_twitter_card">';
253
+ foreach (self::$metaseo_twitter_card as $k => $v){
254
+ if($twitter_card == $k){
255
+ echo '<option selected value="'.$k.'">'.$v.'</option>';
256
+ }else{
257
+ echo '<option value="'.$k.'">'.$v.'</option>';
258
+ }
259
+ }
260
+ echo '</select>';
261
+ }
262
263
private function load_meta_boxes() {
264
if ( in_array( $this->pagenow, array(
332
wp_enqueue_script('jquery');
333
334
wp_enqueue_script(
335
+ 'wpmetaseoAdmin', plugins_url('js/metaseo_admin.js', dirname(__FILE__)), array('jquery'), WPMSEO_VERSION, true
336
);
337
+
338
+ if($current_screen->base == 'wp-meta-seo_page_metaseo_image_meta' || $current_screen->base == 'wp-meta-seo_page_metaseo_content_meta'){
339
+ wp_enqueue_script('wpms-bulk', plugins_url('js/wpms-bulk-action.js', dirname(__FILE__)), array('jquery'), WPMSEO_VERSION, true);
340
+ wp_localize_script('wpms-bulk', 'wpmseobulkL10n', $this->meta_seo_localize_script());
341
+ }
342
+
343
if($current_screen->base == 'toplevel_page_metaseo_dashboard'){
344
+ wp_enqueue_script('Chart', plugins_url('js/Chart.js', dirname(__FILE__)), array('jquery'), WPMSEO_VERSION, true);
345
+ wp_enqueue_script('jquery-knob', plugins_url('js/jquery.knob.js', dirname(__FILE__)), array('jquery'), WPMSEO_VERSION, true);
346
+ wp_enqueue_script('metaseo-dashboard', plugins_url('js/dashboard.js', dirname(__FILE__)), array('jquery'), WPMSEO_VERSION, true);
347
wp_enqueue_style('chart', plugins_url('/css/chart.css', dirname(__FILE__) ) );
348
wp_enqueue_style('metaseo-quirk', plugins_url('/css/metaseo-quirk.css', dirname(__FILE__) ) );
349
}
356
array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
357
}
358
359
+ public function meta_seo_localize_script() {
360
+ return array(
361
+ 'metaseo_message_false_copy' => __( 'We didn\'t find any element to apply a batch copy, congrats!', 'wpms' ),
362
+ );
363
+ }
364
+
365
/**
366
* Load additional admin stylesheets
367
* of jquery-ui
473
break;
474
}
475
}
476
+ }
477
+
478
+ function wpms_bulk_image_copy(){
479
+ global $wpdb;
480
+ if(empty($_POST['mtype'])) wp_send_json (false);
481
+ if(isset($_POST['sl_bulk']) && $_POST['sl_bulk'] == 'all'){
482
+ // select all
483
+ $limit = 500;
484
+ // check image alt and title empty
485
+ $margs = array(
486
+ 'posts_per_page' => -1,'post_type' => 'attachment','post_status' => 'any',
487
+ 'meta_query' => array(
488
+ 'relation' => 'OR',
489
+ array(
490
+ 'key' => '_wp_attachment_image_alt',
491
+ 'compare' => 'NOT EXISTS',
492
+ ),
493
+ array(
494
+ 'key' => '_wp_attachment_image_alt',
495
+ 'value' => false,
496
+ 'type' => 'BOOLEAN'
497
+ ),
498
+ ));
499
+
500
+ $m_newquery = new WP_Query( $margs );
501
+ $mposts_empty_alt = $m_newquery->get_posts();
502
+ $check_title = $wpdb->get_var("SELECT COUNT(posts.ID) as total FROM ".$wpdb->prefix."posts as posts WHERE posts.post_type = 'attachment' AND post_title = ''");
503
+
504
+ switch ($_POST['mtype']){
505
+ case 'image_alt':
506
+ if(count($mposts_empty_alt) == 0 ) wp_send_json (false);
507
+ break;
508
+
509
+ case 'image_title':
510
+ if($check_title == 0) wp_send_json (false);
511
+ break;
512
+ }
513
+
514
+ // query attachment and update meta
515
+ $total = $wpdb->get_var("SELECT COUNT(posts.ID) as total FROM ".$wpdb->prefix."posts as posts WHERE posts.post_type = 'attachment'");
516
+
517
+ $j = ceil((int)$total/$limit);
518
+ for($i = 0;$i<=$j; $i++){
519
+ $ofset = $i*$limit;
520
+ $attachments = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."posts as posts
521
+ WHERE posts.post_type = 'attachment' LIMIT $limit OFFSET $ofset");
522
+
523
+ foreach ($attachments as $attachment){
524
+ $i_info_url = pathinfo($attachment->guid);
525
+ $i_alt = get_post_meta($attachment->ID,'_wp_attachment_image_alt',true);
526
+
527
+ switch ($_POST['mtype']){
528
+ case 'image_alt':
529
+ if($i_alt == ''){
530
+ update_post_meta($attachment->ID , '_wp_attachment_image_alt',$i_info_url['filename']);
531
+ }
532
+ break;
533
+
534
+ case 'image_title':
535
+ if($attachment->post_title == ''){
536
+ wp_update_post(array('ID' => $attachment->ID,'post_title' => $i_info_url['filename']));
537
+ }
538
+ break;
539
+ }
540
+ }
541
+ }
542
+
543
+ wp_send_json(true);
544
+
545
+ }else{
546
+ // selected
547
+ if(isset($_POST['ids'])){
548
+ $ids = $_POST['ids'];
549
+ $margs = array(
550
+ 'posts_per_page' => -1,
551
+ 'post_type' => 'attachment',
552
+ 'post_status' => 'any',
553
+ 'post__in' => $ids,
554
+ 'meta_query' => array(
555
+ 'relation' => 'OR',
556
+ array(
557
+ 'key' => '_wp_attachment_image_alt',
558
+ 'compare' => 'NOT EXISTS',
559
+ ),
560
+ array(
561
+ 'key' => '_wp_attachment_image_alt',
562
+ 'value' => false,
563
+ 'type' => 'BOOLEAN'
564
+ ),
565
+ ));
566
+
567
+ $query = "SELECT *
568
+ FROM $wpdb->posts
569
+ WHERE `post_type` = 'attachment'
570
+ AND `post_mime_type` LIKE '%image%'
571
+ AND `post_title` = ''
572
+ AND `ID` IN (". implode(',', $ids).")
573
+ ";
574
+
575
+ $m_newquery = new WP_Query( $margs );
576
+ $mposts_empty_alt = $m_newquery->get_posts();
577
+ $mposts_empty_title = $wpdb->get_results($query);
578
+
579
+ switch ($_POST['mtype']){
580
+ case 'image_alt':
581
+ if(!empty($mposts_empty_alt)){
582
+ foreach ($mposts_empty_alt as $post){
583
+ $i_info_url = pathinfo($post->guid);
584
+ update_post_meta($post->ID , '_wp_attachment_image_alt',$i_info_url['filename']);
585
+ }
586
+ }else{
587
+ wp_send_json(false);
588
+ }
589
+ break;
590
+
591
+ case 'image_title':
592
+ if(!empty($mposts_empty_title)){
593
+ foreach ($mposts_empty_title as $post){
594
+ $i_info_url = pathinfo($post->guid);
595
+ wp_update_post(array('ID' => $post->ID,'post_title' => $i_info_url['filename']));
596
+ }
597
+ }else{
598
+ wp_send_json(false);
599
+ }
600
+ break;
601
+ }
602
+ wp_send_json(true);
603
+
604
+ }else{
605
+ wp_send_json(false);
606
+ }
607
+ }
608
+
609
+
610
+ }
611
+
612
+ function wpms_bulk_post_copy_title(){
613
+ $post_types = get_post_types( array('public' => true, 'exclude_from_search' => false) ) ;
614
+ unset($post_types['attachment']);
615
+ if(isset($_POST['sl_bulk']) && $_POST['sl_bulk'] == 'all'){
616
+ $margs = array(
617
+ 'posts_per_page' => -1,
618
+ 'post_type' => $post_types,
619
+ 'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash') ,
620
+ 'meta_query' => array(
621
+ 'relation' => 'OR',
622
+ array(
623
+ 'key' => '_metaseo_metatitle',
624
+ 'compare' => 'NOT EXISTS',
625
+ ),
626
+ array(
627
+ 'key' => '_metaseo_metatitle',
628
+ 'value' => false,
629
+ 'type' => 'BOOLEAN'
630
+ ),
631
+ ));
632
+ }else{
633
+ if(isset($_POST['ids'])){
634
+ $ids = $_POST['ids'];
635
+ $margs = array(
636
+ 'posts_per_page' => -1,
637
+ 'post_type' => $post_types,
638
+ 'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash') ,
639
+ 'post__in' => $ids,
640
+ 'meta_query' => array(
641
+ 'relation' => 'OR',
642
+ array(
643
+ 'key' => '_metaseo_metatitle',
644
+ 'compare' => 'NOT EXISTS',
645
+ ),
646
+ array(
647
+ 'key' => '_metaseo_metatitle',
648
+ 'value' => false,
649
+ 'type' => 'BOOLEAN'
650
+ ),
651
+ ));
652
+ }else{
653
+ wp_send_json(false);
654
+ }
655
+
656
+ }
657
+
658
+ $m_newquery = new WP_Query( $margs );
659
+ $mposts = $m_newquery->get_posts();
660
+ if(!empty($mposts)){
661
+ foreach ($mposts as $post){
662
+ update_post_meta($post->ID , '_metaseo_metatitle',$post->post_title);
663
+ }
664
+ wp_send_json(true);
665
+ }else{
666
+
667
+ wp_send_json(false);
668
+ }
669
+
670
+
671
}
672
673
private function ajaxHandle(){
680
//
681
add_action( 'wp_ajax_import_meta_data', array('MetaSeo_Content_List_Table', 'importMetaData') );
682
add_action( 'wp_ajax_dismiss_import_meta', array('MetaSeo_Content_List_Table', 'dismissImport') );
683
+ add_action('wp_ajax_wpms_bulk_post_copy',array($this,'wpms_bulk_post_copy_title'));
684
+ add_action('wp_ajax_wpms_bulk_image_copy',array($this,'wpms_bulk_image_copy'));
685
+
686
//
687
add_action( 'added_post_meta' , array( 'MetaSeo_Content_List_Table', 'updateMetaSync' ), 99, 4);
688
add_action( 'updated_post_meta', array( 'MetaSeo_Content_List_Table', 'updateMetaSync' ), 99, 4);
inc/class.metaseo-content-list-table.php CHANGED
@@ -90,7 +90,6 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
90
}
91
92
function extra_tablenav($which) {
93
-
94
#if ('top' == $which) {
95
echo '<div class="alignleft actions">';
96
global $wpdb;
@@ -113,15 +112,13 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
113
$obj = get_post_type_object($post_type->post_type);
114
$options .= sprintf('<option value="%2$s" %3$s>%1$s</option>', $obj->labels->name, $post_type->post_type, selected($selected, $post_type->post_type, false));
115
}
116
-
117
- if($which=='top') {
118
- echo sprintf('<select name="post_type_filter" class="metaseo-filter">%1$s</select>', $options);
119
- submit_button(__('Filter'), 'button', 'do_filter', false, array('id' => 'post-query-submit'));
120
- }else{
121
- echo sprintf('<select name="post_type_filter" class="metaseo-filter">%1$s</select>', $options);
122
- submit_button(__('Filter'), 'button', 'do_filter', false, array('id' => 'post-query-submit'));
123
- }
124
125
echo "</div>";
126
#echo "</form>";
127
#}
@@ -129,6 +126,7 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
129
130
function get_columns() {
131
return $columns = array(
132
'col_id' => __('', 'wpms'),
133
'col_title' => __('Title', 'wpms'),
134
'col_meta_title' => __('Meta Title', 'wpms'),
@@ -256,14 +254,13 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
256
}
257
258
function display_rows() {
259
-
260
$records = $this->items;
261
$i = 0;
262
$alternate = "";
263
$url = preg_replace('/(http|https):\/\/[w]*[.]?/', '', network_site_url('/'));
264
265
list( $columns, $hidden ) = $this->get_column_info();
266
-
267
if (!empty($records)) {
268
foreach ($records as $rec) {
269
$alternate = 'alternate' == $alternate ? '' : 'alternate';
@@ -285,6 +282,13 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
285
$attributes = $class . $style;
286
287
switch ($column_name) {
288
case 'col_id':
289
echo '<td class="col_id" >';
290
echo $i;
@@ -378,6 +382,7 @@ class MetaSeo_Content_List_Table extends WP_List_Table {
378
}
379
380
function process_action() {
381
$current_url = set_url_scheme('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
382
$redirect = false;
383
90
}
91
92
function extra_tablenav($which) {
93
#if ('top' == $which) {
94
echo '<div class="alignleft actions">';
95
global $wpdb;
112
$obj = get_post_type_object($post_type->post_type);
113
$options .= sprintf('<option value="%2$s" %3$s>%1$s</option>', $obj->labels->name, $post_type->post_type, selected($selected, $post_type->post_type, false));
114
}
115
116
+ $sl_bulk = '<select name="mbulk_copy" class="mbulk_copy"><option value="0">'.__('Bulk Copy','wpms').'</option><option value="all">'.__('All Posts','wpms').'</option><option value="bulk-copy-metatitle">'.__('Selected posts','wpms').'</option></select>';
117
+ $btn_bulk = '<input type="button" name="do_copy" id="post_do_copy" class="button button-primary btn_do_copy post_do_copy" value="'.__('Content title as meta title','wpms').'"><span class="spinner"></span>';
118
+
119
+ echo sprintf('<select name="post_type_filter" class="metaseo-filter">%1$s</select>', $options);
120
+ submit_button(__('Filter'), 'button', 'do_filter', false, array('id' => 'post-query-submit'));
121
+ echo $sl_bulk . $btn_bulk;
122
echo "</div>";
123
#echo "</form>";
124
#}
126
127
function get_columns() {
128
return $columns = array(
129
+ 'cb' => '<input id="cb-select-all-1" type="checkbox" style="margin:0">',
130
'col_id' => __('', 'wpms'),
131
'col_title' => __('Title', 'wpms'),
132
'col_meta_title' => __('Meta Title', 'wpms'),
254
}
255
256
function display_rows() {
257
$records = $this->items;
258
$i = 0;
259
$alternate = "";
260
$url = preg_replace('/(http|https):\/\/[w]*[.]?/', '', network_site_url('/'));
261
262
list( $columns, $hidden ) = $this->get_column_info();
263
+
264
if (!empty($records)) {
265
foreach ($records as $rec) {
266
$alternate = 'alternate' == $alternate ? '' : 'alternate';
282
$attributes = $class . $style;
283
284
switch ($column_name) {
285
+ case 'cb':
286
+ echo '<th scope="row" class="check-column">';
287
+ echo '<input id="cb-select-1" class="metaseo_post" type="checkbox" name="post[]" value="'.$rec->ID.'">';
288
+ echo '</th>';
289
+
290
+ break;
291
+
292
case 'col_id':
293
echo '<td class="col_id" >';
294
echo $i;
382
}
383
384
function process_action() {
385
+
386
$current_url = set_url_scheme('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
387
$redirect = false;
388
inc/class.metaseo-dashboard.php CHANGED
@@ -182,7 +182,7 @@ class MetaSeo_Dashboard {
182
}
183
184
$html = trim($tmp_dom->saveHTML());
185
- $html = str_replace('We don\'t have', 'Alexa doesn\'t has', $html);
186
$html = str_replace('Get Certified', '', $html);
187
$html = str_replace('"/topsites/countries', '"http://www.alexa.com/topsites/countries', $html);
188
return $html;
182
}
183
184
$html = trim($tmp_dom->saveHTML());
185
+ $html = str_replace('We don\'t have', __('Alexa doesn\'t have','wpms'), $html);
186
$html = str_replace('Get Certified', '', $html);
187
$html = str_replace('"/topsites/countries', '"http://www.alexa.com/topsites/countries', $html);
188
return $html;
inc/class.metaseo-image-list-table.php CHANGED
@@ -38,7 +38,18 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
38
<?php $this->months_fillter('attachment','sldate1','filter_date_action'); ?>
39
</div>
40
<?php endif ?>
41
-
42
<input type="hidden" name="page" value="metaseo_image_meta" />
43
<?php if (!empty($_REQUEST['post_status'])): ?>
44
<input type="hidden" name="post_status" value="<?php echo esc_attr($_REQUEST['post_status']); ?>" />
@@ -103,7 +114,7 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
103
104
function extra_tablenav($which) {
105
106
- #if ('top' == $which) {
107
echo '<div class="alignleft actions">';
108
global $wpdb;
109
@@ -125,7 +136,7 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
125
$obj = get_post_type_object($post_type->post_type);
126
$options .= sprintf('<option value="%2$s" %3$s>%1$s</option>', $obj->labels->name, $post_type->post_type, selected($selected, $post_type->post_type, false));
127
}
128
-
129
echo "</div>";
130
#echo "</form>";
131
#}
@@ -133,6 +144,7 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
133
134
function get_columns() {
135
return $columns = array(
136
'col_id' => __('ID', 'wpms'),
137
'col_image' => __('Image', 'wpms'),
138
'col_image_name' => __('Name', 'wpms'),
@@ -179,7 +191,7 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
179
if ( ! empty( $columns['cb'] ) ) {
180
static $cb_counter = 1;
181
$columns['cb'] = '<label class="screen-reader-text" for="cb-select-all-' . $cb_counter . '">' . __( 'Select All' ) . '</label>'
182
- . '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" />';
183
$cb_counter++;
184
}
185
@@ -227,9 +239,11 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
227
elseif($column_key === 'col_image_info'){
228
echo "<th scope='col' $id $class $style colspan=\"5\">$column_display_name</th>";
229
}
230
- else{
231
- echo "<th scope='col' $id $class $style colspan=\"3\">$column_display_name</th>";
232
- }
233
}
234
}
235
@@ -432,7 +446,6 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
432
}
433
434
echo '<tr id="record_' . $rec->ID . '" class="' . $classes . '" >';
435
-
436
foreach ($columns as $column_name => $column_display_name) {
437
438
$class = sprintf('class="%1$s column-%1$s"', $column_name);
@@ -445,6 +458,12 @@ class MetaSeo_Image_List_Table extends WP_List_Table {
445
$attributes = $class . $style;
446
447
switch ($column_name) {
448
case 'col_id':
449
echo '<td class="col_id" colspan="1">';
450
echo $i;
38
<?php $this->months_fillter('attachment','sldate1','filter_date_action'); ?>
39
</div>
40
<?php endif ?>
41
+
42
+ <div class="alignleft">
43
+ <select name="image_mbulk_copy" class="mbulk_copy">
44
+ <option value="0"><?php _e('Bulk Copy','wpms') ?></option>
45
+ <option value="all"><?php _e('All Images','wpms') ?></option>
46
+ <option value="bulk-copy-title-alt"><?php _e('Selected images','wpms') ?></option>
47
+ </select>
48
+ <input type="button" name="image_do_copy_alt" class="button button-primary btn_do_copy image_do_copy_alt" value="<?php _e('Image name as alt text','wpms') ?>">
49
+ <input type="button" name="image_do_copy_title" class="button button-primary btn_do_copy image_do_copy_title" value="<?php _e('Image name as image title','wpms') ?>">
50
+ <span class="spinner"></span>
51
+ </div>
52
+
53
<input type="hidden" name="page" value="metaseo_image_meta" />
54
<?php if (!empty($_REQUEST['post_status'])): ?>
55
<input type="hidden" name="post_status" value="<?php echo esc_attr($_REQUEST['post_status']); ?>" />
114
115
function extra_tablenav($which) {
116
117
+ #if ('top' == $which) {
118
echo '<div class="alignleft actions">';
119
global $wpdb;
120
136
$obj = get_post_type_object($post_type->post_type);
137
$options .= sprintf('<option value="%2$s" %3$s>%1$s</option>', $obj->labels->name, $post_type->post_type, selected($selected, $post_type->post_type, false));
138
}
139
+
140
echo "</div>";
141
#echo "</form>";
142
#}
144
145
function get_columns() {
146
return $columns = array(
147
+ 'cb' => '<input id="cb-select-all-1" type="checkbox">',
148
'col_id' => __('ID', 'wpms'),
149
'col_image' => __('Image', 'wpms'),
150
'col_image_name' => __('Name', 'wpms'),
191
if ( ! empty( $columns['cb'] ) ) {
192
static $cb_counter = 1;
193
$columns['cb'] = '<label class="screen-reader-text" for="cb-select-all-' . $cb_counter . '">' . __( 'Select All' ) . '</label>'
194
+ . '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" style="margin:0;" />';
195
$cb_counter++;
196
}
197
239
elseif($column_key === 'col_image_info'){
240
echo "<th scope='col' $id $class $style colspan=\"5\">$column_display_name</th>";
241
}
242
+ elseif($column_key === 'cb'){
243
+ echo "<th scope='col' $id $class style='padding:8px 10px;'>$column_display_name</th>";
244
+ }else{
245
+ echo "<th scope='col' $id $class $style colspan=\"3\">$column_display_name</th>";
246
+ }
247
}
248
}
249
446
}
447
448
echo '<tr id="record_' . $rec->ID . '" class="' . $classes . '" >';
449
foreach ($columns as $column_name => $column_display_name) {
450
451
$class = sprintf('class="%1$s column-%1$s"', $column_name);
458
$attributes = $class . $style;
459
460
switch ($column_name) {
461
+ case 'cb':
462
+ echo '<td scope="row" class="check-column" style="padding:8px 10px;">';
463
+ echo '<input id="cb-select-1" class="metaseo_post" type="checkbox" name="post[]" value="'.$rec->ID.'">';
464
+ echo '</td>';
465
+ break;
466
+
467
case 'col_id':
468
echo '<td class="col_id" colspan="1">';
469
echo $i;
inc/class.metaseo-metabox.php CHANGED
@@ -167,23 +167,16 @@ class WPMSEO_Metabox extends WPMSEO_Meta {
167
$cached_replacement_vars = array();
168
169
$vars_to_cache = array(
170
- 'date',
171
- 'id',
172
- 'sitename',
173
'sitedesc',
174
'sep',
175
'page',
176
- 'currenttime',
177
- 'currentdate',
178
- 'currentday',
179
- 'currentmonth',
180
- 'currentyear',
181
);
182
-
183
foreach ($vars_to_cache as $var) {
184
$cached_replacement_vars[$var] = $var;
185
}
186
-
187
return array_merge($cached_replacement_vars, array(
188
'field_prefix' => self::$form_prefix,
189
'choose_image' => __('Use Image', 'wpms'),
167
$cached_replacement_vars = array();
168
169
$vars_to_cache = array(
170
'sitedesc',
171
'sep',
172
'page',
173
);
174
+
175
foreach ($vars_to_cache as $var) {
176
$cached_replacement_vars[$var] = $var;
177
}
178
+
179
+ $cached_replacement_vars['sitename'] = get_option('blogname');
180
return array_merge($cached_replacement_vars, array(
181
'field_prefix' => self::$form_prefix,
182
'choose_image' => __('Use Image', 'wpms'),
js/dashboard-chart.js DELETED
@@ -1,84 +0,0 @@
1
- function optimizationChecking(call_back) {
2
- var ret;
3
- jQuery.ajax({
4
- url: myAjax.ajax_url,
5
- async: false,
6
- type: 'post',
7
- data: {'action': 'opt_checking'},
8
- dataType: 'json',
9
- beforeSend: function() {
10
- },
11
- success: function(response) {
12
- ret = response;
13
- for (sid in response) {
14
- jQuery('#' + sid).removeClass('hz-loading').text(response[sid][0] + '/' + response[sid][1]);
15
- }
16
- if (typeof (call_back) == "function") {
17
- call_back(response);
18
- }
19
- },
20
- error: function() {
21
-
22
- }
23
-
24
- });
25
-
26
- return ret;
27
- }
28
-
29
-
30
- function drawChart(metacontent,notmetacontent, imagemeta,notimagemeta, imageoptimi,notimageoptimi) {
31
-
32
- var doughnutData = [
33
- {
34
- value: metacontent,
35
- color: "rgba(92,155,213,1)",
36
- highlight: "#5c9bd5",
37
- label: "Content Meta- Completed"
38
- },
39
- {
40
- value: notmetacontent,
41
- color: "#CECECE",
42
- label: "Content Meta- Imcompleted"
43
- },
44
- {
45
- value: imagemeta,
46
- color: "rgba(241,145,79,1)",
47
- highlight: "#ed7d31",
48
- label: "Image Meta - Completed"
49
- },
50
- {
51
- value: notimagemeta,
52
- color: "#CECECE",
53
- label: "Image Meta - Imcompleted"
54
- },
55
-
56
- {
57
- value: imageoptimi,
58
- color: "rgba(70,191,189,1)",
59
- highlight: "#46BFBD",
60
- label: "Image Optimized"
61
- },
62
- {
63
- value: notimageoptimi,
64
- color: "#CECECE",
65
- label: "Image not Optimized"
66
- }
67
-
68
-
69
- ];
70
-
71
- var ctx = document.getElementById("chart-area").getContext("2d");
72
- window.myDoughnut = new Chart(ctx).Doughnut(doughnutData, {
73
- responsive: true,
74
- tooltipTitleFontSize: 13,
75
- tooltipXOffset: 5,
76
- tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= ((value*3) %1 !=0)?(value*3).toFixed(2):(value*3) %> %",
77
- percentageInnerCutout: 70,
78
- scaleShowLabels: true,
79
- segmentShowStroke : false,
80
-
81
- });
82
-
83
-
84
- }
js/metaseo_admin.js CHANGED
@@ -655,6 +655,15 @@ jQuery(document).ready(function($) {
655
}
656
});
657
});
658
659
$('.metaseo-img-name').bind('input propertychange', function() {
660
var savedInfo = $(this).parent().find('span.saved-info');
655
}
656
});
657
});
658
+
659
+ $('.mbulk_copy').bind('change', function(){
660
+ var value = $(this).val();
661
+ $('.mbulk_copy').each(function(i,e){
662
+ if($(e).val() != value){
663
+ $(e).val(value);
664
+ }
665
+ });
666
+ });
667
668
$('.metaseo-img-name').bind('input propertychange', function() {
669
var savedInfo = $(this).parent().find('span.saved-info');
js/wp-metaseo-metabox.js CHANGED
@@ -27,16 +27,8 @@ function msReplaceVariables(str, callback) {
27
str = str.replace(/%%sitedesc%%/g, wpmseoMetaboxL10n.sitedesc);
28
str = str.replace(/%%sitename%%/g, wpmseoMetaboxL10n.sitename);
29
str = str.replace(/%%sep%%/g, wpmseoMetaboxL10n.sep);
30
- str = str.replace(/%%date%%/g, wpmseoMetaboxL10n.date);
31
- str = str.replace(/%%id%%/g, wpmseoMetaboxL10n.id);
32
str = str.replace(/%%page%%/g, wpmseoMetaboxL10n.page);
33
- str = str.replace(/%%currenttime%%/g, wpmseoMetaboxL10n.currenttime);
34
- str = str.replace(/%%currentdate%%/g, wpmseoMetaboxL10n.currentdate);
35
- str = str.replace(/%%currentday%%/g, wpmseoMetaboxL10n.currentday);
36
- str = str.replace(/%%currentmonth%%/g, wpmseoMetaboxL10n.currentmonth);
37
- str = str.replace(/%%currentyear%%/g, wpmseoMetaboxL10n.currentyear);
38
-
39
- // str = str.replace(/%%mfocuskw%%/g, jQuery('#metaseo_wpmseo_mfocuskw').val().replace(/(<([^>]+)>)/ig, ''));
40
// excerpt
41
var excerpt = '';
42
if (jQuery('#excerpt').length) {
27
str = str.replace(/%%sitedesc%%/g, wpmseoMetaboxL10n.sitedesc);
28
str = str.replace(/%%sitename%%/g, wpmseoMetaboxL10n.sitename);
29
str = str.replace(/%%sep%%/g, wpmseoMetaboxL10n.sep);
30
str = str.replace(/%%page%%/g, wpmseoMetaboxL10n.page);
31
+
32
// excerpt
33
var excerpt = '';
34
if (jQuery('#excerpt').length) {
js/wpms-bulk-action.js ADDED
@@ -0,0 +1,60 @@
1
+ jQuery(document).ready(function ($) {
2
+
3
+ $('.tablenav.top #post-query-submit , .tablenav.bottom #post-query-submit').click(function (e) {
4
+ if ($('.metaseo-filter').val() == 'bulk-copy-metatitle') {
5
+ e.preventDefault();
6
+ $('#bulk-copy-metatitle').show();
7
+ }
8
+ });
9
+
10
+ $('.btn_do_copy').click(function (e) {
11
+ var $this = $(this);
12
+ var sl_bulk = $('.mbulk_copy').val();
13
+ if (sl_bulk == 0)
14
+ return;
15
+
16
+ var mpost_selected = [];
17
+ if (sl_bulk != 'all') {
18
+ $(".metaseo_post").each(function (index) {
19
+ if ($(this).is(':checked')) {
20
+ mpost_selected.push($(this).val());
21
+ }
22
+ });
23
+ }
24
+
25
+ if ($this.hasClass('post_do_copy')) {
26
+ var maction = 'wpms_bulk_post_copy';
27
+ var mtype = 'post_title';
28
+ } else {
29
+ var maction = 'wpms_bulk_image_copy';
30
+ if($this.hasClass('image_do_copy_alt')){
31
+ var mtype = 'image_alt';
32
+ }else{
33
+ var mtype = 'image_title';
34
+ }
35
+ }
36
+
37
+ $this.closest('.tablenav').find('.spinner').show().css('visibility', 'visible');
38
+ $.ajax({
39
+ url: ajaxurl,
40
+ method: 'POST',
41
+ dataType: 'json',
42
+ data: {
43
+ action: maction,
44
+ ids: mpost_selected,
45
+ sl_bulk: sl_bulk,
46
+ mtype:mtype
47
+ },
48
+ success: function (res) {
49
+ if (res == true) {
50
+ window.location.assign(document.URL);
51
+ } else {
52
+ alert(wpmseobulkL10n.metaseo_message_false_copy);
53
+ }
54
+ $this.closest('.tablenav').find('.spinner').hide();
55
+ }
56
+
57
+ });
58
+ });
59
+
60
+ });
languages/wpms-en_GB.mo CHANGED
Binary file
languages/wpms-en_GB.po CHANGED
@@ -9,7 +9,7 @@ msgstr ""
9
"MIME-Version: 1.0\n"
10
"Content-Type: text/plain; charset=UTF-8\n"
11
"Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.5\n"
13
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
14
15
msgid "Twitter username (without @)"
@@ -378,6 +378,60 @@ msgstr "Homepage meta title "
378
msgid "Homepage meta description "
379
msgstr "Homepage meta description "
380
381
#~ msgid ""
382
#~ " This is a rendering of what this content might looks like in Google's "
383
#~ "search results."
9
"MIME-Version: 1.0\n"
10
"Content-Type: text/plain; charset=UTF-8\n"
11
"Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.7.4\n"
13
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
14
15
msgid "Twitter username (without @)"
378
msgid "Homepage meta description "
379
msgstr "Homepage meta description "
380
381
+ msgid "Bulk Copy"
382
+ msgstr "Bulk Copy"
383
+
384
+ msgid "All Posts"
385
+ msgstr "All Posts"
386
+
387
+ msgid "Selected posts"
388
+ msgstr "Selected posts"
389
+
390
+ msgid "Content title as meta title"
391
+ msgstr "Content title as meta title"
392
+
393
+ msgid "All Images"
394
+ msgstr "All Images"
395
+
396
+ msgid "Selected images"
397
+ msgstr "Selected images"
398
+
399
+ msgid "Image name as alt text"
400
+ msgstr "Image name as alt text"
401
+
402
+ msgid "Image name as image title"
403
+ msgstr "Image name as image title"
404
+
405
+ msgid "We didn't find any element to apply a batch copy, congrats!"
406
+ msgstr "We didn't find any element to apply a batch copy, congrats!"
407
+
408
+ msgid "The default card type to use "
409
+ msgstr "The default card type to use "
410
+
411
+ msgid "Summary"
412
+ msgstr "Summary"
413
+
414
+ msgid "Summary with large image"
415
+ msgstr "Summary with large image"
416
+
417
+ msgid "Optimized at"
418
+ msgstr "Optimized at"
419
+
420
+ msgid "Wrong resized images"
421
+ msgstr "Wrong resized images"
422
+
423
+ msgid "Latest month new or updated content"
424
+ msgstr "Latest month new or updated content"
425
+
426
+ msgid "Image data filled (in content)"
427
+ msgstr "Image data filled (in content)"
428
+
429
+ msgid "More information about WP Meta SEO"
430
+ msgstr "More information about WP Meta SEO"
431
+
432
+ msgid "Other plugins from JoomUnited"
433
+ msgstr "Other plugins from JoomUnited"
434
+
435
#~ msgid ""
436
#~ " This is a rendering of what this content might looks like in Google's "
437
#~ "search results."
languages/wpms-fr_FR.mo CHANGED
Binary file
languages/wpms-fr_FR.po CHANGED
@@ -9,7 +9,7 @@ msgstr ""
9
"Content-Type: text/plain; charset=UTF-8\n"
10
"Content-Transfer-Encoding: 8bit\n"
11
"Language: fr_FR\n"
12
- "X-Generator: Poedit 1.8.5\n"
13
14
msgid "Twitter username (without @)"
15
msgstr "ID Twitter (sans le @)"
@@ -316,3 +316,57 @@ msgstr "Meta info page d'accueil"
316
317
msgid "Homepage meta description "
318
msgstr "Description page d'accueil"
9
"Content-Type: text/plain; charset=UTF-8\n"
10
"Content-Transfer-Encoding: 8bit\n"
11
"Language: fr_FR\n"
12
+ "X-Generator: Poedit 1.7.4\n"
13
14
msgid "Twitter username (without @)"
15
msgstr "ID Twitter (sans le @)"
316
317
msgid "Homepage meta description "
318
msgstr "Description page d'accueil"
319
+
320
+ msgid "Bulk Copy"
321
+ msgstr "Copy par lot"
322
+
323
+ msgid "All Posts"
324
+ msgstr "Tous les posts"
325
+
326
+ msgid "Selected posts"
327
+ msgstr "Sélection de contenu"
328
+
329
+ msgid "Content title as meta title"
330
+ msgstr "Titre contenu > meta titre"
331
+
332
+ msgid "All Images"
333
+ msgstr "Toutes les images"
334
+
335
+ msgid "Selected images"
336
+ msgstr "Sélection d'images"
337
+
338
+ msgid "Image name as alt text"
339
+ msgstr "Nom image > alt texte"
340
+
341
+ msgid "Image name as image title"
342
+ msgstr "Nom image > titre d'image"
343
+
344
+ msgid "We didn't find any element to apply a batch copy, congrats!"
345
+ msgstr "Aucun élément sur le quel appliquer une action, félicitations !"
346
+
347
+ msgid "The default card type to use "
348
+ msgstr "Type de Twitter card par défaut"
349
+
350
+ msgid "Summary"
351
+ msgstr "Sommaire"
352
+
353
+ msgid "Summary with large image"
354
+ msgstr "Sommaire avec large image"
355
+
356
+ msgid "Optimized at"
357
+ msgstr "Optimisé à"
358
+
359
+ msgid "Wrong resized images"
360
+ msgstr "Image redimentionnées"
361
+
362
+ msgid "Latest month new or updated content"
363
+ msgstr "Contenu ajouté ou mis à jour le mois dernier"
364
+
365
+ msgid "Image data filled (in content)"
366
+ msgstr "Informations images complétées"
367
+
368
+ msgid "More information about WP Meta SEO"
369
+ msgstr "Plus d'info sur le plugin WP Meta SEO"
370
+
371
+ msgid "Other plugins from JoomUnited"
372
+ msgstr "Autres plugin de JoomUnited"
languages/wpms.pot CHANGED
@@ -11,6 +11,7 @@ msgstr ""
11
"Content-Transfer-Encoding: 8bit\n"
12
"Language: en_GB\n"
13
"X-Generator: Poedit 1.8.5\n"
14
15
msgid "Twitter username (without @)"
16
msgstr ""
@@ -317,3 +318,64 @@ msgstr ""
317
318
msgid "Homepage meta description "
319
msgstr ""
11
"Content-Transfer-Encoding: 8bit\n"
12
"Language: en_GB\n"
13
"X-Generator: Poedit 1.8.5\n"
14
+ "X-Poedit-SourceCharset: UTF-8\n"
15
16
msgid "Twitter username (without @)"
17
msgstr ""
318
319
msgid "Homepage meta description "
320
msgstr ""
321
+
322
+ msgid "Bulk copy"
323
+ msgstr ""
324
+
325
+ msgid "All content"
326
+ msgstr ""
327
+
328
+ msgid "Selected posts"
329
+ msgstr ""
330
+
331
+ msgid "Content title as meta title"
332
+ msgstr ""
333
+
334
+ msgid "All images"
335
+ msgstr ""
336
+
337
+ msgid "Selected images"
338
+ msgstr ""
339
+
340
+ msgid "Image name as alt text"
341
+ msgstr ""
342
+
343
+ msgid "Image name as image title"
344
+ msgstr ""
345
+
346
+ msgid "We didn't find any element to apply a batch copy, congrats!"
347
+ msgstr ""
348
+
349
+ msgid "The default card type to use "
350
+ msgstr ""
351
+
352
+ msgid "Summary"
353
+ msgstr ""
354
+
355
+ msgid "Summary with large image"
356
+ msgstr ""
357
+
358
+ msgid "Optimized at"
359
+ msgstr ""
360
+
361
+ msgid "Wrong resized images"
362
+ msgstr ""
363
+
364
+ msgid "Latest month new or updated content"
365
+ msgstr ""
366
+
367
+ msgid "Image data filled (in content)"
368
+ msgstr ""
369
+
370
+ msgid "More information about WP Meta SEO"
371
+ msgstr ""
372
+
373
+ msgid "Other plugins from JoomUnited"
374
+ msgstr ""
375
+
376
+ msgid "More information about WP Meta SEO"
377
+ msgstr ""
378
+
379
+ msgid "Other plugins from JoomUnited"
380
+ msgstr ""
381
+
readme.txt CHANGED
@@ -1,6 +1,6 @@
1
=== WP Meta SEO ===
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, alt, facebook, twitter, seo score, open graph, og, title, title tag
4
Requires at least: 4.0
5
Tested up to: 4.3.1
6
Stable tag: 1.3.0
@@ -25,15 +25,21 @@ WP Meta SEO gives you the control over all your meta content and images. Bulk SE
25
26
It was annoying to edit meta on an existing website, open each post, page and almost nobody was doing it. Especially if you need to edit content + image meta.
27
WP Meta SEO is going to list all posts, pages, custom post types and all images. Type your meta content and fix image size and everything is AJAX saved.
28
- A bunch of people reduce the size of the pictures handling the border and resizing in html/css. You can now optimize the size of your images in articles, click fix and it's replaced.
29
30
31
= On page SEO optimization and analysis =
32
33
* Content SEO smart analysis bellow content
34
* Search engine snippet preview
35
- * AJAX analysis refresh
36
- * 7 criteria of analysis
37
* Check: Page title word in content heading
38
* Check: Page title word in content
39
* Check: Page URL matches with page title
@@ -48,28 +54,32 @@ A bunch of people reduce the size of the pictures handling the border and resizi
48
[vimeo https://vimeo.com/113695156]
49
50
51
- = SEO features list =
52
53
- * Reduce page weight by fix image size
54
* All alt tags edition on single view
55
* See all your snippet in one view
56
* Image name, title, description and legend
57
* Dashboard SEO check
58
- * Automatic AJAX saving
59
* On page analysis: fix SEO criteria
60
- * Custom type mate edition
61
* Yoast SEO import & sync
62
- * Alexa world rank
63
- * Meta content filtering
64
- * Optimize images in all your post and pages
65
- * Live Google snippet preview
66
- * Edit images file name in single view
67
- * All in one SEO importer and sync Filter content by post type: post, page, custom
68
* Image date filtering
69
* Content meta length limit (Google + Yahoo + Bing)
70
* SEO problem warning
71
* Bulk image resizing
72
* One click image title copy
73
74
= Main plugins from JoomUnited: =
75
* WP Media Folder: https://www.joomunited.com/wordpress-products/wp-media-folder
@@ -80,7 +90,8 @@ A bunch of people reduce the size of the pictures handling the border and resizi
80
81
= Support =
82
83
- A PDF support document is provided and a dedicated support can be provided additionally with a membership.
84
**More details here:** http://www.joomunited.com/wordpress-products/wp-meta-seo
85
86
== Installation ==
@@ -88,23 +99,32 @@ A PDF support document is provided and a dedicated support can be provided addit
88
= To install the automatically: =
89
* Through WordPress admin, use the menu: Plugin > Add new
90
* Search for WP Meta SEO
91
- * Click on install then activate link
92
93
= To install the plugin manually: =
94
* Download and unzip the plugin wp-meta-seo.zip
95
- * Upload the seo-ultimate directory to /wp-content/plugins/
96
- * Activate the plugin through the 'Plugins' menu in WordPress.
97
98
Once the plugin is installed, open the bulk edition through the admin menu or open a content to load SEO on page analysis
99
100
== Frequently Asked Questions ==
101
102
- = Which browsers work best with the WP Meta SEO administration interface? =
103
- WP Meta SEO is using HTML5 features so to be sure run the latest version of Chrome / Firefox / Safari or IE9+
104
105
= Is WP Meta SEO slowing down my website? =
106
Nope :) All your SEO content is properly stored in the database and automatic SEO checks are also cached or run every 72 hours (unless you force the process)
107
108
= Compatibility =
109
What's the minimum version of WordPress required to run WP Meta SEO? WordPress 4.0 is required. WP Meta SEO may generate PHP errors if you tried to run it on an earlier version, and so it will simply refuse to activate on any version of WordPress that's older than 4.0
110
@@ -116,6 +136,9 @@ In the admin of WordPress, on the left menu named WP Meta SEO and its sub menu f
116
Go to the Plugins > WP Meta SEO > Deactivate > Delete
117
If you choose to install it later all your SEO data will remain in place (database stored)
118
119
== Screenshots ==
120
121
1. Main dashboard of the plugin with SEO optimization check
@@ -127,10 +150,15 @@ If you choose to install it later all your SEO data will remain in place (databa
127
1. Detail and alert on the element that you can optimize
128
1. Image replace confirmation
129
130
-
131
-
132
== Changelog ==
133
134
= 1.3.0 =
135
* New SEO check dashboard
136
* Check for SEO permalinks
@@ -172,14 +200,5 @@ If you choose to install it later all your SEO data will remain in place (databa
172
173
== Upgrade Notice ==
174
175
- Update through the automatic WordPress updater, all WP Meta SEO content will remain in place
176
-
177
-
178
- <PageMap>
179
- <DataObject type="thumbnail">
180
- <Attribute name="src" value="https://www.joomunited.com/images/WP-Meta-SEO/icon-128x128.png"/>
181
- <Attribute name="width" value="100"/>
182
- <Attribute name="height" value="130"/>
183
- </DataObject>
184
- </PageMap>
185
-
1
=== WP Meta SEO ===
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
4
Requires at least: 4.0
5
Tested up to: 4.3.1
6
Stable tag: 1.3.0
25
26
It was annoying to edit meta on an existing website, open each post, page and almost nobody was doing it. Especially if you need to edit content + image meta.
27
WP Meta SEO is going to list all posts, pages, custom post types and all images. Type your meta content and fix image size and everything is AJAX saved.
28
+ Plus, a bulk copy feature is available to save tons of time in your SEO optimization process:
29
+ * Content title to All meta titles
30
+ * Image name to Image title
31
+ * Image name to Image alt
32
+
33
+ A bunch of people reduce the size of the pictures in content using handles that results to a HTML resizing. And that's something wrong for SEO, for page loading time and for image quality.
34
+ WP Meta SEO also include this feature in the bulk edition view, you are notified and you can now optimize the size of your images in articles, click fix and it's replaced in your content (no broken links).
35
36
37
= On page SEO optimization and analysis =
38
39
* Content SEO smart analysis bellow content
40
* Search engine snippet preview
41
+ * AJAX SEO analysis refresh
42
+ * 7 criteria of SEO analysis
43
* Check: Page title word in content heading
44
* Check: Page title word in content
45
* Check: Page URL matches with page title
54
[vimeo https://vimeo.com/113695156]
55
56
57
+ = SEO full features list =
58
59
+ * Reduce page weight by fixing HTML image resizing
60
* All alt tags edition on single view
61
* See all your snippet in one view
62
* Image name, title, description and legend
63
* Dashboard SEO check
64
+ * Automatic AJAX saving SEO content on bulk edition
65
* On page analysis: fix SEO criteria
66
+ * Custom post type meta edition
67
+ * All custom post type and WooCommerce SEO optimization
68
* Yoast SEO import & sync
69
+ * All in one SEO importer and sync
70
+ * Alexa traffic rank
71
+ * Meta content filtering by type
72
+ * Optimize images and replace all inside your content
73
+ * Live Google snippet preview
74
+ * Edit images file name in single view
75
+ * Filter content by post type: post, page, custom
76
* Image date filtering
77
* Content meta length limit (Google + Yahoo + Bing)
78
* SEO problem warning
79
* Bulk image resizing
80
* One click image title copy
81
+ * SEO bulk copy: Copy image name to image alt and/or image title
82
+ * SEO bulk copy: Copy content title to content meta title
83
84
= Main plugins from JoomUnited: =
85
* WP Media Folder: https://www.joomunited.com/wordpress-products/wp-media-folder
90
91
= Support =
92
93
+ A PDF support document is provided with WP Meta SEO on JoomUnited website
94
+ Feel free to ask SEO questions on our forum or here in the support section
95
**More details here:** http://www.joomunited.com/wordpress-products/wp-meta-seo
96
97
== Installation ==
99
= To install the automatically: =
100
* Through WordPress admin, use the menu: Plugin > Add new
101
* Search for WP Meta SEO
102
+ * Click on install then click activate link
103
104
= To install the plugin manually: =
105
* Download and unzip the plugin wp-meta-seo.zip
106
+ * Upload the /wp-meta-seo directory to /wp-content/plugins/
107
+ * Activate the plugin through the 'Plugins' menu in WordPress
108
+ * Use the WP Meta SEO WordPress left menu
109
110
Once the plugin is installed, open the bulk edition through the admin menu or open a content to load SEO on page analysis
111
112
== Frequently Asked Questions ==
113
114
+ = Will the image rename bulk feature generate broken links? =
115
+ Not at all, it would have been bad for SEO :) the image name is dynamically replaced in all your content.
116
+
117
+ = If I edit image title and alt text, will that information be loaded each time my image is in a content? =
118
+ There's an SEO option for that :) WP Meta SEO will detect that the image has missing information and once edit it, you will have a list of all the image instance and where it's loaded.
119
+ So you'll be able to define SEO info for each instance.
120
121
= Is WP Meta SEO slowing down my website? =
122
Nope :) All your SEO content is properly stored in the database and automatic SEO checks are also cached or run every 72 hours (unless you force the process)
123
124
+ = Can I translate WP Meta SEO? =
125
+ You're welcome! in the WP Meta SEO package you got English and French included as standard .po/.mo files. Use the .pot file also available in the /language folder to create your own.
126
+ You can contact us if you want it to be included in the WP Meta SEO package.
127
+
128
= Compatibility =
129
What's the minimum version of WordPress required to run WP Meta SEO? WordPress 4.0 is required. WP Meta SEO may generate PHP errors if you tried to run it on an earlier version, and so it will simply refuse to activate on any version of WordPress that's older than 4.0
130
136
Go to the Plugins > WP Meta SEO > Deactivate > Delete
137
If you choose to install it later all your SEO data will remain in place (database stored)
138
139
+ = Which browsers work best with the WP Meta SEO administration interface? =
140
+ WP Meta SEO is using HTML5 features so to be sure run the latest version of Chrome / Firefox / Safari or IE9+
141
+
142
== Screenshots ==
143
144
1. Main dashboard of the plugin with SEO optimization check
150
1. Detail and alert on the element that you can optimize
151
1. Image replace confirmation
152
153
== Changelog ==
154
155
+ = 1.4.0 =
156
+ * Bulk copy new option: content title to meta title
157
+ * Bulk copy new option: image name to alt text
158
+ * Bulk copy new option: image name to image title
159
+ * Fix twitter card on SEO on page optimization
160
+ * Fix SEO meta empty in some themes
161
+
162
= 1.3.0 =
163
* New SEO check dashboard
164
* Check for SEO permalinks
200
201
== Upgrade Notice ==
202
203
+ Update through the automatic WordPress updater, all WP Meta SEO content will remain in place.
204
+ You WON'T loose any SEO content: meta, alt, titles,...
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: 1.3.0
8
* Author: JoomUnited
9
* Author URI: http://www.joomunited.com
10
* License: GPL2
@@ -45,7 +45,7 @@ if (!defined('URL'))
45
define('URL', get_site_url());
46
47
if (!defined('WPMSEO_VERSION'))
48
- define('WPMSEO_VERSION', '1.3.0');
49
50
if (!defined('WPMSEO_FILE'))
51
define('WPMSEO_FILE', __FILE__);
@@ -96,7 +96,9 @@ if (is_admin()) {
96
97
// get meta description
98
$meta_description = get_post_meta($wp_query->post->ID, '_metaseo_metadesc', true);
99
- if($meta_description == '') $meta_description = $wp_query->post->post_title;
100
$meta_description_esc = esc_attr($meta_description);
101
102
// get option reading
@@ -104,21 +106,19 @@ if (is_admin()) {
104
$mpage_on_front = get_option('page_on_front');
105
$mshow_on_front = get_option('show_on_front');
106
107
// check homepage is latest post
108
- if((empty($mpage_for_posts) && empty($mpage_on_front) && $mshow_on_front == 'posts') || (empty($page_on_front) && !empty($mpage_for_posts) && $mshow_on_front== 'page') && is_home()){
109
- $settings = get_option( '_metaseo_settings' );
110
$meta_title_esc = esc_attr($settings['metaseo_title_home']);
111
$meta_description_esc = esc_attr($settings['metaseo_desc_home']);
112
}
113
114
// check homepage is a page
115
if(get_post_meta($wp_query->post->ID, '_metaseo_metatitle', true) == '' && is_front_page() ){
116
- $settings = get_option( '_metaseo_settings' );
117
$meta_title_esc = esc_attr($settings['metaseo_title_home']);
118
}
119
120
if(get_post_meta($wp_query->post->ID, '_metaseo_metadesc', true) == '' && is_front_page() ){
121
- $settings = get_option( '_metaseo_settings' );
122
$meta_description_esc = esc_attr($settings['metaseo_desc_home']);
123
}
124
@@ -148,7 +148,7 @@ if (is_admin()) {
148
}
149
}
150
151
- $meta_twitter_card = 'summary';
152
$meta_twitter_image = get_post_meta($wp_query->post->ID,'_metaseo_metatwitter-image',true);
153
154
$meta_facebook_title = get_post_meta($wp_query->post->ID,'_metaseo_metaopengraph-title',true);
@@ -210,7 +210,10 @@ if (is_admin()) {
210
'<meta name="description" content="' . $meta_description_esc . '" />',
211
($meta_description_esc != '' ? true : false)),
212
213
- 'title' => array(),
214
);
215
216
if(get_post_meta($wp_query->post->ID, '_metaseo_metatitle', true) != ''){
@@ -219,7 +222,23 @@ if (is_admin()) {
219
'<meta name="title" content="' . $meta_title_esc . '" />',
220
($meta_title_esc != '' ? true : false));
221
}
222
-
223
foreach($patterns as $k => $pattern){
224
if(preg_match_all($pattern[0], $buffer, $matches)){
225
$replacement = array();
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: 1.4.0
8
* Author: JoomUnited
9
* Author URI: http://www.joomunited.com
10
* License: GPL2
45
define('URL', get_site_url());
46
47
if (!defined('WPMSEO_VERSION'))
48
+ define('WPMSEO_VERSION', '1.4.0');
49
50
if (!defined('WPMSEO_FILE'))
51
define('WPMSEO_FILE', __FILE__);
96
97
// get meta description
98
$meta_description = get_post_meta($wp_query->post->ID, '_metaseo_metadesc', true);
99
+ if($meta_description == '') {
100
+ $meta_description = (strlen($wp_query->post->post_content) > 156)?substr($wp_query->post->post_content,0,152) . ' ...':$wp_query->post->post_content;
101
+ }
102
$meta_description_esc = esc_attr($meta_description);
103
104
// get option reading
106
$mpage_on_front = get_option('page_on_front');
107
$mshow_on_front = get_option('show_on_front');
108
109
+ $settings = get_option( '_metaseo_settings' );
110
// check homepage is latest post
111
+ 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())){
112
$meta_title_esc = esc_attr($settings['metaseo_title_home']);
113
$meta_description_esc = esc_attr($settings['metaseo_desc_home']);
114
}
115
116
// check homepage is a page
117
if(get_post_meta($wp_query->post->ID, '_metaseo_metatitle', true) == '' && is_front_page() ){
118
$meta_title_esc = esc_attr($settings['metaseo_title_home']);
119
}
120
121
if(get_post_meta($wp_query->post->ID, '_metaseo_metadesc', true) == '' && is_front_page() ){
122
$meta_description_esc = esc_attr($settings['metaseo_desc_home']);
123
}
124
148
}
149
}
150
151
+ $meta_twitter_card = (!empty($settings['metaseo_twitter_card']))?$settings['metaseo_twitter_card']:'summary';
152
$meta_twitter_image = get_post_meta($wp_query->post->ID,'_metaseo_metatwitter-image',true);
153
154
$meta_facebook_title = get_post_meta($wp_query->post->ID,'_metaseo_metaopengraph-title',true);
210
'<meta name="description" content="' . $meta_description_esc . '" />',
211
($meta_description_esc != '' ? true : false)),
212
213
+ 'title' => array(
214
+ '#<meta name="title" [^<>]+ ?>#i',
215
+ '<meta name="title" content="' . $meta_title_esc . '" />',
216
+ ($meta_title_esc != '' ? true : false)),
217
);
218
219
if(get_post_meta($wp_query->post->ID, '_metaseo_metatitle', true) != ''){
222
'<meta name="title" content="' . $meta_title_esc . '" />',
223
($meta_title_esc != '' ? true : false));
224
}
225
+
226
+ if($meta_twitter_site == ''){
227
+ unset($patterns['twitter_site']);
228
+ }
229
+
230
+ if($meta_twitter_image == ''){
231
+ unset($patterns['twitter_image']);
232
+ }
233
+
234
+ if($facebook_admin == ''){
235
+ unset($patterns['facebook_admin']);
236
+ }
237
+
238
+ if($meta_facebook_image == ''){
239
+ unset($patterns['facebook_image']);
240
+ }
241
+
242
foreach($patterns as $k => $pattern){
243
if(preg_match_all($pattern[0], $buffer, $matches)){
244
$replacement = array();