SEO Ultimate - Version 0.9

Version Description

Download this release

Release Info

Developer SEO Design Solutions
Plugin Icon 128x128 SEO Ultimate
Version 0.9
Comparing to
See all releases

Code changes from version 0.8 to 0.9

class.seo-ultimate.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * The main class. Provides plugin-level functionality.
4
  *
5
- * @version 1.5
6
  * @since 0.1
7
  */
8
  class SEO_Ultimate {
@@ -34,7 +33,7 @@ class SEO_Ultimate {
34
  var $dbdata = array();
35
 
36
  /**
37
- * The server path of this plugin file.
38
  * Example: /home/user/public_html/wp-content/plugins/seo-ultimate/seo-ultimate.php
39
  *
40
  * @since 0.1
@@ -43,7 +42,7 @@ class SEO_Ultimate {
43
  var $plugin_file_path;
44
 
45
  /**
46
- * The public URL of this plugin file.
47
  * Example: http://www.example.com/wp-content/plugins/seo-ultimate/seo-ultimate.php
48
  *
49
  * @since 0.1
@@ -70,12 +69,12 @@ class SEO_Ultimate {
70
  var $plugin_dir_url;
71
 
72
  /**
73
- * The database ID of the current hit.
74
  *
75
- * @since 0.2
76
- * @var int
77
  */
78
- var $hit_id = 0;
79
 
80
  /**
81
  * The name of the function/mechanism that triggered the current redirect.
@@ -83,7 +82,7 @@ class SEO_Ultimate {
83
  * @since 0.3
84
  * @var string
85
  */
86
- var $hit_redirect_trigger;
87
 
88
 
89
  /********** CLASS CONSTRUCTORS **********/
@@ -94,7 +93,8 @@ class SEO_Ultimate {
94
  *
95
  * @since 0.1
96
  * @uses $dbdata
97
- * @uses save_dbdata()
 
98
  * @uses load_plugin_data()
99
  * @uses SU_VERSION
100
  * @uses install()
@@ -123,6 +123,7 @@ class SEO_Ultimate {
123
 
124
  //Save
125
  add_action('shutdown', array($this, 'save_dbdata'));
 
126
 
127
  /********** CLASS CONSTRUCTION **********/
128
 
@@ -255,6 +256,7 @@ class SEO_Ultimate {
255
 
256
  /**
257
  * Upgrades SEO Ultimate to version 0.8.
 
258
  *
259
  * @since 0.8
260
  * @uses $dbdata
@@ -353,12 +355,17 @@ class SEO_Ultimate {
353
  * Finds and loads all modules. Runs the activation functions of newly-uploaded modules.
354
  * Updates the modules list and saves it in the database. Removes the cron jobs of deleted modules.
355
  *
 
 
356
  * @since 0.1
357
  * @uses $plugin_dir_path
 
358
  * @uses $modules Stores module classes in this array.
 
359
  * @uses module_sort_callback() Passes this function to uasort() to sort the $modules array.
360
  * @uses SU_MODULE_ENABLED
361
  * @uses SU_MODULE_DISABLED
 
362
  */
363
  function load_modules() {
364
 
@@ -440,6 +447,7 @@ class SEO_Ultimate {
440
  }
441
  }
442
 
 
443
  foreach ($this->disabled_modules as $key => $name) {
444
  $newmodules[$key] = SU_MODULE_DISABLED;
445
  }
@@ -465,7 +473,7 @@ class SEO_Ultimate {
465
  //Allow translation of this plugin
466
  load_plugin_textdomain('seo-ultimate', '', plugin_basename($this->plugin_file_path));
467
 
468
- //Let the modules run init tasks
469
  foreach ($this->modules as $module) {
470
  $module->load_default_settings();
471
  $module->init();
@@ -518,7 +526,7 @@ class SEO_Ultimate {
518
  }
519
 
520
  /**
521
- * Saves data to the database.
522
  *
523
  * @since 0.8
524
  * @uses $dbdata
@@ -538,7 +546,19 @@ class SEO_Ultimate {
538
  }
539
 
540
  /**
541
- * A status_header WordPress filter that logs the current hit.
 
 
 
 
 
 
 
 
 
 
 
 
542
  *
543
  * @since 0.1
544
  * @uses get_current_url()
@@ -551,13 +571,18 @@ class SEO_Ultimate {
551
  */
552
  function log_hit($status_header, $status_code, $redirect_url = '') {
553
 
 
554
  if (!is_user_logged_in()) {
555
  global $wpdb;
556
 
557
- $table = $this->get_table_name('hits');
558
  $url = $this->get_current_url();
 
 
 
559
  $is_new = (count($wpdb->get_results($wpdb->prepare("SELECT url FROM $table WHERE url = %s AND is_new = 0", $url))) == 0);
560
 
 
561
  $data = array(
562
  'time' => time()
563
  , 'ip_address' => $_SERVER['REMOTE_ADDR']
@@ -570,24 +595,22 @@ class SEO_Ultimate {
570
  , 'is_new' => $is_new
571
  );
572
 
573
- if ($this->hit_id > 0) {
574
-
575
- //We don't want to overwrite a redirect URL if it's already been logged
576
- if (!strlen($data['redirect_url'])) unset($data['redirect_url']);
577
-
578
- //Update the existing hit record
579
- $wpdb->update($table, $data, array('id' => $this->hit_id));
580
- } else {
581
- $wpdb->insert($table, $data);
582
- $this->hit_id = $wpdb->insert_id;
583
- }
584
  }
585
 
 
586
  return $status_header;
587
  }
588
 
589
  /**
590
- * A wp_redirect WordPress filter that logs the current hit.
591
  *
592
  * @since 0.2
593
  * @uses log_hit()
@@ -597,13 +620,13 @@ class SEO_Ultimate {
597
  * @return string The unchanged $redirect_url parameter.
598
  */
599
  function log_redirect($redirect_url, $status_code) {
600
- if (!$this->hit_redirect_trigger) $this->hit_redirect_trigger = 'wp_redirect';
601
- $this->log_hit(null, $status_code, $redirect_url);
602
  return $redirect_url;
603
  }
604
 
605
  /**
606
- * A redirect_canonical WordPress filter that logs the current hit.
607
  *
608
  * @since 0.3
609
  * @uses log_hit()
@@ -612,8 +635,7 @@ class SEO_Ultimate {
612
  * @return string The unchanged $redirect_url parameter.
613
  */
614
  function log_redirect_canonical($redirect_url) {
615
- if (!$this->hit_redirect_trigger) $this->hit_redirect_trigger = 'redirect_canonical';
616
- //$this->log_hit(null, 301, $redirect_url, 'redirect_canonical');
617
  return $redirect_url;
618
  }
619
 
@@ -761,7 +783,7 @@ class SEO_Ultimate {
761
  global $plugin_page;
762
 
763
  foreach ($this->modules as $key => $module) {
764
- if ($plugin_page == $this->key_to_hook($key)) return true;
765
  }
766
  }
767
 
@@ -781,10 +803,9 @@ class SEO_Ultimate {
781
  * @uses hook_to_key()
782
  */
783
  function admin_includes() {
784
-
785
- //Global plugin CSS and JavaScript
786
- echo "\n<link rel='stylesheet' type='text/css' href='".$this->plugin_dir_url."seo-ultimate.css?version=".SU_VERSION."' />\n";
787
- echo "\n<script type='text/javascript' src='".$this->plugin_dir_url."seo-ultimate.js?version=".SU_VERSION."'></script>\n";
788
 
789
  //Figure out what plugin admin page we're on
790
  global $plugin_page;
@@ -792,17 +813,25 @@ class SEO_Ultimate {
792
 
793
  foreach ($this->modules as $key => $module) {
794
 
795
- //Is the current admin page belong to this module? If so, print links to the module's CSS and JavaScript.
796
  if (strcmp($key, $pp) == 0) {
797
- echo "\n<link rel='stylesheet' type='text/css' href='".$module->module_url."?css=admin&amp;version=".SU_VERSION."' />\n";
798
- echo "\n<script type='text/javascript' src='".$module->module_url."?js=admin&amp;version=".SU_VERSION."'></script>\n";
 
 
 
 
 
 
 
 
799
  return;
800
  }
801
  }
802
  }
803
 
804
  /**
805
- * Replaces WordPress's default contextual help with module-specific help text, if the module provides it.
806
  *
807
  * @since 0.1
808
  * @uses $modules
@@ -812,31 +841,9 @@ class SEO_Ultimate {
812
  * @return string The contextual help content that should be shown.
813
  */
814
  function admin_help($text, $screen) {
815
- //If $screen begins with a recognized prefix...
816
- if ($screen == 'toplevel_page_seo' || substr($screen, 0, 9) == 'seo_page_' || substr($screen, 0, 14) == 'settings_page_') {
817
 
818
- //Remove the prefix from $screen to get the $key
819
- $key = $this->hook_to_key(str_replace(array('toplevel_page_', 'seo_page_', 'settings_page_'), '', $screen));
820
-
821
- //If $key refers to a module...
822
- if (isset($this->modules[$key])) {
823
-
824
- //Ask the module for custom help content
825
- $customhelp = $this->modules[$key]->admin_help();
826
-
827
- //If we have custom help to display...
828
- if ($customhelp !== false) {
829
-
830
- //Return the help content with an <h5> title
831
- $help = "<div class='su-help'>\n";
832
- $help .= '<h5>'.sprintf(__('%s Help', 'seo-ultimate'),
833
- $this->modules[$key]->get_page_title())."</h5>\n";
834
- $help .= "<div class='metabox-prefs'>\n".$customhelp."\n</div>\n";
835
- $help .= "</div>\n";
836
- return $help;
837
- }
838
- }
839
- } elseif (strcmp($screen, 'post') == 0 || strcmp($screen, 'page') == 0) {
840
 
841
  //Gather post meta help content
842
  $helparray = apply_filters('su_postmeta_help', array());
2
  /**
3
  * The main class. Provides plugin-level functionality.
4
  *
 
5
  * @since 0.1
6
  */
7
  class SEO_Ultimate {
33
  var $dbdata = array();
34
 
35
  /**
36
+ * The server path of the main plugin file.
37
  * Example: /home/user/public_html/wp-content/plugins/seo-ultimate/seo-ultimate.php
38
  *
39
  * @since 0.1
42
  var $plugin_file_path;
43
 
44
  /**
45
+ * The public URL of the main plugin file.
46
  * Example: http://www.example.com/wp-content/plugins/seo-ultimate/seo-ultimate.php
47
  *
48
  * @since 0.1
69
  var $plugin_dir_url;
70
 
71
  /**
72
+ * The array to be inserted into the hits table.
73
  *
74
+ * @since 0.9
75
+ * @var array
76
  */
77
+ var $hit = array();
78
 
79
  /**
80
  * The name of the function/mechanism that triggered the current redirect.
82
  * @since 0.3
83
  * @var string
84
  */
85
+ var $hit_redirect_trigger = '';
86
 
87
 
88
  /********** CLASS CONSTRUCTORS **********/
93
  *
94
  * @since 0.1
95
  * @uses $dbdata
96
+ * @uses save_dbdata() Hooked into WordPress's "shutdown" action.
97
+ * @uses save_hit() Hooked into WordPress's "shutdown" action.
98
  * @uses load_plugin_data()
99
  * @uses SU_VERSION
100
  * @uses install()
123
 
124
  //Save
125
  add_action('shutdown', array($this, 'save_dbdata'));
126
+ add_action('shutdown', array($this, 'save_hit'));
127
 
128
  /********** CLASS CONSTRUCTION **********/
129
 
256
 
257
  /**
258
  * Upgrades SEO Ultimate to version 0.8.
259
+ * Version 0.8 uses 1 wp_options entry instead of 4.
260
  *
261
  * @since 0.8
262
  * @uses $dbdata
355
  * Finds and loads all modules. Runs the activation functions of newly-uploaded modules.
356
  * Updates the modules list and saves it in the database. Removes the cron jobs of deleted modules.
357
  *
358
+ * SEO Ultimate uses a modular system that allows functionality to be added and removed on-the-fly.
359
+ *
360
  * @since 0.1
361
  * @uses $plugin_dir_path
362
+ * @uses $dbdata
363
  * @uses $modules Stores module classes in this array.
364
+ * @uses $disabled_modules
365
  * @uses module_sort_callback() Passes this function to uasort() to sort the $modules array.
366
  * @uses SU_MODULE_ENABLED
367
  * @uses SU_MODULE_DISABLED
368
+ * @uses remove_cron_jobs()
369
  */
370
  function load_modules() {
371
 
447
  }
448
  }
449
 
450
+ //Register disabled modules as such
451
  foreach ($this->disabled_modules as $key => $name) {
452
  $newmodules[$key] = SU_MODULE_DISABLED;
453
  }
473
  //Allow translation of this plugin
474
  load_plugin_textdomain('seo-ultimate', '', plugin_basename($this->plugin_file_path));
475
 
476
+ //Load default module settings and run modules' init tasks
477
  foreach ($this->modules as $module) {
478
  $module->load_default_settings();
479
  $module->init();
526
  }
527
 
528
  /**
529
+ * Saves settings data to the database.
530
  *
531
  * @since 0.8
532
  * @uses $dbdata
546
  }
547
 
548
  /**
549
+ * Saves the hit data to the database.
550
+ *
551
+ * @since 0.9
552
+ * @uses $hit
553
+ */
554
+ function save_hit() {
555
+ global $wpdb;
556
+ if (!empty($this->hit))
557
+ $wpdb->insert($this->get_table_name('hits'), $this->hit);
558
+ }
559
+
560
+ /**
561
+ * Saves information about the current hit into an array, which is later saved to the database.
562
  *
563
  * @since 0.1
564
  * @uses get_current_url()
571
  */
572
  function log_hit($status_header, $status_code, $redirect_url = '') {
573
 
574
+ //Only log hits from non-logged-in users
575
  if (!is_user_logged_in()) {
576
  global $wpdb;
577
 
578
+ //Get the current URL
579
  $url = $this->get_current_url();
580
+
581
+ //Have we seen this URL before?
582
+ $table = $this->get_table_name('hits');
583
  $is_new = (count($wpdb->get_results($wpdb->prepare("SELECT url FROM $table WHERE url = %s AND is_new = 0", $url))) == 0);
584
 
585
+ //Put it all into an array
586
  $data = array(
587
  'time' => time()
588
  , 'ip_address' => $_SERVER['REMOTE_ADDR']
595
  , 'is_new' => $is_new
596
  );
597
 
598
+ //We don't want to overwrite a redirect URL if it's already been logged
599
+ if (strlen($this->hit['redirect_url']))
600
+ $data['redirect_url'] = $this->hit['redirect_url'];
601
+
602
+ //Put the hit data into our variable.
603
+ //We'll save it to the database later, since the hit data may change as we gather further information
604
+ //(e.g. when the redirect URL is discovered).
605
+ $this->hit = $data;
 
 
 
606
  }
607
 
608
+ //This function can be used as a WordPress filter, so we return the needed variable.
609
  return $status_header;
610
  }
611
 
612
  /**
613
+ * A wp_redirect WordPress filter that logs the URL to which the visitor is being redirected.
614
  *
615
  * @since 0.2
616
  * @uses log_hit()
620
  * @return string The unchanged $redirect_url parameter.
621
  */
622
  function log_redirect($redirect_url, $status_code) {
623
+ if (empty($this->hit_redirect_trigger)) $this->hit_redirect_trigger = 'wp_redirect';
624
+ $this->log_hit(null, $status_code, $redirect_url); //We call log_hit() again so we can pass along the redirect URL
625
  return $redirect_url;
626
  }
627
 
628
  /**
629
+ * A redirect_canonical WordPress filter that logs the fact that a canonical redirect is being issued.
630
  *
631
  * @since 0.3
632
  * @uses log_hit()
635
  * @return string The unchanged $redirect_url parameter.
636
  */
637
  function log_redirect_canonical($redirect_url) {
638
+ if (empty($this->hit_redirect_trigger)) $this->hit_redirect_trigger = 'redirect_canonical';
 
639
  return $redirect_url;
640
  }
641
 
783
  global $plugin_page;
784
 
785
  foreach ($this->modules as $key => $module) {
786
+ if (strcmp($plugin_page, $this->key_to_hook($key)) == 0) return true;
787
  }
788
  }
789
 
803
  * @uses hook_to_key()
804
  */
805
  function admin_includes() {
806
+
807
+ //Global CSS
808
+ echo "\n<link rel='stylesheet' type='text/css' href='".$this->plugin_dir_url."global.css?v=".SU_VERSION."' />\n";
 
809
 
810
  //Figure out what plugin admin page we're on
811
  global $plugin_page;
813
 
814
  foreach ($this->modules as $key => $module) {
815
 
816
+ //Does the current admin page belong to this module?
817
  if (strcmp($key, $pp) == 0) {
818
+
819
+ //We're viewing a module page, so print links to the CSS/JavaScript files loaded for all modules
820
+ echo "\n<link rel='stylesheet' type='text/css' href='".$this->plugin_dir_url."modules.css?v=".SU_VERSION."' />\n";
821
+ echo "\n<script type='text/javascript' src='".$this->plugin_dir_url."modules.js?v=".SU_VERSION."'></script>\n";
822
+
823
+ //Print links to the module's CSS and JavaScript.
824
+ echo "\n<link rel='stylesheet' type='text/css' href='".$module->module_url."?css=admin&amp;v=".SU_VERSION."' />\n";
825
+ echo "\n<script type='text/javascript' src='".$module->module_url."?js=admin&amp;v=".SU_VERSION."'></script>\n";
826
+
827
+ //The module has been found; mission accomplished.
828
  return;
829
  }
830
  }
831
  }
832
 
833
  /**
834
+ * Replaces WordPress's default contextual help with postmeta help when appropriate.
835
  *
836
  * @since 0.1
837
  * @uses $modules
841
  * @return string The contextual help content that should be shown.
842
  */
843
  function admin_help($text, $screen) {
 
 
844
 
845
+ //If we're on the post or page editor...
846
+ if (strcmp($screen, 'post') == 0 || strcmp($screen, 'page') == 0) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
847
 
848
  //Gather post meta help content
849
  $helparray = apply_filters('su_postmeta_help', array());
class.su-hitset.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * A class that stores the results of a query to to the hits table.
4
  *
5
- * @version 1.1
6
  */
7
  class SU_HitSet {
8
 
@@ -47,6 +47,7 @@ class SU_HitSet {
47
  , 'url' => __("URL Requested", 'seo-ultimate')
48
  , 'redirect_url' => __("Redirected To", 'seo-ultimate')
49
  , 'status_code' => __("Status Code", 'seo-ultimate')
 
50
  );
51
 
52
  $fields = array();
2
  /**
3
  * A class that stores the results of a query to to the hits table.
4
  *
5
+ * @version 1.1.1
6
  */
7
  class SU_HitSet {
8
 
47
  , 'url' => __("URL Requested", 'seo-ultimate')
48
  , 'redirect_url' => __("Redirected To", 'seo-ultimate')
49
  , 'status_code' => __("Status Code", 'seo-ultimate')
50
+ , 'referer' => __("Referring URL", 'seo-ultimate')
51
  );
52
 
53
  $fields = array();
class.su-importmodule.php DELETED
@@ -1,69 +0,0 @@
1
- <?php
2
- /**
3
- * Import Module
4
- *
5
- * @abstract
6
- * @version 1.0.1
7
- * @since 0.6
8
- */
9
-
10
- if (class_exists('SU_Module')) {
11
-
12
- class SU_ImportModule extends SU_Module {
13
-
14
- var $import_status_image;
15
-
16
- function get_menu_parent() { return 'su-import-modules'; }
17
-
18
- function admin_page() {
19
- $this->admin_page_start('tools');
20
-
21
- if ($this->is_action('update')) {
22
- ob_start();
23
- $this->admin_page_contents();
24
- ob_end_clean();
25
-
26
- global $seo_ultimate;
27
- $this->import_status_image = $seo_ultimate->plugin_dir_url.'images/success.png';
28
-
29
- $this->import_page_contents();
30
- } else
31
- $this->admin_page_contents();
32
-
33
- $this->admin_page_end();
34
- }
35
-
36
- function admin_form_end($button = false, $table = true) {
37
- if (!$button) $button = __("Import Now", 'seo-ultimate');
38
- parent::admin_form_end($button, $table);
39
- }
40
-
41
- function import_page_contents() {
42
-
43
- echo "<table id='import-status'>\n";
44
- $this->do_import();
45
- echo "</table>\n";
46
- if ($this->module_exists('settings')) {
47
- echo '<a href="options-general.php?page=seo-ultimate" class="button-secondary">';
48
- _e('Return to settings page', 'seo-ultimate');
49
- } else {
50
- echo '<a href="admin.php?page=seo" class="button-secondary">';
51
- _e('Return to SEO page', 'seo-ultimate');
52
- }
53
- echo "</a>\n";
54
- }
55
-
56
- function import_status($message) {
57
- echo "<tr><td class='image'><img src='{$this->import_status_image}' alt='' /></td><td class='message'>$message</td></tr>";
58
- }
59
-
60
- function import_option($module, $key, $option) {
61
- if (!isset($this->settings[$module][$key]) || $this->get_setting('overwrite_su')) {
62
- $this->settings[$module][$key] = get_option($option);
63
- if ($this->get_setting('delete_import')) delete_option($option);
64
- }
65
- }
66
- }
67
-
68
- }
69
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class.su-module.php CHANGED
@@ -3,7 +3,6 @@
3
  * The pseudo-abstract class upon which all modules are based.
4
  *
5
  * @abstract
6
- * @version 1.5
7
  * @since 0.1
8
  */
9
  class SU_Module {
@@ -168,6 +167,15 @@ class SU_Module {
168
  */
169
  function admin_page_contents() { }
170
 
 
 
 
 
 
 
 
 
 
171
  /**
172
  * Returns the module's custom help content that should go in the "Help" dropdown of WordPress 2.7 and above.
173
  *
@@ -372,6 +380,7 @@ class SU_Module {
372
  *
373
  * @since 0.1
374
  * @uses admin_footer() Hooked into WordPress's in_admin_footer action.
 
375
  * @uses get_module_key()
376
  * @uses get_page_title()
377
  *
@@ -380,6 +389,7 @@ class SU_Module {
380
  function admin_page_start($icon = 'options-general') {
381
 
382
  add_action('in_admin_footer', array($this, 'admin_footer'));
 
383
 
384
  echo "<div class=\"wrap\">\n";
385
  echo "<div id=\"su-".attribute_escape($this->get_module_key())."\" class=\"su-module\">\n";
@@ -422,69 +432,26 @@ class SU_Module {
422
  * Outputs a tab control and loads the current tab.
423
  *
424
  * @since 0.7
 
425
  * @uses get_admin_url()
 
426
  *
427
- * @param array $tabs The names of the functions that display the tab contents are the array keys, and the internationalized tab titles are the array values.
428
  */
429
- function admin_page_tabs($tabs = array(), $tabset = 'su-tabset') {
 
 
430
 
431
- echo "\n\n<div id='$tabset' class='su-tabs'>\n";
432
 
433
- foreach ($tabs as $function => $title) {
434
  echo "<fieldset id='$function'>\n<h3>$title</h3>\n";
435
  if (is_callable($call = array($this, $function))) call_user_func($call);
436
  echo "</fieldset>\n";
437
  }
438
  echo "</div>\n";
439
- ?>
440
-
441
- <script type="text/javascript">
442
- /* <![CDATA[ */
443
- jQuery(function()
444
- {
445
- su_init_tabs();
446
- });
447
-
448
- function su_init_tabs()
449
- {
450
- /* if this is not the breadcrumb admin page, quit */
451
- if (!jQuery("#<?php echo $tabset; ?>").length) return;
452
-
453
- /* init markup for tabs */
454
- jQuery('#<?php echo $tabset; ?>').prepend("<ul><\/ul>");
455
- jQuery('#<?php echo $tabset; ?> > fieldset').each(function(i)
456
- {
457
- id = jQuery(this).attr('id');
458
- caption = jQuery(this).find('h3').text();
459
- jQuery('#<?php echo $tabset; ?> > ul').append('<li><a href="#'+id+'"><span>'+caption+"<\/span><\/a><\/li>");
460
- jQuery(this).find('h3').hide();
461
- });
462
 
463
- /* init the tabs plugin */
464
- var jquiver = undefined == jQuery.ui ? [0,0,0] : undefined == jQuery.ui.version ? [0,1,0] : jQuery.ui.version.split('.');
465
- switch(true) {
466
- // tabs plugin has been fixed to work on the parent element again.
467
- case jquiver[0] >= 1 && jquiver[1] >= 7:
468
- jQuery("#<?php echo $tabset; ?>").tabs();
469
- break;
470
- // tabs plugin has bug and needs to work on ul directly.
471
- default:
472
- jQuery("#<?php echo $tabset; ?> > ul").tabs();
473
- }
474
-
475
- /* handler for openeing the last tab after submit (compability version) */
476
- jQuery('#<?php echo $tabset; ?> ul a').click(function(i){
477
- var form = jQuery('#bcn_admin_options');
478
- var action = form.attr("action").split('#', 1) + jQuery(this).attr('href');
479
- // an older bug pops up with some jQuery version(s), which makes it
480
- // necessary to set the form's action attribute by standard javascript
481
- // node access:
482
- form.get(0).setAttribute("action", action);
483
- });
484
- }
485
- </script>
486
-
487
- <?php
488
  }
489
 
490
  /**
@@ -493,7 +460,7 @@ class SU_Module {
493
  * @since 0.8
494
  */
495
  function admin_page_tabs_init() {
496
- add_action('wp_print_scripts', array($this, 'admin_page_tabs_js'));
497
  }
498
 
499
  /**
@@ -505,6 +472,50 @@ class SU_Module {
505
  wp_enqueue_script('jquery-ui-tabs');
506
  }
507
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
508
  /**
509
  * Adds plugin/module information to the admin footer.
510
  *
@@ -674,8 +685,8 @@ class SU_Module {
674
 
675
  echo "<input name='$id' id='$id' type='text' value='$value' class='regular-text' ";
676
  if (isset($defaults[$id])) {
677
- echo "onkeyup=\"javascript:textbox_value_changed(this, '$default', '{$id}_reset')\" />";
678
- echo "&nbsp;<a href=\"javascript:void(0)\" id=\"{$id}_reset\" onclick=\"javascript:reset_textbox('$id', '$default', '$resetmessage', this)\"";
679
  if ($default == $value) echo ' class="hidden"';
680
  echo ">";
681
  _e('Reset', 'seo-ultimate');
3
  * The pseudo-abstract class upon which all modules are based.
4
  *
5
  * @abstract
 
6
  * @since 0.1
7
  */
8
  class SU_Module {
167
  */
168
  function admin_page_contents() { }
169
 
170
+ /**
171
+ * Returns an array of arrays, each of which includes the key, title, and content of a custom module dropdown.
172
+ *
173
+ * @since 0.9
174
+ *
175
+ * @return array
176
+ */
177
+ function admin_dropdowns() { return array(); }
178
+
179
  /**
180
  * Returns the module's custom help content that should go in the "Help" dropdown of WordPress 2.7 and above.
181
  *
380
  *
381
  * @since 0.1
382
  * @uses admin_footer() Hooked into WordPress's in_admin_footer action.
383
+ * @uses screen_meta_filter() Hooked into our screen_meta filter
384
  * @uses get_module_key()
385
  * @uses get_page_title()
386
  *
389
  function admin_page_start($icon = 'options-general') {
390
 
391
  add_action('in_admin_footer', array($this, 'admin_footer'));
392
+ add_filter('screen_meta', array($this, 'screen_meta_filter'));
393
 
394
  echo "<div class=\"wrap\">\n";
395
  echo "<div id=\"su-".attribute_escape($this->get_module_key())."\" class=\"su-module\">\n";
432
  * Outputs a tab control and loads the current tab.
433
  *
434
  * @since 0.7
435
+ * @uses $seo_ultimate
436
  * @uses get_admin_url()
437
+ * @uses SEO_Ultimate::plugin_dir_url
438
  *
439
+ * @param array $tabs The internationalized tab titles are the array keys, and the references to the functions that display the tab contents are the array values.
440
  */
441
+ function admin_page_tabs($tabs = array()) {
442
+
443
+ global $seo_ultimate;
444
 
445
+ echo "\n\n<div id='su-tabset' class='su-tabs'>\n";
446
 
447
+ foreach ($tabs as $title => $function) {
448
  echo "<fieldset id='$function'>\n<h3>$title</h3>\n";
449
  if (is_callable($call = array($this, $function))) call_user_func($call);
450
  echo "</fieldset>\n";
451
  }
452
  echo "</div>\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
 
454
+ echo '<script type="text/javascript" src="'.$seo_ultimate->plugin_dir_url.'tabs.js?v='.SU_VERSION.'"></script>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
455
  }
456
 
457
  /**
460
  * @since 0.8
461
  */
462
  function admin_page_tabs_init() {
463
+ add_action('admin_print_scripts', array($this, 'admin_page_tabs_js'));
464
  }
465
 
466
  /**
472
  wp_enqueue_script('jquery-ui-tabs');
473
  }
474
 
475
+ /**
476
+ * Adds the module's custom screen meta, if present.
477
+ *
478
+ * @since 0.9
479
+ * @uses admin_dropdowns()
480
+ */
481
+ function screen_meta_filter($screen_meta) {
482
+
483
+ $dropdowns = array_reverse($this->admin_dropdowns());
484
+
485
+ $script = "<script type='text/javascript'>jQuery(function($) { $('#contextual-help-link').css('display', 'none'); });</script>";
486
+
487
+ if (is_array($dropdowns) && count($dropdowns)) {
488
+ foreach ($dropdowns as $key => $label) {
489
+
490
+ $label = htmlspecialchars($label);
491
+
492
+ $function = array($this, "admin_dropdown_$key");
493
+ if (is_callable($function)) {
494
+ $content = "<div class='su-help'>\n";
495
+ $content .= '<h5>'.sprintf(_c('%s %s|Dropdown Title', 'seo-ultimate'), $this->get_page_title(), $label)."</h5>\n\n";
496
+ $content .= call_user_func($function);
497
+ $content .= "\n</div>\n";
498
+ $screen_meta[] = compact('key', 'label', 'content');
499
+ }
500
+ }
501
+
502
+ echo $script;
503
+
504
+ } elseif ($this->admin_help() !== false) {
505
+
506
+ $content = "<div class='su-help'>\n";
507
+ $content .= '<h5>'.sprintf(_c('%s Documentation', 'seo-ultimate'), $this->get_page_title())."</h5>\n\n";
508
+ $content .= $this->admin_help();
509
+ $content .= "\n</div>\n";
510
+
511
+ $screen_meta[] = array('key' => 'documentation', 'label' => __('Documentation', 'seo-ultimate'), 'content' => $content);
512
+
513
+ echo $script;
514
+ }
515
+
516
+ return $screen_meta;
517
+ }
518
+
519
  /**
520
  * Adds plugin/module information to the admin footer.
521
  *
685
 
686
  echo "<input name='$id' id='$id' type='text' value='$value' class='regular-text' ";
687
  if (isset($defaults[$id])) {
688
+ echo "onkeyup=\"javascript:su_textbox_value_changed(this, '$default', '{$id}_reset')\" />";
689
+ echo "&nbsp;<a href=\"javascript:void(0)\" id=\"{$id}_reset\" onclick=\"javascript:su_reset_textbox('$id', '$default', '$resetmessage', this)\"";
690
  if ($default == $value) echo ' class="hidden"';
691
  echo ">";
692
  _e('Reset', 'seo-ultimate');
class.su-parentmodule.php DELETED
@@ -1,52 +0,0 @@
1
- <?php
2
- /**
3
- * Parent Module
4
- *
5
- * @abstract
6
- * @version 1.0
7
- * @since 0.7
8
- */
9
-
10
- if (class_exists('SU_Module')) {
11
-
12
- class SU_ParentModule extends SU_Module {
13
-
14
- var $modules = array();
15
-
16
- function init() {
17
- global $seo_ultimate;
18
- foreach ($seo_ultimate->modules as $key => $module) {
19
- if ($module->get_parent_module() == $this->get_module_key()) {
20
- $this->modules[$key] = $module;
21
- }
22
- }
23
- }
24
-
25
- function admin_page_contents() {
26
- $this->admin_form_start(false, false);
27
-
28
- foreach ($this->modules as $key => $module) {
29
- echo "\n<div id='".SEO_Ultimate::key_to_hook($key)."'>\n";
30
- $this->admin_subheader($module->get_page_title());
31
- $module->admin_page_contents();
32
- echo "</div>\n\n";
33
- }
34
-
35
- $this->admin_form_end(false, false);
36
- }
37
-
38
- function admin_help() {
39
- $help = '';
40
-
41
- foreach ($this->modules as $key => $module) {
42
- if ($childhelp = $module->admin_help())
43
- $help .= "\n<h6>".$module->get_page_title()."</h6>\n$childhelp\n";
44
- }
45
-
46
- if (strlen($help)) return $help; else return false;
47
- }
48
-
49
- }
50
-
51
- }
52
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class.su-widget.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
- /**
3
- * The pseudo-abstract class upon which all widgets are based.
4
- *
5
- * @abstract
6
- * @version 1.0
7
- * @since 0.1
8
- */
9
- class SU_Widget {
10
-
11
- function get_title() { return ''; }
12
- function get_section() { return 'normal'; }
13
- function get_priority(){ return 'core'; }
14
-
15
- function content() { }
16
- }
17
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
functions.php CHANGED
@@ -104,4 +104,121 @@ function su_uninstall() {
104
  global $seo_ultimate;
105
  $seo_ultimate->uninstall();
106
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  ?>
104
  global $seo_ultimate;
105
  $seo_ultimate->uninstall();
106
  }
107
+
108
+ /********** DROPDOWN CODE **********/
109
+
110
+ //Special thanks to the Drafts Dropdown plugin for the abstracted code
111
+ //http://alexking.org/projects/wordpress
112
+
113
+ if (!function_exists('screen_meta_html')) {
114
+
115
+ function screen_meta_html($meta) {
116
+ extract($meta);
117
+ if (function_exists($content)) {
118
+ $content = $content();
119
+ }
120
+ echo '
121
+ <div id="screen-meta-'.$key.'-wrap" class="screen-meta-wrap hidden">
122
+ <div class="screen-meta-content">'.$content.'</div>
123
+ </div>
124
+ <div id="screen-meta-'.$key.'-link-wrap" class="hide-if-no-js screen-meta-toggle cf">
125
+ <a href="#screen-meta-'.$key.'-wrap" id="screen-meta-'.$key.'-link" class="show-settings">'.$label.'</a>
126
+ </div>
127
+ ';
128
+ }
129
+
130
+ }
131
+
132
+ if (!function_exists('screen_meta_output')) {
133
+
134
+ function screen_meta_output() {
135
+ global $screen_meta;
136
+ /*
137
+ expected format:
138
+ $screen_meta = array(
139
+ array(
140
+ 'key' => 'drafts',
141
+ 'label' => 'Drafts',
142
+ 'content' => 'screen_meta_drafts_content' // can be content or function name
143
+ )
144
+ );
145
+ */
146
+ if (!$screen_meta) $screen_meta = array();
147
+ $screen_meta = apply_filters('screen_meta', $screen_meta);
148
+ echo '<div id="screen-meta-extra-content">';
149
+ foreach ($screen_meta as $meta) {
150
+ screen_meta_html($meta);
151
+ }
152
+ echo '</div>';
153
+ ?>
154
+ <style type="text/css">
155
+ .screen-meta-toggle {
156
+ float: right;
157
+ background: transparent url( <?php bloginfo('wpurl'); ?>/wp-admin/images/screen-options-left.gif ) no-repeat 0 0;
158
+ font-family: "Lucida Grande", Verdana, Arial, "Bitstream Vera Sans", sans-serif;
159
+ height: 22px;
160
+ padding: 0;
161
+ margin: 0 6px 0 0;
162
+ }
163
+ .screen-meta-wrap h5 {
164
+ margin: 8px 0;
165
+ font-size: 13px;
166
+ }
167
+ .screen-meta-wrap {
168
+ border-style: none solid solid;
169
+ border-top: 0 none;
170
+ border-width: 0 1px 1px;
171
+ margin: 0 15px;
172
+ padding: 8px 12px 12px;
173
+ -moz-border-radius: 0 0 0 4px;
174
+ -webkit-border-bottom-left-radius: 4px;
175
+ -khtml-border-bottom-left-radius: 4px;
176
+ border-bottom-left-radius: 4px;
177
+ }
178
+ </style>
179
+ <script type="text/javascript">
180
+ jQuery(function($) {
181
+
182
+ // These hacks not needed if adopted into core
183
+ // move tabs into place
184
+ $('#screen-meta-extra-content .screen-meta-toggle.cf').each(function() {
185
+ $('#screen-meta-links').append($(this));
186
+ });
187
+ // Move content into place
188
+ $('#screen-meta-extra-content .screen-meta-wrap').each(function() {
189
+ $('#screen-meta-links').before($(this));
190
+ });
191
+ // end hacks
192
+
193
+ // simplified generic code to handle all screen meta tabs
194
+ $('#screen-meta-links a.show-settings').unbind().click(function() {
195
+ var link = $(this);
196
+ $(link.attr('href')).slideToggle('fast', function() {
197
+ if (link.hasClass('screen-meta-shown')) {
198
+ link.css({'backgroundImage':'url("images/screen-options-right.gif")'}).removeClass('screen-meta-shown');
199
+ $('.screen-meta-toggle').css('visibility', 'visible');
200
+ }
201
+ else {
202
+ $('.screen-meta-toggle').css('visibility', 'hidden');
203
+ link.css({'backgroundImage':'url("images/screen-options-right-up.gif")'}).addClass('screen-meta-shown').parent().css('visibility', 'visible');
204
+ }
205
+ });
206
+ return false;
207
+ });
208
+
209
+ var copy = $('#contextual-help-wrap');
210
+ $('.screen-meta-wrap').css({
211
+ 'background-color': copy.css('background-color'),
212
+ 'border-color': copy.css('border-bottom-color')
213
+ });
214
+
215
+ });
216
+ </script>
217
+
218
+ <?php
219
+ }
220
+ add_action('admin_footer', 'screen_meta_output');
221
+
222
+ }
223
+
224
  ?>
global.css ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ SEO Ultimate CSS
3
+ These styles are sometimes or always referenced outside of SEO Ultimate's admin pages, so we include this file throughout the WordPress admin.
4
+ */
5
+
6
+ /* MENU */
7
+
8
+ #adminmenu #toplevel_page_seo div.wp-menu-image {
9
+ background-image: url(images/icon.png);
10
+ background-position: -1px -33px;
11
+ }
12
+
13
+ #adminmenu #toplevel_page_seo:hover div.wp-menu-image,
14
+ #adminmenu #toplevel_page_seo.wp-has-current-submenu div.wp-menu-image {
15
+ background-position: -1px -1px;
16
+ }
17
+
18
+ /* MESSAGES */
19
+
20
+ .su-success, .su-error,
21
+ .su-warning, .su-info {
22
+ padding-left: 21px;
23
+ background-repeat: no-repeat;
24
+ background-position: 0px center;
25
+ }
26
+
27
+ .su-success {
28
+ background-image: url(images/success.png);
29
+ color: #008000;
30
+ }
31
+
32
+ .su-error {
33
+ background-image: url(images/error.png);
34
+ color: #FF0000;
35
+ }
36
+
37
+ .su-warning {
38
+ background-image: url(images/warning.png);
39
+ color: #FF8C00;
40
+ }
41
+
42
+ .su-info {
43
+ background-image: url(images/info.png);
44
+ color: #0000FF;
45
+ }
46
+
47
+ #wpcontent .su-message p {
48
+ background-position: 10px center;
49
+ padding: 10px 10px 10px 36px;
50
+ margin: 1em 0;
51
+ color: black;
52
+ border-width: 1px;
53
+ border-style: solid;
54
+ }
55
+
56
+ .su-message .su-success {
57
+ background-color: #DFFFE3;
58
+ border-color: #61DF6F;
59
+ }
60
+
61
+ .su-message .su-error {
62
+ background-color: #FFBFBF;
63
+ border-color: #FF0000;
64
+ }
65
+
66
+ .su-message .su-warning {
67
+ background-color: #FFFFE0;
68
+ border-color: orange;
69
+ }
70
+
71
+ .su-message .su-info {
72
+ background-color: #DFEEFF;
73
+ border-color: #8F93FF;
74
+ }
75
+
76
+ /* CONTEXTUAL HELP */
77
+
78
+ div.su-help div.metabox-prefs {
79
+ margin-bottom: 2em;
80
+ }
81
+
82
+ div.su-help ul {
83
+ list-style-type: disc;
84
+ padding-left: 1em;
85
+ margin-left: 1em;
86
+ }
87
+
88
+ div.su-help h6 {
89
+ font-size: 0.9em;
90
+ font-weight: bold;
91
+ margin: 2em 0 0 0;
92
+ padding: 0;
93
+ }
94
+
95
+ /* POSTMETA BOX */
96
+
97
+ #su-postmeta-box table tr {
98
+ vertical-align: middle;
99
+ }
100
+
101
+ #su-postmeta-box table th,
102
+ #su-postmeta-box table td {
103
+ padding: 0.5em 0;
104
+ }
105
+
106
+ #su-postmeta-box table th {
107
+ text-align: right;
108
+ font-weight: bold;
109
+ padding-right: 0.5em;
110
+ }
111
+
112
+ #su-postmeta-box table tr.textarea {
113
+ vertical-align: top;
114
+ }
115
+
116
+ #su-postmeta-box table tr.textarea th label {
117
+ display: block;
118
+ margin-top: 5px;
119
+ }
120
+
121
+ #su-postmeta-box table th em {
122
+ font-weight: normal;
123
+ }
124
+
125
+ #su-postmeta-box table,
126
+ #su-postmeta-box table td,
127
+ #su-postmeta-box table td input.regular-text,
128
+ #su-postmeta-box table td textarea {
129
+ width: 100%;
130
+ }
131
+
132
+ /* PLUGIN NOTICES */
133
+
134
+ #wpwrap .su-plugin-notice .update-message {
135
+ font-weight: normal;
136
+ }
modules.css ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ADMIN PAGES */
2
+
3
+ div.su-module {
4
+ padding-bottom: 1em;
5
+ }
6
+
7
+ div.su-module h3.su-subheader {
8
+ margin-top: 3em;
9
+ padding-top: 1em;
10
+ border-top: 3px solid #ccc;
11
+ }
12
+
13
+ div.su-module table.widefat {
14
+ width: auto;
15
+ margin: 2em 0;
16
+ }
17
+
18
+ div.su-module table.widefat th,
19
+ div.su-module table.widefat td {
20
+ padding-right: 2em;
21
+ }
22
+
23
+ div.su-module table.widefat tr.new-hit td {
24
+ background-color: #DFFFE3;
25
+ }
26
+
27
+ div.su-module .form-table .regular-text {
28
+ width: 325px;
29
+ }
30
+
31
+ div.su-module .form-table td div.field {
32
+ padding-bottom: 1em;
33
+ }
34
+
35
+ div.su-module table.report {
36
+ border-collapse: collapse;
37
+ border-top: 1px solid #ccc;
38
+ }
39
+
40
+ div.su-module table.report th {
41
+ font-weight: normal;
42
+ }
43
+
44
+ div.su-module table.report th, div.su-module table.report td {
45
+ padding: 1em 3em 1em 0;
46
+ border-bottom: 1px solid #ccc;
47
+ text-align: left;
48
+ }
49
+
50
+ /* TABS (Heavily based on CSS from the Breadcrumbs NavXT plugin) */
51
+
52
+ div.su-module .su-tabs ul.ui-tabs-nav {
53
+ border-bottom: 1px solid #dfdfdf;
54
+ font-size: 12px;
55
+ height: 29px;
56
+ list-style: none;
57
+ margin: 13px 0 0;
58
+ overflow: visible;
59
+ padding: 0 0 0 8px;
60
+ }
61
+
62
+ div.su-module .su-tabs ul.ui-tabs-nav li {
63
+ display: block;
64
+ float: left;
65
+ line-height: 200%;
66
+ list-style: none;
67
+ margin: 0;
68
+ padding: 0;
69
+ position: relative;
70
+ text-align: center;
71
+ white-space: nowrap;
72
+ width: auto;
73
+ }
74
+
75
+
76
+ div.su-module .su-tabs ul.ui-tabs-nav li a {
77
+ border-bottom: 1px solid #dfdfdf;
78
+ display: block;
79
+ float: left;
80
+ line-height: 28px;
81
+ padding: 1px 13px 0;
82
+ position: relative;
83
+ text-decoration: none;
84
+ }
85
+
86
+ div.su-module .su-tabs ul.ui-tabs-nav li.ui-tabs-selected a {
87
+ -moz-border-radius-topleft: 4px;
88
+ -moz-border-radius-topright: 4px;
89
+ -webkit-border-top-left-radius: 4px;
90
+ -webkit-border-top-right-radius: 4px;
91
+ border-top-left-radius: 4px;
92
+ border-top-right-radius: 4px;
93
+ border: 1px solid #dfdfdf;
94
+ border-bottom-color: #f9f9f9;
95
+ color: #333333;
96
+ font-weight: normal;
97
+ padding: 0 12px;
98
+ }
99
+
100
+ /* IMPORT MODULES */
101
+
102
+ .su-module table#import-status {
103
+ border: 0;
104
+ width: auto;
105
+ margin: 2em 0;
106
+ }
107
+
108
+ .su-module table#import-status td {
109
+ padding: 0 0.5em 1em 0;
110
+ }
modules.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function su_reset_textbox(id, d, m, e) {
2
+ if (confirm(m+"\n\n"+d)) {
3
+ document.getElementById(id).value=d;
4
+ e.className='hidden';
5
+ }
6
+ }
7
+
8
+ function su_textbox_value_changed(e, d, l) {
9
+ if (e.value==d)
10
+ document.getElementById(l).className='hidden';
11
+ else
12
+ document.getElementById(l).className='';
13
+ }
modules/404s.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * 404 Monitor Module
4
  *
5
- * @version 1.0.2
6
  * @since 0.4
7
  */
8
 
@@ -13,30 +13,42 @@ class SU_404s extends SU_Module {
13
  var $hitset;
14
 
15
  function __construct() {
 
16
  $this->hitset = new SU_HitSet('404s', "status_code=404 AND redirect_url='' AND url NOT LIKE '%/favicon.ico'");
17
  }
18
 
19
  function get_menu_title() { return __('404 Monitor', 'seo-ultimate'); }
20
- function get_menu_count() { return $this->hitset->hits_count(); }
 
 
 
 
 
 
21
 
22
  function admin_page_contents() {
23
 
24
  global $wpdb;
25
  $table = SEO_Ultimate::get_table_name('hits');
26
 
 
27
  if ($this->is_action('delete')) {
28
 
29
- if ($wpdb->query($wpdb->prepare("DELETE FROM $table WHERE id = %d LIMIT 1", $_GET['object'])))
30
  $this->queue_message('success', __('The log entry was successfully deleted.', 'seo-ultimate'));
31
  else
32
  $this->queue_message('error', __('This log entry has already been deleted.', 'seo-ultimate'));
33
 
 
34
  $this->hitset->query_db();
35
 
 
36
  } elseif ($this->is_action('clear')) {
37
 
38
  if ($wpdb->query("DELETE FROM $table WHERE status_code=404")) {
39
  $this->queue_message('success', __('The log was successfully cleared.', 'seo-ultimate'));
 
 
40
  $this->hitset->query_db();
41
  }
42
  }
@@ -48,8 +60,10 @@ class SU_404s extends SU_Module {
48
 
49
  if ($this->hitset->have_hits()) {
50
 
 
51
  $this->hitset->admin_table(array($this, 'hits_table_action_links'));
52
 
 
53
  $clearurl = $this->get_nonce_url('clear');
54
  $confirm = __("Are you sure you want to delete all 404 log entries?", 'seo-ultimate');
55
  echo "<a href=\"$clearurl\" class=\"button-secondary\" onclick=\"javascript:return confirm('$confirm')\">";
@@ -58,6 +72,7 @@ class SU_404s extends SU_Module {
58
  }
59
  }
60
 
 
61
  function hits_table_action_links($row) {
62
  $url = $row['url'];
63
 
@@ -79,45 +94,66 @@ class SU_404s extends SU_Module {
79
  STR;
80
  }
81
 
82
- function admin_help() {
 
83
 
84
- if ($this->hitset->have_hits()) {
85
-
86
- return __(<<<STR
87
- <p>The 404 Monitor keeps track of non-existant URLs that generated 404 errors. 404 errors are when a search engine or visitor comes to a URL on your site but nothing exists at that URL.
88
- The 404 Monitor helps you spot 404 errors; then you can take steps to correct them (e.g. finding the broken links responsible or creating redirects).</p>
89
- <p>A numeric bubble will appear next to the &#8220;404 Monitor&#8221; item on the menu if there are any newly-logged URLs that you haven&#8217;t seen yet.
90
- These new URLs will also be highlighted green in the table.</p>
91
- <p>Hover over a table row to access these options:</p>
 
 
 
 
 
 
92
  <ul>
93
- <li>The &#8220;View&#8221; link will open the URL in a new window. This is useful for testing whether or not a redirect is working.</li>
94
- <li>The &#8220;Google Cache&#8221; link will open Google&#8217;s archived version of the URL in a new window. This is useful for determining what content, if any, used to be located at that URL.</li>
95
- <li>Once you've taken care of a 404 error, you can click the &#8220;Delete Log Entry&#8221; link to remove it from the list. The URL will reappear on the list if it triggers a 404 error in the future.</li>
 
 
 
 
 
 
96
  </ul>
97
- <p>If there are any newly-logged URLs that you haven&#8217;t seen yet, these new URLs will be highlighted green in the table.</p>
98
- <p>Notes:</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  <ul>
100
- <li>In order for the 404 Monitor to track 404 errors, you must have &#8220;Pretty Permalinks&#8221; enabled in your <a href="options-permalink.php">permalink options</a>.</li>
101
- <li>Some parts of your website may not be under WordPress&#8217;s control; the 404 Monitor can&#8217;t track 404 errors on non-WordPress website areas.</li>
102
- <li>The 404 Monitor doesn&#8217;t record 404 errors generated by logged-in users.</li>
103
  </ul>
104
- STR
105
- , 'seo-ultimate');
106
-
107
- } else {
108
 
109
- return __(<<<STR
110
- <p>Currently, the 404 Monitor doesn&#8217;t have any 404 errors in its log. This is good, and means there&#8217;s no action required on your part.
111
- If the 404 Monitor logs any 404 errors in the future, you&#8217;ll see them on this page.</p>
112
- <p>Notes:</p>
113
  <ul>
114
- <li>In order for the 404 Monitor to track 404 errors, you must have &#8220;Pretty Permalinks&#8221; enabled in your <a href="options-permalink.php">permalink options</a>.</li>
115
- <li>Some parts of your website may not be under WordPress&#8217;s control; the 404 Monitor can&#8217;t track 404 errors on non-WordPress website areas.</li>
116
- <li>The 404 Monitor doesn&#8217;t record 404 errors generated by logged-in users.</li>
117
  </ul>
118
- STR
119
- , 'seo-ultimate');
120
- }
121
  }
122
  }
123
 
2
  /**
3
  * 404 Monitor Module
4
  *
5
+ * @version 1.0.4
6
  * @since 0.4
7
  */
8
 
13
  var $hitset;
14
 
15
  function __construct() {
16
+ //Load 404s from the database
17
  $this->hitset = new SU_HitSet('404s', "status_code=404 AND redirect_url='' AND url NOT LIKE '%/favicon.ico'");
18
  }
19
 
20
  function get_menu_title() { return __('404 Monitor', 'seo-ultimate'); }
21
+
22
+ function get_menu_count() {
23
+ //Find out how many *new* 404s there are
24
+ global $wpdb;
25
+ $table = SEO_Ultimate::get_table_name('hits');
26
+ return $wpdb->query("SELECT id FROM $table WHERE status_code=404 AND is_new=1");
27
+ }
28
 
29
  function admin_page_contents() {
30
 
31
  global $wpdb;
32
  $table = SEO_Ultimate::get_table_name('hits');
33
 
34
+ //Are we deleting a 404 entry?
35
  if ($this->is_action('delete')) {
36
 
37
+ if ($wpdb->query($wpdb->prepare("DELETE FROM $table WHERE id = %d LIMIT 1", intval($_GET['object']))))
38
  $this->queue_message('success', __('The log entry was successfully deleted.', 'seo-ultimate'));
39
  else
40
  $this->queue_message('error', __('This log entry has already been deleted.', 'seo-ultimate'));
41
 
42
+ //The database has changed, so reload our data from it
43
  $this->hitset->query_db();
44
 
45
+ //Are we clearing the whole 404 log?
46
  } elseif ($this->is_action('clear')) {
47
 
48
  if ($wpdb->query("DELETE FROM $table WHERE status_code=404")) {
49
  $this->queue_message('success', __('The log was successfully cleared.', 'seo-ultimate'));
50
+
51
+ //The database has changed, so reload our data from it
52
  $this->hitset->query_db();
53
  }
54
  }
60
 
61
  if ($this->hitset->have_hits()) {
62
 
63
+ //Display the 404 table
64
  $this->hitset->admin_table(array($this, 'hits_table_action_links'));
65
 
66
+ //Create the "Clear Log" button
67
  $clearurl = $this->get_nonce_url('clear');
68
  $confirm = __("Are you sure you want to delete all 404 log entries?", 'seo-ultimate');
69
  echo "<a href=\"$clearurl\" class=\"button-secondary\" onclick=\"javascript:return confirm('$confirm')\">";
72
  }
73
  }
74
 
75
+ //Returns the HTML that should appear when the user hovers over a row of the 404s table
76
  function hits_table_action_links($row) {
77
  $url = $row['url'];
78
 
94
  STR;
95
  }
96
 
97
+ function admin_dropdowns() {
98
+ $dropdowns = array();
99
 
100
+ //Overview dropdown
101
+ $dropdowns['overview'] = __('Overview', 'seo-ultimate');
102
+
103
+ //Only show the "Options Help" dropdown if the options in questions are showing
104
+ if ($this->hitset->have_hits()) $dropdowns['options'] = __('Options Help', 'seo-ultimate');
105
+
106
+ //Troubleshooting dropdown
107
+ $dropdowns['troubleshooting'] = __('Troubleshooting', 'seo-ultimate');
108
+
109
+ return $dropdowns;
110
+ }
111
+
112
+ function admin_dropdown_overview() {
113
+ $help = __("
114
  <ul>
115
+ <li><p><strong>What it does:</strong> The 404 Monitor keeps track of non-existant URLs that generated 404 errors.
116
+ 404 errors are when a search engine or visitor comes to a URL on your site but nothing exists at that URL.</p></li>
117
+ <li><p><strong>Why it helps:</strong> The 404 Monitor helps you spot 404 errors;
118
+ then you can take steps to correct them to reduce linkjuice loss from broken links.</p></li>
119
+ <li><p><strong>How to use it:</strong> Check the 404 Monitor occasionally for errors.
120
+ (A numeric bubble will appear next to the &#8220;404 Monitor&#8221; item on the menu if there are any newly-logged URLs that you haven&#8217;t seen yet.
121
+ These new URLs will also be highlighted green in the table.)
122
+ If a 404 error&#8217;s referring URL is located on your site, try locating and fixing the broken URL.
123
+ If moved content was previously located at the requested URL, try using a redirection plugin to point the old URL to the new one.</p></li>
124
  </ul>
125
+ ", 'seo-ultimate');
126
+
127
+ if (!$this->hitset->have_hits()) {
128
+
129
+ //Only show this if we don't have 404s in the log
130
+ $help .= '<p>'.__('Currently, the 404 Monitor doesn&#8217;t have any 404 errors in its log. This is good, and means there&#8217;s no action required on your part. If the 404 Monitor logs any 404 errors in the future, you&#8217;ll see them on this page.', 'seo-ultimate').'</p>';
131
+
132
+ }
133
+
134
+ return $help;
135
+ }
136
+
137
+ function admin_dropdown_options() {
138
+ return __("
139
+ <p>Hover over a table row to access these options:</p>
140
  <ul>
141
+ <li>The &#8220;View&#8221; link will open the URL in a new window. This is useful for testing whether or not a redirect is working.</li>
142
+ <li>The &#8220;Google Cache&#8221; link will open Google&#8217;s archived version of the URL in a new window. This is useful for determining what content, if any, used to be located at that URL.</li>
143
+ <li>Once you've taken care of a 404 error, you can click the &#8220;Delete Log Entry&#8221; link to remove it from the list. The URL will reappear on the list if it triggers a 404 error in the future.</li>
144
  </ul>
145
+ ", 'seo-ultimate');
146
+ }
 
 
147
 
148
+ function admin_dropdown_troubleshooting() {
149
+ return __("
150
+ <p>404 Monitor doesn&#8217;t appear to work? Take these notes into consideration:</p>
 
151
  <ul>
152
+ <li>In order for the 404 Monitor to track 404 errors, you must have &#8220;Pretty Permalinks&#8221; enabled in your <a href="options-permalink.php">permalink options</a>.</li>
153
+ <li>Some parts of your website may not be under WordPress&#8217;s control; the 404 Monitor can&#8217;t track 404 errors on non-WordPress website areas.</li>
154
+ <li>The 404 Monitor doesn&#8217;t record 404 errors generated by logged-in users.</li>
155
  </ul>
156
+ ", 'seo-ultimate');
 
 
157
  }
158
  }
159
 
modules/canonical.php CHANGED
@@ -13,6 +13,7 @@ class SU_Canonical extends SU_Module {
13
  function get_menu_title() { return __('Canonicalizer', 'seo-ultimate'); }
14
 
15
  function init() {
 
16
  if ($this->get_setting('link_rel_canonical'))
17
  add_action('su_head', array($this, 'link_rel_canonical_tag'));
18
  }
@@ -27,6 +28,7 @@ class SU_Canonical extends SU_Module {
27
  }
28
 
29
  function link_rel_canonical_tag() {
 
30
  if ($url = $this->get_canonical_url()) {
31
  $url = attribute_escape($url);
32
  echo "\t<link rel=\"canonical\" href=\"$url\" />\n";
@@ -42,14 +44,14 @@ class SU_Canonical extends SU_Module {
42
  function get_canonical_url() {
43
  global $wp_query, $wp_rewrite;
44
 
 
45
  if ($wp_query->is_404 || $wp_query->is_search) return false;
46
 
 
47
  $haspost = count($wp_query->posts) > 0;
48
 
 
49
  if (get_query_var('m')) {
50
- // Handling special case with '?m=yyyymmddHHMMSS'
51
- // Since there is no code for producing the archive links for
52
- // is_time, we will give up and not try to produce a link.
53
  $m = preg_replace('/[^0-9]/', '', get_query_var('m'));
54
  switch (strlen($m)) {
55
  case 4: // Yearly
@@ -63,49 +65,54 @@ class SU_Canonical extends SU_Module {
63
  substr($m, 6, 2));
64
  break;
65
  default:
 
66
  return false;
67
  }
68
 
 
69
  } elseif (($wp_query->is_single || $wp_query->is_page) && $haspost) {
70
  $post = $wp_query->posts[0];
71
  $link = get_permalink($post->ID);
72
- // WP2.2: In Wordpress 2.2+ is_home() returns false and is_page()
73
- // returns true if front page is a static page.
74
- if ($wp_query->is_page && ('page' == get_option('show_on_front')) &&
75
- $post->ID == get_option('page_on_front'))
76
- $link = trailingslashit($link);
77
-
78
  } elseif ($wp_query->is_author && $haspost) {
79
  $author = get_userdata(get_query_var('author'));
80
  if ($author === false) return false;
81
  $link = get_author_link(false, $author->ID, $author->user_nicename);
82
 
 
83
  } elseif ($wp_query->is_category && $haspost) {
84
  $link = get_category_link(get_query_var('cat'));
85
 
 
86
  } else if ($wp_query->is_tag && $haspost) {
87
  $tag = get_term_by('slug',get_query_var('tag'),'post_tag');
88
  if (!empty($tag->term_id)) $link = get_tag_link($tag->term_id);
89
 
 
90
  } elseif ($wp_query->is_day && $haspost) {
91
  $link = get_day_link(get_query_var('year'),
92
  get_query_var('monthnum'),
93
  get_query_var('day'));
94
 
 
95
  } elseif ($wp_query->is_month && $haspost) {
96
  $link = get_month_link(get_query_var('year'),
97
  get_query_var('monthnum'));
98
 
 
99
  } elseif ($wp_query->is_year && $haspost) {
100
  $link = get_year_link(get_query_var('year'));
101
 
 
102
  } elseif ($wp_query->is_home) {
103
  if ((get_option('show_on_front') == 'page') && ($pageid = get_option('page_for_posts')))
104
  $link = trailingslashit(get_permalink($pageid));
105
  else
106
  $link = trailingslashit(get_option('home'));
107
- } elseif ($wp_query->is_search) {
108
-
109
  } else
110
  return false;
111
 
@@ -120,18 +127,26 @@ class SU_Canonical extends SU_Module {
120
  }
121
  }
122
 
 
123
  return $link;
124
  }
125
 
126
- function admin_help() {
127
- return __(<<<STR
128
- <p>The Canonicalizer helps you avoid duplicate content penalties on your website.</p>
129
- <p>The <strong>Generate <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags</strong> option, when enabled,
130
- will insert code that points Google to the correct URL for your homepage and each of your posts, Pages, categories, tags, date archives, and author archives.
 
 
 
 
 
 
131
  That way, if Google comes across an alternate URL by which one of those items can be accessed, it will be able to find the correct URL
132
- and won&#8217;t penalize you for having two identical pages on your site.</p>
133
- STR
134
- , 'seo-ultimate');
 
135
  }
136
  }
137
 
13
  function get_menu_title() { return __('Canonicalizer', 'seo-ultimate'); }
14
 
15
  function init() {
16
+ //If the canonical tags are enabled, then hook them into the front-end header.
17
  if ($this->get_setting('link_rel_canonical'))
18
  add_action('su_head', array($this, 'link_rel_canonical_tag'));
19
  }
28
  }
29
 
30
  function link_rel_canonical_tag() {
31
+ //Display the canonical tag if a canonical URL is available
32
  if ($url = $this->get_canonical_url()) {
33
  $url = attribute_escape($url);
34
  echo "\t<link rel=\"canonical\" href=\"$url\" />\n";
44
  function get_canonical_url() {
45
  global $wp_query, $wp_rewrite;
46
 
47
+ //404s and search results don't have canonical URLs
48
  if ($wp_query->is_404 || $wp_query->is_search) return false;
49
 
50
+ //Are there posts in the current Loop?
51
  $haspost = count($wp_query->posts) > 0;
52
 
53
+ //Handling special case with '?m=yyyymmddHHMMSS'.
54
  if (get_query_var('m')) {
 
 
 
55
  $m = preg_replace('/[^0-9]/', '', get_query_var('m'));
56
  switch (strlen($m)) {
57
  case 4: // Yearly
65
  substr($m, 6, 2));
66
  break;
67
  default:
68
+ //Since there is no code for producing canonical archive links for is_time, we will give up and not try to produce a link.
69
  return false;
70
  }
71
 
72
+ //Posts and pages
73
  } elseif (($wp_query->is_single || $wp_query->is_page) && $haspost) {
74
  $post = $wp_query->posts[0];
75
  $link = get_permalink($post->ID);
76
+ if (is_front_page()) $link = trailingslashit($link);
77
+
78
+ //Author archives
 
 
 
79
  } elseif ($wp_query->is_author && $haspost) {
80
  $author = get_userdata(get_query_var('author'));
81
  if ($author === false) return false;
82
  $link = get_author_link(false, $author->ID, $author->user_nicename);
83
 
84
+ //Category archives
85
  } elseif ($wp_query->is_category && $haspost) {
86
  $link = get_category_link(get_query_var('cat'));
87
 
88
+ //Tag archives
89
  } else if ($wp_query->is_tag && $haspost) {
90
  $tag = get_term_by('slug',get_query_var('tag'),'post_tag');
91
  if (!empty($tag->term_id)) $link = get_tag_link($tag->term_id);
92
 
93
+ //Day archives
94
  } elseif ($wp_query->is_day && $haspost) {
95
  $link = get_day_link(get_query_var('year'),
96
  get_query_var('monthnum'),
97
  get_query_var('day'));
98
 
99
+ //Month archives
100
  } elseif ($wp_query->is_month && $haspost) {
101
  $link = get_month_link(get_query_var('year'),
102
  get_query_var('monthnum'));
103
 
104
+ //Year archives
105
  } elseif ($wp_query->is_year && $haspost) {
106
  $link = get_year_link(get_query_var('year'));
107
 
108
+ //Homepage
109
  } elseif ($wp_query->is_home) {
110
  if ((get_option('show_on_front') == 'page') && ($pageid = get_option('page_for_posts')))
111
  $link = trailingslashit(get_permalink($pageid));
112
  else
113
  $link = trailingslashit(get_option('home'));
114
+
115
+ //Other
116
  } else
117
  return false;
118
 
127
  }
128
  }
129
 
130
+ //Return the canonical URL
131
  return $link;
132
  }
133
 
134
+ function admin_dropdowns() {
135
+ return array(
136
+ 'overview' => __('Overview', 'seo-ultimate')
137
+ );
138
+ }
139
+
140
+ function admin_dropdown_overview() {
141
+ return __("
142
+ <ul>
143
+ <li><p><strong>What it does:</strong> Canonicalizer inserts <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags to minimize possible exact-content duplication penalties.</p></li>
144
+ <li><p><strong>Why it helps:</strong> These tags will point Google to the correct URL for your homepage and each of your posts, Pages, categories, tags, date archives, and author archives.
145
  That way, if Google comes across an alternate URL by which one of those items can be accessed, it will be able to find the correct URL
146
+ and won&#8217;t penalize you for having two identical pages on your site.</p></li>
147
+ <li><p><strong>How to use it:</strong> Just check the checkbox and click Save Changes. SEO Ultimate will do the rest.</p></li>
148
+ </ul>
149
+ ", 'seo-ultimate');
150
  }
151
  }
152
 
modules/files.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * File Editor Module
4
  *
5
- * @version 1.0
6
  * @since 2.0
7
  */
8
 
@@ -16,13 +16,18 @@ class SU_Files extends SU_Module {
16
 
17
  function init() {
18
 
 
19
  if ($this->get_setting('enable_custom_robotstxt')) {
 
 
20
  remove_action('do_robots', 'do_robots');
21
  add_action('do_robots', array($this, 'do_robots'));
 
 
 
22
  }
23
 
24
- add_action('admin_notices', array($this, 'privacy_options_notice'));
25
-
26
  add_filter('su_get_setting-files-htaccess', array($this, 'get_htaccess'));
27
  add_filter('su_custom_update_setting-files-htaccess', array($this, 'update_htaccess'), 10, 2);
28
  }
@@ -31,16 +36,25 @@ class SU_Files extends SU_Module {
31
 
32
  global $is_apache;
33
 
 
 
 
 
34
  if ($is_apache) {
35
 
 
36
  $htaccess = get_home_path().'.htaccess';
 
 
37
  $exists = file_exists($htaccess);
38
  $writable = is_writable($htaccess);
39
 
40
  if ($exists && !$writable) $this->queue_message('warning',
41
- __('A .htaccess file exists, but it&#8217;s not writable. You can edit it here once the file permissions are corrected.', 'seo-ultimate'));
42
  }
43
 
 
 
44
  if (!strlen(get_option('permalink_structure'))) $this->queue_message('error',
45
  __('WordPress won&#8217;t be able to display your robots.txt file because the default <a href="options-permalink.php" target="_blank">permalink structure</a> is in use.', 'seo-ultimate'));
46
 
@@ -48,7 +62,10 @@ class SU_Files extends SU_Module {
48
 
49
  $this->admin_form_start();
50
 
 
51
  $this->textarea('robotstxt', sprintf(__('robots.txt [<a href="%s" target="_blank">Open</a>]', 'seo-ultimate'), trailingslashit(get_bloginfo('url')).'robots.txt'));
 
 
52
  $this->checkboxes(array(
53
  'enable_custom_robotstxt' => __('Enable this custom robots.txt file and disable the default file', 'seo-ultimate')
54
  , 'enable_do_robotstxt_action' => __('Let other plugins add rules to my custom robots.txt file', 'seo-ultimate')
@@ -57,6 +74,7 @@ class SU_Files extends SU_Module {
57
  $this->queue_message('warning',
58
  __('Please realize that incorrectly editing your robots.txt file could block search engines from your site.', 'seo-ultimate'));
59
 
 
60
  if ($is_apache && ($writable || !$exists)) {
61
  $this->textarea('htaccess', __('.htaccess', 'seo-ultimate'));
62
 
@@ -65,15 +83,21 @@ class SU_Files extends SU_Module {
65
  }
66
 
67
  $this->admin_form_end();
 
 
68
  $this->print_messages();
69
  }
70
 
71
  function do_robots() {
 
 
72
  header( 'Content-Type: text/plain; charset=utf-8' );
73
 
 
74
  if ($this->get_setting('enable_do_robotstxt_action'))
75
  do_action('do_robotstxt');
76
 
 
77
  echo $this->get_setting('robotstxt');
78
  }
79
 
@@ -89,8 +113,10 @@ class SU_Files extends SU_Module {
89
 
90
  function update_htaccess($unused, $value) {
91
 
 
92
  $this->htaccess_recovery = $value;
93
 
 
94
  $htaccess = get_home_path().'.htaccess';
95
  $fp = fopen($htaccess, 'w');
96
  fwrite($fp, $value);
@@ -101,21 +127,43 @@ class SU_Files extends SU_Module {
101
 
102
  function privacy_options_notice() {
103
  global $pagenow;
104
- if ($this->get_setting('enable_custom_robotstxt') && $pagenow == 'options-privacy.php') {
105
- echo '<div class="su-module">';
106
  $this->print_message('info', sprintf(
107
  __('Please note that your privacy settings won&#8217;t have any effect on your robots.txt file, since you&#8217;re using <a href="%s">a custom one</a>.', 'seo-ultimate'),
108
  admin_url('admin.php?page='.SEO_Ultimate::key_to_hook($this->get_module_key()))
109
  ));
110
- echo '</div>';
111
  }
112
  }
113
 
114
- function admin_help() {
115
- return __(<<<STR
116
- <p>The File Editor module lets you edit system files that are of SEO value. Edit the files as desired, then click Save Changes. If you create a custom robots.txt file, be sure to enable it with the checkbox.</p>
117
- STR
118
- , 'seo-ultimate');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  }
120
  }
121
 
2
  /**
3
  * File Editor Module
4
  *
5
+ * @version 1.0.1
6
  * @since 2.0
7
  */
8
 
16
 
17
  function init() {
18
 
19
+ //If the custom robots.txt file is enabled...
20
  if ($this->get_setting('enable_custom_robotstxt')) {
21
+
22
+ //...Remove WordPress's robots.txt handler and replace it with ours.
23
  remove_action('do_robots', 'do_robots');
24
  add_action('do_robots', array($this, 'do_robots'));
25
+
26
+ //...And put a notice on the Privacy options page that the privacy settings won't take effect.
27
+ add_action('admin_notices', array($this, 'privacy_options_notice'));
28
  }
29
 
30
+ //We override the default behavior of saving the custom htaccess contents to the database and instead save the contents to the file
 
31
  add_filter('su_get_setting-files-htaccess', array($this, 'get_htaccess'));
32
  add_filter('su_custom_update_setting-files-htaccess', array($this, 'update_htaccess'), 10, 2);
33
  }
36
 
37
  global $is_apache;
38
 
39
+ //Initialize variables
40
+ $exists = $writable = false;
41
+
42
+ //Does the server run Apache?
43
  if ($is_apache) {
44
 
45
+ //The get_home_path() function is what WordPress uses to locate the htaccess file
46
  $htaccess = get_home_path().'.htaccess';
47
+
48
+ //Does htaccess exist? Is it writable?
49
  $exists = file_exists($htaccess);
50
  $writable = is_writable($htaccess);
51
 
52
  if ($exists && !$writable) $this->queue_message('warning',
53
+ __('A .htaccess file exists, but it&#8217;s not writable. You can edit it here once the file permissions are corrected.', 'seo-ultimate'));
54
  }
55
 
56
+ //WordPress's robots.txt file is dynamically generated, so we need URL rewriting for this to work
57
+ //In the future, I'll likely add support for writing to a static robots.txt file
58
  if (!strlen(get_option('permalink_structure'))) $this->queue_message('error',
59
  __('WordPress won&#8217;t be able to display your robots.txt file because the default <a href="options-permalink.php" target="_blank">permalink structure</a> is in use.', 'seo-ultimate'));
60
 
62
 
63
  $this->admin_form_start();
64
 
65
+ //Show robots.txt textarea
66
  $this->textarea('robotstxt', sprintf(__('robots.txt [<a href="%s" target="_blank">Open</a>]', 'seo-ultimate'), trailingslashit(get_bloginfo('url')).'robots.txt'));
67
+
68
+ //Show robots.txt settings checkboxes
69
  $this->checkboxes(array(
70
  'enable_custom_robotstxt' => __('Enable this custom robots.txt file and disable the default file', 'seo-ultimate')
71
  , 'enable_do_robotstxt_action' => __('Let other plugins add rules to my custom robots.txt file', 'seo-ultimate')
74
  $this->queue_message('warning',
75
  __('Please realize that incorrectly editing your robots.txt file could block search engines from your site.', 'seo-ultimate'));
76
 
77
+ //Of course, only bother with htaccess if we're running Apache.
78
  if ($is_apache && ($writable || !$exists)) {
79
  $this->textarea('htaccess', __('.htaccess', 'seo-ultimate'));
80
 
83
  }
84
 
85
  $this->admin_form_end();
86
+
87
+ //Print the caution message(s) at the end
88
  $this->print_messages();
89
  }
90
 
91
  function do_robots() {
92
+
93
+ //Announce that this is a text file
94
  header( 'Content-Type: text/plain; charset=utf-8' );
95
 
96
+ //Should we allow plugins to add custom rules?
97
  if ($this->get_setting('enable_do_robotstxt_action'))
98
  do_action('do_robotstxt');
99
 
100
+ //Print the custom robots.txt file
101
  echo $this->get_setting('robotstxt');
102
  }
103
 
113
 
114
  function update_htaccess($unused, $value) {
115
 
116
+ //If the write fails, we don't want the user to lose their changes; we save the user's data to a variable so it can be displayed in the textarea
117
  $this->htaccess_recovery = $value;
118
 
119
+ //Overwrite the file
120
  $htaccess = get_home_path().'.htaccess';
121
  $fp = fopen($htaccess, 'w');
122
  fwrite($fp, $value);
127
 
128
  function privacy_options_notice() {
129
  global $pagenow;
130
+ if ($pagenow == 'options-privacy.php') { //Shows on the "Settings > Privacy" page
 
131
  $this->print_message('info', sprintf(
132
  __('Please note that your privacy settings won&#8217;t have any effect on your robots.txt file, since you&#8217;re using <a href="%s">a custom one</a>.', 'seo-ultimate'),
133
  admin_url('admin.php?page='.SEO_Ultimate::key_to_hook($this->get_module_key()))
134
  ));
 
135
  }
136
  }
137
 
138
+ function admin_dropdowns() {
139
+ return array(
140
+ 'overview' => __('Overview', 'seo-ultimate')
141
+ , 'faq' => __('FAQ', 'seo-ultimate')
142
+ );
143
+ }
144
+
145
+ function admin_dropdown_overview() {
146
+ return '<p>'.__('The File Editor module lets you edit system files that are of SEO value. Edit the files as desired, then click Save Changes. If you create a custom robots.txt file, be sure to enable it with the checkbox.', 'seo-ultimate').'</p>';
147
+ }
148
+
149
+ function admin_dropdown_faq() {
150
+ return __("
151
+ <h6>Why do I get a &#8220;500 Server Error&#8221; after using the File Editor?</h6>
152
+
153
+ <p>You may have inserted code into your .htaccess file that your web server can't understand. As the File Editor warns, incorrectly editing your .htaccess file can disable your entire website in this way. To restore your site, you'll need to use an FTP client (or your web host's File Manager) to edit or rename your .htaccess file. If you need help, please contact your web host.</p>
154
+
155
+ <h6>Will my robots.txt edits remain if I disable the File Editor?</h6>
156
+
157
+ <p>No. On a WordPress blog, the robots.txt file is dynamically generated just like your posts and Pages. If you disable the File Editor module or the entire SEO Ultimate plugin, the File Editor won't be able to insert your custom code into the robots.txt file anymore.</p>
158
+
159
+ <h6>Will my .htaccess edits remain if I disable the File Editor?</h6>
160
+
161
+ <p>Yes. The .htaccess file is static. Your edits will remain even if you disable SEO Ultimate or its File Editor module.</p>
162
+
163
+ <h6>Where did my .htaccess edits go?</h6>
164
+
165
+ <p>The .htaccess file is static, so SEO Ultimate doesn't have total control over it. It's possible that WordPress, another plugin, or other software may overwrite your .htaccess file. If you have a backup of your blog's files, you can try recovering your edits from there.</p>
166
+ ", 'seo-ultimate');
167
  }
168
  }
169
 
modules/linkbox.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Linkbox Inserter Module
4
  *
5
- * @version 1.0
6
  * @since 0.6
7
  */
8
 
@@ -13,6 +13,7 @@ class SU_Linkbox extends SU_Module {
13
  function get_menu_title() { return __('Linkbox Inserter', 'seo-ultimate'); }
14
 
15
  function get_default_settings() {
 
16
  return array(
17
  'html' => '<div class="su-linkbox" id="post-{id}-linkbox"><div class="su-linkbox-label">' .
18
  __('Link to this post!', 'seo-ultimate') .
@@ -24,22 +25,20 @@ class SU_Linkbox extends SU_Module {
24
  }
25
 
26
  function init() {
 
27
  add_action('template_redirect', array($this, 'template_init'));
28
  }
29
 
30
  function template_init() {
31
  $enabled = false;
32
 
33
- if ($this->should_linkbox()) {
 
34
  add_filter('the_content', array($this, 'linkbox_filter'));
35
- $enabled = true;
36
- }
37
- if ($this->get_setting('action_hook')) {
38
  add_action('su_linkbox', array($this, 'linkbox_action'));
39
- $enabled = true;
40
- }
41
- if ($enabled && trim($this->get_setting('css')))
42
- add_action('su_head', array($this, 'output_css'));
43
  }
44
 
45
  function admin_page_contents() {
@@ -59,15 +58,23 @@ class SU_Linkbox extends SU_Module {
59
 
60
  function linkbox_filter($content, $id = false) {
61
 
 
62
  if (!$id) $id = SEO_Ultimate::get_post_id();
63
 
64
  if ($id) {
 
 
 
 
 
65
  $linkbox = $this->get_setting('html');
66
  $linkbox = str_replace(
67
  array('{id}', '{url}', '{title}'),
68
  array(intval($id), attribute_escape(get_permalink($id)), attribute_escape(get_the_title($id))),
69
  $linkbox
70
  );
 
 
71
  return $content.$linkbox;
72
  }
73
 
@@ -78,16 +85,25 @@ class SU_Linkbox extends SU_Module {
78
  echo $this->linkbox_filter('', $id);
79
  }
80
 
81
- function output_css() {
82
- echo "\t<style type='text/css'>\n";
83
- echo $this->get_setting('css');
84
- echo "\n\t</style>\n";
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
 
87
- function admin_help() {
88
- return __(<<<STR
89
- <p>The Linkbox Inserter can add linkboxes to your posts/pages. These linkboxes contain HTML code that visitors can use to link to your site.
90
- This is a great way to encourage SEO-beneficial linking activity.</p>
91
  <p>Here&#8217;s information on the various settings:</p>
92
  <ul>
93
  <li><p><strong>Display linkboxes...</strong></p>
@@ -109,8 +125,7 @@ This is a great way to encourage SEO-beneficial linking activity.</p>
109
  </ul>
110
  </li>
111
  </ul>
112
- STR
113
- , 'seo-ultimate');
114
  }
115
  }
116
 
2
  /**
3
  * Linkbox Inserter Module
4
  *
5
+ * @version 1.0.2
6
  * @since 0.6
7
  */
8
 
13
  function get_menu_title() { return __('Linkbox Inserter', 'seo-ultimate'); }
14
 
15
  function get_default_settings() {
16
+ //The default linkbox HTML
17
  return array(
18
  'html' => '<div class="su-linkbox" id="post-{id}-linkbox"><div class="su-linkbox-label">' .
19
  __('Link to this post!', 'seo-ultimate') .
25
  }
26
 
27
  function init() {
28
+ //We only want to filter post content when we're in the front-end, so we hook into template_redirect
29
  add_action('template_redirect', array($this, 'template_init'));
30
  }
31
 
32
  function template_init() {
33
  $enabled = false;
34
 
35
+ if ($this->should_linkbox())
36
+ //Add the linkbox to post/page content
37
  add_filter('the_content', array($this, 'linkbox_filter'));
38
+
39
+ if ($this->get_setting('action_hook'))
40
+ //Enable the action hook
41
  add_action('su_linkbox', array($this, 'linkbox_action'));
 
 
 
 
42
  }
43
 
44
  function admin_page_contents() {
58
 
59
  function linkbox_filter($content, $id = false) {
60
 
61
+ //If no ID is provided, get the ID of the current post
62
  if (!$id) $id = SEO_Ultimate::get_post_id();
63
 
64
  if ($id) {
65
+ //Don't add a linkbox if a "more" link is present (since a linkbox should go at the very bottom of a post)
66
+ $morelink = '<a href="'.get_permalink($id).'#more-'.$id.'" class="more-link">';
67
+ if (strpos($content, $morelink) !== false) return $content;
68
+
69
+ //Load the HTML and replace the variables with the proper values
70
  $linkbox = $this->get_setting('html');
71
  $linkbox = str_replace(
72
  array('{id}', '{url}', '{title}'),
73
  array(intval($id), attribute_escape(get_permalink($id)), attribute_escape(get_the_title($id))),
74
  $linkbox
75
  );
76
+
77
+ //Return the content with the linkbox added to the bottom
78
  return $content.$linkbox;
79
  }
80
 
85
  echo $this->linkbox_filter('', $id);
86
  }
87
 
88
+ function admin_dropdowns() {
89
+ return array(
90
+ 'overview' => __('Overview', 'seo-ultimate')
91
+ , 'settings' => __('Settings Help', 'seo-ultimate')
92
+ );
93
+ }
94
+
95
+ function admin_dropdown_overview() {
96
+ return __("
97
+ <ul>
98
+ <li><p><strong>What it does:</strong> Linkbox Inserter can add linkboxes to your posts/pages.</p></li>
99
+ <li><p><strong>Why it helps:</strong> Linkboxes contain HTML code that visitors can use to link to your site. This is a great way to encourage SEO-beneficial linking activity.</p></li>
100
+ <li><p><strong>How to use it:</strong> Use the checkboxes to enable the Linkbox Inserter in various areas of your site. Customize the HTML if desired. Click &#8220;Save Changes&#8221; when finished.</p></li>
101
+ </ul>
102
+ ", 'seo-ultimate');
103
  }
104
 
105
+ function admin_dropdown_settings() {
106
+ return __("
 
 
107
  <p>Here&#8217;s information on the various settings:</p>
108
  <ul>
109
  <li><p><strong>Display linkboxes...</strong></p>
125
  </ul>
126
  </li>
127
  </ul>
128
+ ", 'seo-ultimate');
 
129
  }
130
  }
131
 
modules/meta.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Meta Editor Module
4
  *
5
- * @version 1.0.2
6
  * @since 0.3
7
  */
8
 
@@ -54,7 +54,7 @@ class SU_Meta extends SU_Module {
54
  $fields['20|description|keywords'] =
55
  "<tr class='textarea'>\n<th scope='row'><label for='$id'>".__("Description:", 'seo-ultimate')."</label></th>\n"
56
  . "<td><textarea name='$id' id='$id' type='text' class='regular-text' cols='60' rows='3'"
57
- . " onkeyup=\"javascript:textbox_char_count('_su_description', 'su_meta_description_charcount')\">$value</textarea>"
58
  . "<br />".sprintf(__("You&#8217;ve entered %s characters. Most search engines use up to 160.", 'seo-ultimate'), "<strong id='su_meta_description_charcount'>".strlen($value)."</strong>")
59
  . "</td>\n</tr>\n"
60
  . $this->get_postmeta_textbox('keywords', __('Keywords:<br /><em>(separate with commas)</em>', 'seo-ultimate'))
@@ -63,6 +63,7 @@ class SU_Meta extends SU_Module {
63
  return $fields;
64
  }
65
 
 
66
  function meta_robots($commands) {
67
 
68
  $tags = array('noodp', 'noydir', 'noarchive');
@@ -79,31 +80,38 @@ class SU_Meta extends SU_Module {
79
  $desc = false;
80
  $kw = false;
81
 
 
82
  if (is_home()) {
83
  $desc = $this->get_setting('home_description');
84
  if (!$desc && $this->get_setting('home_description_tagline_default')) $desc = get_bloginfo('description');
85
  $kw = $this->get_setting('home_keywords');
 
 
86
  } elseif (is_singular()) {
87
  $desc = $this->get_postmeta('description');
88
  $kw = $this->get_postmeta('keywords');
89
  }
90
 
 
91
  if ($desc) {
92
  $desc = su_esc_attr($desc);
93
  echo "\t<meta name=\"description\" content=\"$desc\" />\n";
94
  }
95
 
 
96
  if ($kw) {
97
  $kw = su_esc_attr($kw);
98
  echo "\t<meta name=\"keywords\" content=\"$kw\" />\n";
99
  }
100
 
 
101
  $verify = array(
102
  'google' => 'verify-v1'
103
  , 'yahoo' => 'y_key'
104
  , 'microsoft' => 'msvalidate.01'
105
  );
106
 
 
107
  foreach ($verify as $site => $name) {
108
  if ($value = $this->get_setting($site.'_verify')) {
109
  $value = su_esc_attr($value);
@@ -111,8 +119,10 @@ class SU_Meta extends SU_Module {
111
  }
112
  }
113
 
 
114
  if ($custom = $this->get_setting('custom_html')) {
115
 
 
116
  $mark_code = $this->get_setting('mark_code', false, 'settings');
117
  $desc = __('Custom Header Code', 'seo-ultimate');
118
 
@@ -125,9 +135,25 @@ class SU_Meta extends SU_Module {
125
 
126
  }
127
 
128
- function admin_help() {
129
- return __(<<<STR
130
- <p>The Meta Editor lets you customize a wide variety of settings known as &#8220;meta data.&#8221;</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  <p>Here&#8217;s information on the various settings:</p>
132
  <ul>
133
  <li><p><strong>Blog Homepage Meta Description</strong> &mdash; When your blog homepage appears in search results, it&#8217;ll have a title and a description.
@@ -145,8 +171,8 @@ class SU_Meta extends SU_Module {
145
  <li><p><strong>Spider Instructions</strong></p>
146
  <ul>
147
  <li><p><strong>Don&#8217;t use this site&#8217;s Open Directory / Yahoo! Directory description in search results.</strong> &mdash;
148
- If your site is listed in the <a href="http://www.dmoz.org/" target="_blank">Open Directory (DMOZ)</a> or
149
- the <a href="http://dir.yahoo.com/" target="_blank">Yahoo! Directory</a>,
150
  some search engines may use your directory listing as the meta description.
151
  These boxes tell search engines not to do that and will give you full control over your meta descriptions.
152
  These settings have no effect if your site isn&#8217;t listed in the Open Directory or Yahoo! Directory respectively.</p></li>
@@ -158,8 +184,7 @@ class SU_Meta extends SU_Module {
158
  <li><p><strong>Verification Codes</strong> &mdash; This section lets you enter in verification codes for the webmaster portals of the 3 leading search engines.</p></li>
159
  <li><p><strong>Custom &lt;head&gt; HTML</strong> &mdash; Just enter in raw HTML code here, and it&#8217;ll be entered into the &lt;head&gt; tag across your entire site.</p></li>
160
  </ul>
161
- STR
162
- , 'seo-ultimate');
163
  }
164
 
165
  function postmeta_help($help) {
2
  /**
3
  * Meta Editor Module
4
  *
5
+ * @version 1.0.3
6
  * @since 0.3
7
  */
8
 
54
  $fields['20|description|keywords'] =
55
  "<tr class='textarea'>\n<th scope='row'><label for='$id'>".__("Description:", 'seo-ultimate')."</label></th>\n"
56
  . "<td><textarea name='$id' id='$id' type='text' class='regular-text' cols='60' rows='3'"
57
+ . " onkeyup=\"javascript:document.getElementById('su_meta_description_charcount').innerHTML = document.getElementById('_su_description').value.length\">$value</textarea>"
58
  . "<br />".sprintf(__("You&#8217;ve entered %s characters. Most search engines use up to 160.", 'seo-ultimate'), "<strong id='su_meta_description_charcount'>".strlen($value)."</strong>")
59
  . "</td>\n</tr>\n"
60
  . $this->get_postmeta_textbox('keywords', __('Keywords:<br /><em>(separate with commas)</em>', 'seo-ultimate'))
63
  return $fields;
64
  }
65
 
66
+ //Add the appropriate commands to the meta robots array
67
  function meta_robots($commands) {
68
 
69
  $tags = array('noodp', 'noydir', 'noarchive');
80
  $desc = false;
81
  $kw = false;
82
 
83
+ //If we're viewing the homepage, look for homepage meta data.
84
  if (is_home()) {
85
  $desc = $this->get_setting('home_description');
86
  if (!$desc && $this->get_setting('home_description_tagline_default')) $desc = get_bloginfo('description');
87
  $kw = $this->get_setting('home_keywords');
88
+
89
+ //If we're viewing a post or page, look for its meta data.
90
  } elseif (is_singular()) {
91
  $desc = $this->get_postmeta('description');
92
  $kw = $this->get_postmeta('keywords');
93
  }
94
 
95
+ //Do we have a description? If so, output it.
96
  if ($desc) {
97
  $desc = su_esc_attr($desc);
98
  echo "\t<meta name=\"description\" content=\"$desc\" />\n";
99
  }
100
 
101
+ //Do we have keywords? If so, output them.
102
  if ($kw) {
103
  $kw = su_esc_attr($kw);
104
  echo "\t<meta name=\"keywords\" content=\"$kw\" />\n";
105
  }
106
 
107
+ //Supported meta tags and their names
108
  $verify = array(
109
  'google' => 'verify-v1'
110
  , 'yahoo' => 'y_key'
111
  , 'microsoft' => 'msvalidate.01'
112
  );
113
 
114
+ //Do we have verification tags? If so, output them.
115
  foreach ($verify as $site => $name) {
116
  if ($value = $this->get_setting($site.'_verify')) {
117
  $value = su_esc_attr($value);
119
  }
120
  }
121
 
122
+ //Display custom code if provided
123
  if ($custom = $this->get_setting('custom_html')) {
124
 
125
+ //Does the plugin user want us to surround code insertions with comments? If so, mark the custom code as such.
126
  $mark_code = $this->get_setting('mark_code', false, 'settings');
127
  $desc = __('Custom Header Code', 'seo-ultimate');
128
 
135
 
136
  }
137
 
138
+ function admin_dropdowns() {
139
+ return array(
140
+ 'overview' => __('Overview', 'seo-ultimate')
141
+ , 'settings' => __('Settings Help', 'seo-ultimate')
142
+ );
143
+ }
144
+
145
+ function admin_dropdown_overview() {
146
+ return __("
147
+ <ul>
148
+ <li><p><strong>What it does:</strong> Meta Editor lets you customize a wide variety of settings known as &#8220;meta data.&#8221;</p></li>
149
+ <li><p><strong>Why it helps:</strong> Using meta data, you can convey information to search engines, such as what text you want displayed by your site in search results, what your site is about, whether they can cache your site, etc.</p></li>
150
+ <li><p><strong>How to use it:</strong> Adjust the settings as desired, and then click Save Changes. You can refer to the &#8220;Settings Help&#8221; tab for information on the settings available. You can also customize the meta data of an individual post or page by using the textboxes that Meta Editor adds to the post/page editors.</p></li>
151
+ </ul>
152
+ ", 'seo-ultimate');
153
+ }
154
+
155
+ function admin_dropdown_settings() {
156
+ return __("
157
  <p>Here&#8217;s information on the various settings:</p>
158
  <ul>
159
  <li><p><strong>Blog Homepage Meta Description</strong> &mdash; When your blog homepage appears in search results, it&#8217;ll have a title and a description.
171
  <li><p><strong>Spider Instructions</strong></p>
172
  <ul>
173
  <li><p><strong>Don&#8217;t use this site&#8217;s Open Directory / Yahoo! Directory description in search results.</strong> &mdash;
174
+ If your site is listed in the <a href='http://www.dmoz.org/' target='_blank'>Open Directory (DMOZ)</a> or
175
+ the <a href='http://dir.yahoo.com/' target='_blank'>Yahoo! Directory</a>,
176
  some search engines may use your directory listing as the meta description.
177
  These boxes tell search engines not to do that and will give you full control over your meta descriptions.
178
  These settings have no effect if your site isn&#8217;t listed in the Open Directory or Yahoo! Directory respectively.</p></li>
184
  <li><p><strong>Verification Codes</strong> &mdash; This section lets you enter in verification codes for the webmaster portals of the 3 leading search engines.</p></li>
185
  <li><p><strong>Custom &lt;head&gt; HTML</strong> &mdash; Just enter in raw HTML code here, and it&#8217;ll be entered into the &lt;head&gt; tag across your entire site.</p></li>
186
  </ul>
187
+ ", 'seo-ultimate');
 
188
  }
189
 
190
  function postmeta_help($help) {
modules/modules.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Module Manager Module
4
  *
5
- * @version 1.1
6
  * @since 0.7
7
  */
8
 
@@ -32,7 +32,9 @@ class SU_Modules extends SU_Module {
32
  global $seo_ultimate;
33
 
34
  echo "<p>";
35
- _e("Here you can disable or hide modules you don&#8217;t use. You can also silence modules from displaying bubble alerts on the menu.", 'seo-ultimate');
 
 
36
  echo "</p>";
37
 
38
  $this->admin_form_start(false, false);
@@ -104,7 +106,7 @@ STR;
104
  }
105
 
106
  function admin_help() {
107
- return __(<<<STR
108
  <p>The Module Manager lets you customize the visibility and accessibility of each module; here are the options available:</p>
109
  <ul>
110
  <li><strong>Enabled</strong> &mdash; The default option. The module will be fully enabled and accessible.</li>
@@ -112,8 +114,7 @@ STR;
112
  <li><strong>Hidden</strong> &mdash; The module&#8217;s functionality will be enabled, but the module won&#8217;t be visible on the SEO menu. You will still be able to access the module&#8217;s admin page by clicking on its title in the Module Manager table.</li>
113
  <li><strong>Disabled</strong> &mdash; The module will be completely disabled and inaccessible.</li>
114
  </ul>
115
- STR
116
- , 'seo-ultimate');
117
  }
118
  }
119
 
2
  /**
3
  * Module Manager Module
4
  *
5
+ * @version 1.1.1
6
  * @since 0.7
7
  */
8
 
32
  global $seo_ultimate;
33
 
34
  echo "<p>";
35
+ _e("SEO Ultimate&#8217;s features are located in groups called &#8220;modules.&#8221; By default, most of these modules are listed in the &#8220;SEO&#8221; menu on the left. Whenever you&#8217;re working with a module, you can view documentation by clicking the &#8220;Help&#8221; tab in the upper-right-hand corner of your administration screen.", 'seo-ultimate');
36
+ echo "</p><p>";
37
+ _e("The Module Manager lets you disable or hide modules you don&#8217;t use. You can also silence modules from displaying bubble alerts on the menu.", 'seo-ultimate');
38
  echo "</p>";
39
 
40
  $this->admin_form_start(false, false);
106
  }
107
 
108
  function admin_help() {
109
+ return __("
110
  <p>The Module Manager lets you customize the visibility and accessibility of each module; here are the options available:</p>
111
  <ul>
112
  <li><strong>Enabled</strong> &mdash; The default option. The module will be fully enabled and accessible.</li>
114
  <li><strong>Hidden</strong> &mdash; The module&#8217;s functionality will be enabled, but the module won&#8217;t be visible on the SEO menu. You will still be able to access the module&#8217;s admin page by clicking on its title in the Module Manager table.</li>
115
  <li><strong>Disabled</strong> &mdash; The module will be completely disabled and inaccessible.</li>
116
  </ul>
117
+ ", 'seo-ultimate');
 
118
  }
119
  }
120
 
modules/noindex.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Noindex Manager Module
4
  *
5
- * @version 1.0.1
6
  * @since 0.1
7
  */
8
 
@@ -14,20 +14,27 @@ class SU_Noindex extends SU_Module {
14
 
15
  function init() {
16
 
 
17
  add_action('su_meta_robots', array($this, 'wphead_noindex'), 1);
18
 
 
 
 
19
  if ($this->get_setting('noindex_comments_feed'))
20
  add_action('commentsrss2_head', array($this, 'rss2_noindex_tag'));
21
-
 
22
  if ($this->get_setting('noindex_admin'))
23
  add_action('admin_head', array($this, 'xhtml_noindex_tag'));
24
-
 
25
  if ($this->get_setting('noindex_login'))
26
  add_action('login_head', array($this, 'xhtml_noindex_tag'));
27
  }
28
 
29
  function admin_page_contents() {
30
 
 
31
  if (!get_option('blog_public'))
32
  $this->queue_message('error',
33
  __("Note: The current <a href='options-privacy.php'>privacy settings</a> will block indexing of the entire site, regardless of which options are set below.", 'seo-ultimate') );
@@ -39,7 +46,7 @@ class SU_Noindex extends SU_Module {
39
  , 'noindex_search' => __('Blog search pages', 'seo-ultimate')
40
  , 'noindex_category' => __('Category archives', 'seo-ultimate')
41
  , 'noindex_comments_feed' => __('Comment feeds', 'seo-ultimate')
42
- //, 'noindex_cpage' => __('Comment subpages', 'seo-ultimate')
43
  , 'noindex_date' => __('Date-based archives', 'seo-ultimate')
44
  , 'noindex_home_paged' => __('Subpages of the homepage', 'seo-ultimate')
45
  , 'noindex_tag' => __('Tag archives', 'seo-ultimate')
@@ -50,7 +57,7 @@ class SU_Noindex extends SU_Module {
50
 
51
  function wphead_noindex($commands) {
52
 
53
- if ($this->should_noindex() || ($this->get_setting('noindex_home_paged') && is_home() && is_paged()))
54
  array_push($commands, 'noindex', 'nofollow');
55
 
56
  return $commands;
@@ -63,6 +70,15 @@ class SU_Noindex extends SU_Module {
63
  foreach ($checks as $setting) {
64
  if (call_user_func("is_$setting")) return $this->get_setting("noindex_$setting");
65
  }
 
 
 
 
 
 
 
 
 
66
  }
67
 
68
  function rss2_noindex_tag() {
@@ -73,10 +89,25 @@ class SU_Noindex extends SU_Module {
73
  echo "\t<meta name=\"robots\" content=\"noindex\" />\n";
74
  }
75
 
76
- function admin_help() {
77
- return __(<<<STR
78
- <p>The Noindex Manager lets you prohibit the search engine spiders from indexing certain pages on your blog using the &quot;meta robots noindex&quot; tag.
79
- This is useful for removing pages that contain unimportant content (e.g. the login page), or pages that mostly contain duplicate content.</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  <p>Here&#8217;s information on the various settings:</p>
81
  <ul>
82
  <li><p><strong>Administration back-end pages</strong> &mdash; Tells spiders not to index the administration area (the part you&#8217;re in now),
@@ -86,6 +117,7 @@ This is useful for removing pages that contain unimportant content (e.g. the log
86
  <li><p><strong>Category archives</strong> &mdash; Tells spiders not to index category archives. Recommended only if you don&#8217;t use categories.</p></li>
87
  <li><p><strong>Comment feeds</strong> &mdash; Tells spiders not to index the RSS feeds that exist for every post&#8217;s comments.
88
  (These comment feeds are totally separate from your normal blog feeds.) Recommended.</p></li>
 
89
  <li><p><strong>Date-based archives</strong> &mdash; Tells spiders not to index day/month/year archives.
90
  Recommended, since these pages have little keyword value.</p></li>
91
  <li><p><strong>Subpages of the homepage</strong> &mdash; Tells spiders not to index the homepage's subpages (page 2, page 3, etc).
@@ -93,8 +125,7 @@ This is useful for removing pages that contain unimportant content (e.g. the log
93
  <li><p><strong>Tag archives</strong> &mdash; Tells spiders not to index tag archives. Recommended only if you don&#8217;t use tags.</p></li>
94
  <li><p><strong>User login/registration pages</strong> &mdash; Tells spiders not to index WordPress&#8217;s user login and registration pages. Recommended.</p></li>
95
  </ul>
96
- STR
97
- , 'seo-ultimate');
98
  }
99
  }
100
 
2
  /**
3
  * Noindex Manager Module
4
  *
5
+ * @version 1.0.2
6
  * @since 0.1
7
  */
8
 
14
 
15
  function init() {
16
 
17
+ //Hook into our wp_head() action
18
  add_action('su_meta_robots', array($this, 'wphead_noindex'), 1);
19
 
20
+ //Now we'll hook into places where wp_head() is not called
21
+
22
+ //Hook into comment feed headers
23
  if ($this->get_setting('noindex_comments_feed'))
24
  add_action('commentsrss2_head', array($this, 'rss2_noindex_tag'));
25
+
26
+ //Hook into the admin header
27
  if ($this->get_setting('noindex_admin'))
28
  add_action('admin_head', array($this, 'xhtml_noindex_tag'));
29
+
30
+ //Hook into the login header
31
  if ($this->get_setting('noindex_login'))
32
  add_action('login_head', array($this, 'xhtml_noindex_tag'));
33
  }
34
 
35
  function admin_page_contents() {
36
 
37
+ //If global noindex tags are enabled, these settings will be moot, so notify the user.
38
  if (!get_option('blog_public'))
39
  $this->queue_message('error',
40
  __("Note: The current <a href='options-privacy.php'>privacy settings</a> will block indexing of the entire site, regardless of which options are set below.", 'seo-ultimate') );
46
  , 'noindex_search' => __('Blog search pages', 'seo-ultimate')
47
  , 'noindex_category' => __('Category archives', 'seo-ultimate')
48
  , 'noindex_comments_feed' => __('Comment feeds', 'seo-ultimate')
49
+ , 'noindex_cpage' => __('Comment subpages', 'seo-ultimate')
50
  , 'noindex_date' => __('Date-based archives', 'seo-ultimate')
51
  , 'noindex_home_paged' => __('Subpages of the homepage', 'seo-ultimate')
52
  , 'noindex_tag' => __('Tag archives', 'seo-ultimate')
57
 
58
  function wphead_noindex($commands) {
59
 
60
+ if ($this->should_noindex())
61
  array_push($commands, 'noindex', 'nofollow');
62
 
63
  return $commands;
70
  foreach ($checks as $setting) {
71
  if (call_user_func("is_$setting")) return $this->get_setting("noindex_$setting");
72
  }
73
+
74
+ //Homepage subpages
75
+ if ($this->get_setting('noindex_home_paged') && is_home() && is_paged()) return true;
76
+
77
+ //Comment subpages
78
+ global $wp_query;
79
+ if ($this->get_setting('noindex_cpage') && isset($wp_query->query_vars['cpage'])) return true;
80
+
81
+ return false;
82
  }
83
 
84
  function rss2_noindex_tag() {
89
  echo "\t<meta name=\"robots\" content=\"noindex\" />\n";
90
  }
91
 
92
+ function admin_dropdowns() {
93
+ return array(
94
+ 'overview' => __('Overview', 'seo-ultimate')
95
+ , 'settings' => __('Settings Help', 'seo-ultimate')
96
+ );
97
+ }
98
+
99
+ function admin_dropdown_overview() {
100
+ return __("
101
+ <ul>
102
+ <li><p><strong>What it does:</strong> Noindex Manager lets you prohibit the search engine spiders from indexing certain pages on your blog using the &quot;meta robots noindex&quot; tag.</p></li>
103
+ <li><p><strong>Why it helps:</strong> This module lets you &#8220;noindex&#8221; pages that contain unimportant content (e.g. the login page), or pages that mostly contain duplicate content.</p></li>
104
+ <li><p><strong>How to use it:</strong> Adjust the settings as desired, and then click Save Changes. You can refer to the &#8220;Settings Help&#8221; tab for information on the settings available.</p></li>
105
+ </ul>
106
+ ", 'seo-ultimate');
107
+ }
108
+
109
+ function admin_dropdown_settings() {
110
+ return __("
111
  <p>Here&#8217;s information on the various settings:</p>
112
  <ul>
113
  <li><p><strong>Administration back-end pages</strong> &mdash; Tells spiders not to index the administration area (the part you&#8217;re in now),
117
  <li><p><strong>Category archives</strong> &mdash; Tells spiders not to index category archives. Recommended only if you don&#8217;t use categories.</p></li>
118
  <li><p><strong>Comment feeds</strong> &mdash; Tells spiders not to index the RSS feeds that exist for every post&#8217;s comments.
119
  (These comment feeds are totally separate from your normal blog feeds.) Recommended.</p></li>
120
+ <li><p><strong>Comment subpages</strong> &mdash; Tells spiders not to index comment subpages (page 2, page 3, etc.).</p></li>
121
  <li><p><strong>Date-based archives</strong> &mdash; Tells spiders not to index day/month/year archives.
122
  Recommended, since these pages have little keyword value.</p></li>
123
  <li><p><strong>Subpages of the homepage</strong> &mdash; Tells spiders not to index the homepage's subpages (page 2, page 3, etc).
125
  <li><p><strong>Tag archives</strong> &mdash; Tells spiders not to index tag archives. Recommended only if you don&#8217;t use tags.</p></li>
126
  <li><p><strong>User login/registration pages</strong> &mdash; Tells spiders not to index WordPress&#8217;s user login and registration pages. Recommended.</p></li>
127
  </ul>
128
+ ", 'seo-ultimate');
 
129
  }
130
  }
131
 
modules/settings.php CHANGED
@@ -2,23 +2,23 @@
2
  /**
3
  * Settings Module
4
  *
5
- * @version 2.2
6
  * @since 0.2
7
  */
8
 
9
  if (class_exists('SU_Module')) {
10
 
11
  class SU_Settings extends SU_Module {
12
-
13
  var $wp_meta_called = false;
14
-
15
  function get_page_title() { return __('SEO Ultimate Plugin Settings', 'seo-ultimate'); }
16
  function get_menu_title() { return __('SEO Ultimate', 'seo-ultimate'); }
17
  function get_menu_parent(){ return 'options-general.php'; }
18
-
19
  function get_default_settings() {
20
  return array(
21
- 'attribution_link' => true
22
  , 'attribution_link_css' => true
23
  , 'plugin_notices' => true
24
  );
@@ -166,7 +166,7 @@ class SU_Settings extends SU_Module {
166
  }
167
 
168
  function admin_help() {
169
- return __(<<<STR
170
  <p>The Settings module lets you manage settings related to the SEO Ultimate plugin as a whole.</p>
171
  <p>Here&#8217;s information on each of the settings:</p>
172
  <ul>
@@ -175,8 +175,7 @@ class SU_Settings extends SU_Module {
175
  <li><p><strong>Insert comments around HTML code insertions</strong> &mdash; If enabled, SEO Ultimate will use HTML comments to identify all code it inserts into your &lt;head&gt; tag.
176
  This is useful if you&#8217;re trying to figure out whether or not SEO Ultimate is inserting a certain piece of header code.</p></li>
177
  </ul>
178
- STR
179
- , 'seo-ultimate');
180
  }
181
 
182
  }
2
  /**
3
  * Settings Module
4
  *
5
+ * @version 2.2.1
6
  * @since 0.2
7
  */
8
 
9
  if (class_exists('SU_Module')) {
10
 
11
  class SU_Settings extends SU_Module {
12
+
13
  var $wp_meta_called = false;
14
+
15
  function get_page_title() { return __('SEO Ultimate Plugin Settings', 'seo-ultimate'); }
16
  function get_menu_title() { return __('SEO Ultimate', 'seo-ultimate'); }
17
  function get_menu_parent(){ return 'options-general.php'; }
18
+
19
  function get_default_settings() {
20
  return array(
21
+ 'attribution_link' => false
22
  , 'attribution_link_css' => true
23
  , 'plugin_notices' => true
24
  );
166
  }
167
 
168
  function admin_help() {
169
+ return __("
170
  <p>The Settings module lets you manage settings related to the SEO Ultimate plugin as a whole.</p>
171
  <p>Here&#8217;s information on each of the settings:</p>
172
  <ul>
175
  <li><p><strong>Insert comments around HTML code insertions</strong> &mdash; If enabled, SEO Ultimate will use HTML comments to identify all code it inserts into your &lt;head&gt; tag.
176
  This is useful if you&#8217;re trying to figure out whether or not SEO Ultimate is inserting a certain piece of header code.</p></li>
177
  </ul>
178
+ ", 'seo-ultimate');
 
179
  }
180
 
181
  }
modules/slugs.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Slug Optimizer Module
4
+ *
5
+ * @version 1.0
6
+ * @since 0.9
7
+ */
8
+
9
+ if (class_exists('SU_Module')) {
10
+
11
+ class SU_Slugs extends SU_Module {
12
+
13
+ function get_menu_title() { return __('Slug Optimizer', 'seo-ultimate'); }
14
+
15
+ function admin_page_contents() {
16
+ $this->admin_form_start();
17
+ $this->textarea('words_to_remove', __('Words to Remove', 'seo-ultimate'), 20);
18
+ $this->admin_form_end();
19
+ }
20
+
21
+ function init() {
22
+
23
+ //Only sanitize if a permalink is being requested via AJAX
24
+ if ($_POST['action'] == 'sample-permalink')
25
+ //The filter priority is very important to ensure our function runs before WordPress's sanitize_title_with_dashes() function
26
+ add_filter('sanitize_title', array($this, 'remove_words_from_title'), 9);
27
+ }
28
+
29
+ function remove_words_from_title($title) {
30
+
31
+ if (strcmp($title, $_POST['new_title']) == 0) {
32
+ //An empty slug was given, so the post title is being used as the default! Call to action!
33
+
34
+ //Remove the stopwords from the slug
35
+ $newtitle = implode("-", array_diff(explode(" ", $title), explode("\n", $this->get_setting('words_to_remove'))));
36
+
37
+ //Make sure we haven't removed too much!
38
+ if (!empty($newtitle)) return $newtitle;
39
+ }
40
+
41
+ return $title;
42
+ }
43
+
44
+ function admin_dropdowns() {
45
+ return array(
46
+ 'overview' => __('Overview', 'seo-ultimate')
47
+ , 'faq' => __('FAQ', 'seo-ultimate')
48
+ );
49
+ }
50
+
51
+ function admin_dropdown_overview() {
52
+ return __("
53
+ <ul>
54
+ <li><p><strong>What it does:</strong> Slug Optimizer removes common words from the portion of a post&#8217;s or Page&#8217;s URL that is based on its title. (This portion is also known as the &#8220;slug.&#8221;)</p></li>
55
+ <li><p><strong>Why it helps:</strong> Slug Optimizer increases keyword potency because there are fewer words in your URLs competing for relevance.</p></li>
56
+ <li><p><strong>How to use it:</strong> Slug Optimizer goes to work when you&#8217;re editing a post or Page, with no action required on your part.
57
+ If needed, you can use the textbox below to customize which words are removed.</p></li>
58
+ </ul>
59
+ ", 'seo-ultimate');
60
+ }
61
+
62
+ function admin_dropdown_faq() {
63
+ return __("
64
+ <h6>What's a slug?</h6>
65
+ <p>The slug of a post or page is the portion of its URL that is based on its title.</p>
66
+ <p>When you edit a post or Page in WordPress, the slug is the yellow-highlighted portion of the Permalink beneath the Title textbox.</p>
67
+
68
+ <h6>Does the Slug Optimizer change my existing URLs?</h6>
69
+ <p>No. Slug Optimizer will not relocate your content by changing existing URLs. Slug Optimizer only takes effect on new posts and pages.</p>
70
+
71
+ <h6>How do I see Slug Optimizer in action?</h6>
72
+ <ol>
73
+ <li>Create a new post/Page in WordPress.</li>
74
+ <li>Type in a title containing some common words.</li>
75
+ <li>Click outside the Title box. WordPress will insert a URL labeled &#8220;Permalink&#8221; below the Title textbox. The Slug Optimizer will have removed the common words from the URL.</li>
76
+ </ol>
77
+
78
+ <h6>Why didn't the Slug Optimizer remove common words from my slug?</h6>
79
+ <p>It's possible that every word in your post title is in the list of words to remove. In this case, Slug Optimizer doesn't remove the words, because if it did, you'd end up with a blank slug.</p>
80
+
81
+ <h6>What if I want to include a common word in my slug?</h6>
82
+ <p>When editing the post or page in question, just click the Edit button next to the permalink and change the slug as desired.</p>
83
+
84
+ <h6>How do I revert back to the optimized slug after making changes?</h6>
85
+ <p>When editing the post or page in question, just click the Edit button next to the permalink; a Save button will appear in its place. Next erase the contents of the textbox, and then click the aforementioned Save button.</p>
86
+ ", 'seo-ultimate');
87
+ }
88
+
89
+ function get_default_settings() {
90
+
91
+ //Special thanks to the "SEO Slugs" plugin for the stopwords array.
92
+ //http://wordpress.org/extend/plugins/seo-slugs/
93
+ $defaults = array ("a", "able", "about", "above", "abroad", "according", "accordingly", "across", "actually", "adj", "after", "afterwards", "again", "against", "ago", "ahead", "ain't", "all", "allow", "allows", "almost", "alone", "along", "alongside", "already", "also", "although", "always", "am", "amid", "amidst", "among", "amongst", "an", "and", "another", "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", "appreciate", "appropriate", "are", "aren't", "around", "as", "a's", "aside", "ask", "asking", "associated", "at", "available", "away", "awfully", "b", "back", "backward", "backwards", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "begin", "behind", "being", "believe", "below", "beside", "besides", "best", "better", "between", "beyond", "both", "brief", "but", "by", "c", "came", "can", "cannot", "cant", "can't", "caption", "cause", "causes", "certain", "certainly", "changes", "clearly", "c'mon", "co", "co.", "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", "containing", "contains", "corresponding", "could", "couldn't", "course", "c's", "currently", "d", "dare", "daren't", "definitely", "described", "despite", "did", "didn't", "different", "directly", "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "during", "e", "each", "edu", "eg", "eight", "eighty", "either", "else", "elsewhere", "end", "ending", "enough", "entirely", "especially", "et", "etc", "even", "ever", "evermore", "every", "everybody", "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "f", "fairly", "far", "farther", "few", "fewer", "fifth", "first", "five", "followed", "following", "follows", "for", "forever", "former", "formerly", "forth", "forward", "found", "four", "from", "further", "furthermore", "g", "get", "gets", "getting", "given", "gives", "go", "goes", "going", "gone", "got", "gotten", "greetings", "h", "had", "hadn't", "half", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "hello", "help", "hence", "her", "here", "hereafter", "hereby", "herein", "here's", "hereupon", "hers", "herself", "he's", "hi", "him", "himself", "his", "hither", "hopefully", "how", "howbeit", "however", "hundred", "i", "i'd", "ie", "if", "ignored", "i'll", "i'm", "immediate", "in", "inasmuch", "inc", "inc.", "indeed", "indicate", "indicated", "indicates", "inner", "inside", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "its", "it's", "itself", "i've", "j", "just", "k", "keep", "keeps", "kept", "know", "known", "knows", "l", "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", "likewise", "little", "look", "looking", "looks", "low", "lower", "ltd", "m", "made", "mainly", "make", "makes", "many", "may", "maybe", "mayn't", "me", "mean", "meantime", "meanwhile", "merely", "might", "mightn't", "mine", "minus", "miss", "more", "moreover", "most", "mostly", "mr", "mrs", "much", "must", "mustn't", "my", "myself", "n", "name", "namely", "nd", "near", "nearly", "necessary", "need", "needn't", "needs", "neither", "never", "neverf", "neverless", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none", "nonetheless", "noone", "no-one", "nor", "normally", "not", "nothing", "notwithstanding", "novel", "now", "nowhere", "o", "obviously", "of", "off", "often", "oh", "ok", "okay", "old", "on", "once", "one", "ones", "one's", "only", "onto", "opposite", "or", "other", "others", "otherwise", "ought", "oughtn't", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "p", "particular", "particularly", "past", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", "provided", "provides", "q", "que", "quite", "qv", "r", "rather", "rd", "re", "really", "reasonably", "recent", "recently", "regarding", "regardless", "regards", "relatively", "respectively", "right", "round", "s", "said", "same", "saw", "say", "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "since", "six", "so", "some", "somebody", "someday", "somehow", "someone", "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", "specifying", "still", "sub", "such", "sup", "sure", "t", "take", "taken", "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll", "thats", "that's", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence", "there", "thereafter", "thereby", "there'd", "therefore", "therein", "there'll", "there're", "theres", "there's", "thereupon", "there've", "these", "they", "they'd", "they'll", "they're", "they've", "thing", "things", "think", "third", "thirty", "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", "till", "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "t's", "twice", "two", "u", "un", "under", "underneath", "undoing", "unfortunately", "unless", "unlike", "unlikely", "until", "unto", "up", "upon", "upwards", "us", "use", "used", "useful", "uses", "using", "usually", "v", "value", "various", "versus", "very", "via", "viz", "vs", "w", "want", "wants", "was", "wasn't", "way", "we", "we'd", "welcome", "well", "we'll", "went", "were", "we're", "weren't", "we've", "what", "whatever", "what'll", "what's", "what've", "when", "whence", "whenever", "where", "whereafter", "whereas", "whereby", "wherein", "where's", "whereupon", "wherever", "whether", "which", "whichever", "while", "whilst", "whither", "who", "who'd", "whoever", "whole", "who'll", "whom", "whomever", "who's", "whose", "why", "will", "willing", "wish", "with", "within", "without", "wonder", "won't", "would", "wouldn't", "x", "y", "yes", "yet", "you", "you'd", "you'll", "your", "you're", "yours", "yourself", "yourselves", "you've", "z", "zero");
94
+
95
+ return array(
96
+ 'words_to_remove' => implode("\n", $defaults)
97
+ );
98
+ }
99
+ }
100
+
101
+ }
102
+ ?>
modules/titles.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Title Rewriter Module
4
  *
5
- * @version 1.0.4
6
  * @since 0.1
7
  */
8
 
@@ -200,18 +200,32 @@ class SU_Titles extends SU_Module {
200
  return $title;
201
  }
202
 
203
- function admin_help() {
204
- return __(<<<STR
205
- <p>Title Rewriter helps you customize the contents of your website&#8217;s &lt;title&gt; tags.
206
- The tag contents are displayed in web browser title bars and in search engine result pages.
207
- Properly rewriting title tags is an important first step for basic WordPress SEO,
208
- as proper rewriting ensures that your post keywords have greater prominence for search engine
209
- spiders and users.</p>
210
- <p>Title Rewriter enables recommended settings automatically. However, we&#8217;ve also provided this
211
- administration interface so that advanced users can fine-tune the rewriting formats as desired.
212
- Various variables, surrounded in {curly brackets}, are provided. All settings support the {blog} variable,
213
- which is replaced with the name of the blog.</p>
214
- <p>Here&#8217;s information on each of the settings:</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  <ul>
216
  <li><p><strong>Blog Homepage Title</strong> &mdash; Displays on the main blog posts page.</p></li>
217
  <li><p><strong>Post Title Format</strong> &mdash; Displays on single-post pages. The {post} variable is replaced with the post&#8217;s title.</p></li>
@@ -239,8 +253,7 @@ which is replaced with the name of the blog.</p>
239
  <li>{max} &mdash; The total number of subpages available. Would usually be used like this: Page {num} of {max}</li>
240
  </ul></li>
241
  </ul>
242
- STR
243
- , 'seo-ultimate');
244
  }
245
 
246
  function postmeta_help($help) {
2
  /**
3
  * Title Rewriter Module
4
  *
5
+ * @version 1.0.5
6
  * @since 0.1
7
  */
8
 
200
  return $title;
201
  }
202
 
203
+ function admin_dropdowns() {
204
+ return array(
205
+ 'overview' => __('Overview', 'seo-ultimate')
206
+ , 'settings' => __('Settings & Variables', 'seo-ultimate')
207
+ );
208
+ }
209
+
210
+ function admin_dropdown_overview() {
211
+ return __("
212
+ <ul>
213
+ <li><p><strong>What it does:</strong> Title Rewriter helps you customize the contents of your website&#8217;s <code>&lt;title&gt;</code> tags.
214
+ The tag contents are displayed in web browser title bars and in search engine result pages.</p></li>
215
+ <li><p><strong>Why it helps:</strong> Proper title rewriting ensures that the keywords in your post/Page titles have greater prominence for search engine spiders and users.
216
+ This is an important foundation for WordPress SEO.</p></li>
217
+ <li><p><strong>How to use it:</strong> Title Rewriter enables recommended settings automatically, so you shouldn&#8217;t need to change anything.
218
+ If you do wish to edit the rewriting formats, you can do so using the textboxes below (the &#8220;Settings Help&#8221; tab includes additional information on this).
219
+ You also have the option of overriding the <code>&lt;title&gt;</code> tag of an individual post or page by using the &#8220;Title Tag&#8221; textbox that Title Rewriter adds to the post/page editors.</p></li>
220
+ </ul>
221
+ ", 'seo-ultimate');
222
+ }
223
+
224
+ function admin_dropdown_settings() {
225
+ return __("
226
+ <p>Various variables, surrounded in {curly brackets}, are provided for use in the title formats.
227
+ All settings support the {blog} variable, which is replaced with the name of the blog.</p>
228
+ <p>Here&#8217;s information on each of the settings and its supported variables:</p>
229
  <ul>
230
  <li><p><strong>Blog Homepage Title</strong> &mdash; Displays on the main blog posts page.</p></li>
231
  <li><p><strong>Post Title Format</strong> &mdash; Displays on single-post pages. The {post} variable is replaced with the post&#8217;s title.</p></li>
253
  <li>{max} &mdash; The total number of subpages available. Would usually be used like this: Page {num} of {max}</li>
254
  </ul></li>
255
  </ul>
256
+ ", 'seo-ultimate');
 
257
  }
258
 
259
  function postmeta_help($help) {
readme.txt CHANGED
@@ -1,11 +1,11 @@
1
  === SEO Ultimate ===
2
  Contributors: SEO Design Solutions
3
- Tags: seo, title, meta, noindex, canonical, 404, robots.txt, htaccess, google, yahoo, bing, search engines, admin, post, page, modules
4
  Requires at least: 2.7
5
  Tested up to: 2.8.2
6
- Stable tag: 0.8
7
 
8
- This all-in-one SEO plugin can handle titles, noindex, meta data, canonical tags, 404 error tracking, and more (with many more features coming soon).
9
 
10
  == Description ==
11
 
@@ -25,6 +25,10 @@ SEO Ultimate is an all-in-one [SEO](http://www.seodesignsolutions.com/) plugin w
25
 
26
  * **File Editor** - Lets you edit two important SEO-related files: robots.txt and .htaccess
27
 
 
 
 
 
28
  SEO Ultimate was developed with WordPress plugin "best practices" in mind:
29
 
30
  * Integration with the contextual help system of WordPress 2.7+
@@ -34,8 +38,6 @@ SEO Ultimate was developed with WordPress plugin "best practices" in mind:
34
  * Integration with the new WordPress 2.7+ menu
35
  * Settings import/export/reset functionality
36
 
37
- **NOTE:** This plugin is in beta, which means it's very feature-incomplete. We have many more features that we're working on finetuning before release. If you install the plugin now, you can have these new features delivered to you on a regular basis via WordPress's automatic plugin upgrader.
38
-
39
 
40
  == Installation ==
41
 
@@ -124,6 +126,34 @@ No. The Title Rewriter edits the `<title>` tags of your site, not your post/page
124
 
125
  The "title" is the title of your post or page, and is displayed on your site and in your RSS feed. The title is also used in your `<title>` tag by default; however, you can override the value of just the `<title>` tag by using the "Title Tag" field in the "SEO Settings" box.
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  = How do I remove the attribution link? =
128
 
129
  Because of the tremendous effort put into this plugin, we ask that you please leave the link enabled. If you must disable it, you can do so under `Settings > SEO Ultimate`.
@@ -162,6 +192,20 @@ Yes. WordPress plugins are supposed to delete their settings during the uninstal
162
 
163
  == Changelog ==
164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  = Version 0.8 (July 22, 2009) =
166
  * Feature: Added robots.txt editor (new File Editor module)
167
  * Feature: Added .htaccess editor (new File Editor module)
1
  === SEO Ultimate ===
2
  Contributors: SEO Design Solutions
3
+ Tags: seo, title, meta, noindex, canonical, 404, robots.txt, htaccess, slugs, url, google, yahoo, bing, search engines, admin, post, page, modules
4
  Requires at least: 2.7
5
  Tested up to: 2.8.2
6
+ Stable tag: 0.9
7
 
8
+ This all-in-one SEO plugin can handle titles, noindex, meta data, slugs, canonical tags, 404 error tracking, and more (with many more features coming soon).
9
 
10
  == Description ==
11
 
25
 
26
  * **File Editor** - Lets you edit two important SEO-related files: robots.txt and .htaccess
27
 
28
+ * **Slug Optimizer** - Removes common words from post/Page slugs to increase in-URL keyword potency.
29
+
30
+ We have many more features that we're working on finetuning before release. If you install the plugin now, you can have these new features delivered to you on a regular basis via WordPress's automatic plugin upgrader.
31
+
32
  SEO Ultimate was developed with WordPress plugin "best practices" in mind:
33
 
34
  * Integration with the contextual help system of WordPress 2.7+
38
  * Integration with the new WordPress 2.7+ menu
39
  * Settings import/export/reset functionality
40
 
 
 
41
 
42
  == Installation ==
43
 
126
 
127
  The "title" is the title of your post or page, and is displayed on your site and in your RSS feed. The title is also used in your `<title>` tag by default; however, you can override the value of just the `<title>` tag by using the "Title Tag" field in the "SEO Settings" box.
128
 
129
+ = What's a slug? =
130
+
131
+ The slug of a post or page is the portion of its URL that is based on its title.
132
+
133
+ When you edit a post or Page in WordPress, the slug is the yellow-highlighted portion of the Permalink beneath the Title textbox.
134
+
135
+ = Does the Slug Optimizer change my existing URLs? =
136
+
137
+ No. Slug Optimizer will not relocate your content by changing existing URLs. Slug Optimizer only takes effect on new posts and pages.
138
+
139
+ = How do I see Slug Optimizer in action? =
140
+
141
+ 1. Create a new post/Page in WordPress.
142
+ 2. Type in a title containing some common words.
143
+ 3. Click outside the Title box. WordPress will insert a URL labeled "Permalink" below the Title textbox. The Slug Optimizer will have removed the common words from the URL.
144
+
145
+ = Why didn't the Slug Optimizer remove common words from my slug? =
146
+
147
+ It's possible that every word in your post title is in the list of words to remove. In this case, Slug Optimizer doesn't remove the words, because if it did, you'd end up with a blank slug.
148
+
149
+ = What if I want to include a common word in my slug? =
150
+
151
+ When editing the post or page in question, just click the "Edit" button next to the permalink and change the slug as desired.
152
+
153
+ = How do I revert back to the optimized slug after making changes? =
154
+
155
+ When editing the post or page in question, just click the "Edit" button next to the permalink; a "Save" button will appear in its place. Next erase the contents of the textbox, and then click the aforementioned "Save" button.
156
+
157
  = How do I remove the attribution link? =
158
 
159
  Because of the tremendous effort put into this plugin, we ask that you please leave the link enabled. If you must disable it, you can do so under `Settings > SEO Ultimate`.
192
 
193
  == Changelog ==
194
 
195
+ = Version 0.9 (August 1, 2009) =
196
+ * Feature: Added the Slug Optimizer module
197
+ * Feature: Noindex Manager now supports noindexing comment subpages
198
+ * Bugfix: 404 Monitor's numeric notice now only includes new 404s
199
+ * Bugfix: Linkbox Inserter now respects the "more" tag
200
+ * Bugfix: Missing strings added to the POT file
201
+ * Improvement: 404 Monitor now shows the referring URL for all 404 errors
202
+ * Improvement: Reduced the number of database queries the plugin makes
203
+ * Improvement: CSS and JavaScript are now only loaded when appropriate
204
+ * Improvement: Added additional built-in documentation
205
+ * Improvement: Divided built-in help into multiple tabs to reduce dropdown height
206
+ * Improvement: Miscellaneous code efficiency improvements
207
+ * Improvement: Many additional code comments added
208
+
209
  = Version 0.8 (July 22, 2009) =
210
  * Feature: Added robots.txt editor (new File Editor module)
211
  * Feature: Added .htaccess editor (new File Editor module)
seo-ultimate.css DELETED
@@ -1,237 +0,0 @@
1
- /* MENU */
2
-
3
- #adminmenu #toplevel_page_seo div.wp-menu-image {
4
- background-image: url(images/icon.png);
5
- background-position: -1px -33px;
6
- }
7
-
8
- #adminmenu #toplevel_page_seo:hover div.wp-menu-image,
9
- #adminmenu #toplevel_page_seo.wp-has-current-submenu div.wp-menu-image {
10
- background-position: -1px -1px;
11
- }
12
-
13
- /* MESSAGES */
14
-
15
- div.su-module .su-success,
16
- div.su-module .su-error,
17
- div.su-module .su-warning,
18
- div.su-module .su-info {
19
- padding-left: 21px;
20
- background-repeat: no-repeat;
21
- background-position: 0px center;
22
- }
23
-
24
- div.su-module .su-success {
25
- background-image: url(images/success.png);
26
- color: #008000;
27
- }
28
-
29
- div.su-module .su-error {
30
- background-image: url(images/error.png);
31
- color: #FF0000;
32
- }
33
-
34
- div.su-module .su-warning {
35
- background-image: url(images/warning.png);
36
- color: #FF8C00;
37
- }
38
-
39
- div.su-module .su-info {
40
- background-image: url(images/info.png);
41
- color: #0000FF;
42
- }
43
-
44
- #wpcontent div.su-module div.su-message p {
45
- background-position: 10px center;
46
- padding: 10px 10px 10px 36px;
47
- margin: 1em 0;
48
- color: black;
49
- border-width: 1px;
50
- border-style: solid;
51
- }
52
-
53
- div.su-module .su-message .su-success {
54
- background-color: #DFFFE3;
55
- border-color: #61DF6F;
56
- }
57
-
58
- div.su-module .su-message .su-error {
59
- background-color: #FFBFBF;
60
- border-color: #FF0000;
61
- }
62
-
63
- div.su-module .su-message .su-warning {
64
- background-color: #FFFFE0;
65
- border-color: orange;
66
- }
67
-
68
- div.su-module .su-message .su-info {
69
- background-color: #DFEEFF;
70
- border-color: #8F93FF;
71
- }
72
-
73
- /* ADMIN PAGES */
74
-
75
- div.su-module {
76
- padding-bottom: 1em;
77
- }
78
-
79
- div.su-module h3.su-subheader {
80
- margin-top: 3em;
81
- padding-top: 1em;
82
- border-top: 3px solid #ccc;
83
- }
84
-
85
- div.su-module table.widefat {
86
- width: auto;
87
- margin: 2em 0;
88
- }
89
-
90
- div.su-module table.widefat th,
91
- div.su-module table.widefat td {
92
- padding-right: 2em;
93
- }
94
-
95
- div.su-module table.widefat tr.new-hit td {
96
- background-color: #DFFFE3;
97
- }
98
-
99
- div.su-module .form-table .regular-text {
100
- width: 325px;
101
- }
102
-
103
- div.su-module .form-table td div.field {
104
- padding-bottom: 1em;
105
- }
106
-
107
- div.su-module table.report {
108
- border-collapse: collapse;
109
- border-top: 1px solid #ccc;
110
- }
111
-
112
- div.su-module table.report th {
113
- font-weight: normal;
114
- }
115
-
116
- div.su-module table.report th, div.su-module table.report td {
117
- padding: 1em 3em 1em 0;
118
- border-bottom: 1px solid #ccc;
119
- text-align: left;
120
- }
121
-
122
- /* TABS (Heavily based on CSS from the Breadcrumbs NavXT plugin) */
123
-
124
- div.su-module .su-tabs ul.ui-tabs-nav {
125
- border-bottom: 1px solid #dfdfdf;
126
- font-size: 12px;
127
- height: 29px;
128
- list-style: none;
129
- margin: 13px 0 0;
130
- overflow: visible;
131
- padding: 0 0 0 8px;
132
- }
133
-
134
- div.su-module .su-tabs ul.ui-tabs-nav li {
135
- display: block;
136
- float: left;
137
- line-height: 200%;
138
- list-style: none;
139
- margin: 0;
140
- padding: 0;
141
- position: relative;
142
- text-align: center;
143
- white-space: nowrap;
144
- width: auto;
145
- }
146
-
147
-
148
- div.su-module .su-tabs ul.ui-tabs-nav li a {
149
- border-bottom: 1px solid #dfdfdf;
150
- display: block;
151
- float: left;
152
- line-height: 28px;
153
- padding: 1px 13px 0;
154
- position: relative;
155
- text-decoration: none;
156
- }
157
-
158
- div.su-module .su-tabs ul.ui-tabs-nav li.ui-tabs-selected a {
159
- -moz-border-radius-topleft: 4px;
160
- -moz-border-radius-topright: 4px;
161
- -webkit-border-top-left-radius: 4px;
162
- -webkit-border-top-right-radius: 4px;
163
- border-top-left-radius: 4px;
164
- border-top-right-radius: 4px;
165
- border: 1px solid #dfdfdf;
166
- border-bottom-color: #f9f9f9;
167
- color: #333333;
168
- font-weight: normal;
169
- padding: 0 12px;
170
- }
171
-
172
- /* CONTEXTUAL HELP */
173
-
174
- div.su-help div.metabox-prefs {
175
- margin-bottom: 2em;
176
- }
177
-
178
- div.su-help ul {
179
- list-style-type: disc;
180
- padding-left: 1em;
181
- margin-left: 1em;
182
- }
183
-
184
- /* POSTMETA BOX */
185
-
186
- #su-postmeta-box table tr {
187
- vertical-align: middle;
188
- }
189
-
190
- #su-postmeta-box table th,
191
- #su-postmeta-box table td {
192
- padding: 0.5em 0;
193
- }
194
-
195
- #su-postmeta-box table th {
196
- text-align: right;
197
- font-weight: bold;
198
- padding-right: 0.5em;
199
- }
200
-
201
- #su-postmeta-box table tr.textarea {
202
- vertical-align: top;
203
- }
204
-
205
- #su-postmeta-box table tr.textarea th label {
206
- display: block;
207
- margin-top: 5px;
208
- }
209
-
210
- #su-postmeta-box table th em {
211
- font-weight: normal;
212
- }
213
-
214
- #su-postmeta-box table,
215
- #su-postmeta-box table td,
216
- #su-postmeta-box table td input.regular-text,
217
- #su-postmeta-box table td textarea {
218
- width: 100%;
219
- }
220
-
221
- /* PLUGIN NOTICES */
222
-
223
- #wpwrap .su-plugin-notice .update-message {
224
- font-weight: normal;
225
- }
226
-
227
- /* IMPORT MODULES */
228
-
229
- .su-module table#import-status {
230
- border: 0;
231
- width: auto;
232
- margin: 2em 0;
233
- }
234
-
235
- .su-module table#import-status td {
236
- padding: 0 0.5em 1em 0;
237
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
seo-ultimate.js DELETED
@@ -1,17 +0,0 @@
1
- function reset_textbox(id, d, m, e) {
2
- if (confirm(m+"\n\n"+d)) {
3
- document.getElementById(id).value=d;
4
- e.className='hidden';
5
- }
6
- }
7
-
8
- function textbox_value_changed(e, d, l) {
9
- if (e.value==d)
10
- document.getElementById(l).className='hidden';
11
- else
12
- document.getElementById(l).className='';
13
- }
14
-
15
- function textbox_char_count(textbox, charcount) {
16
- document.getElementById(charcount).innerHTML = document.getElementById(textbox).value.length;
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
seo-ultimate.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: SEO Ultimate
4
  Plugin URI: http://www.seodesignsolutions.com/wordpress-seo/
5
  Description: This all-in-one SEO plugin can rewrite title tags, set meta data, add noindex, insert canonical tags, log 404 errors, edit your robots.txt, and more.
6
- Version: 0.8
7
  Author: SEO Design Solutions
8
  Author URI: http://www.seodesignsolutions.com/
9
  Text Domain: seo-ultimate
@@ -12,7 +12,7 @@ Text Domain: seo-ultimate
12
  /**
13
  * The main SEO Ultimate plugin file.
14
  * @package SeoUltimate
15
- * @version 0.8
16
  * @link http://www.seodesignsolutions.com/wordpress-seo/ SEO Ultimate Homepage
17
  */
18
 
@@ -33,15 +33,15 @@ You should have received a copy of the GNU General Public License
33
  along with this program. If not, see <http://www.gnu.org/licenses/>.
34
  */
35
 
36
-
37
  /********** CONSTANTS **********/
38
 
 
39
  define("SU_PLUGIN_NAME", "SEO Ultimate");
40
  define("SU_PLUGIN_URI", "http://www.seodesignsolutions.com/wordpress-seo/");
41
- define("SU_VERSION", "0.8");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
- define("SU_USER_AGENT", "SeoUltimate/0.8");
45
 
46
  define('SU_MODULE_ENABLED', 10);
47
  define('SU_MODULE_SILENCED', 5);
@@ -54,13 +54,10 @@ define('SU_RESULT_ERROR', -1);
54
 
55
  /********** INCLUDES **********/
56
 
 
57
  require('class.seo-ultimate.php');
58
  require('class.su-module.php');
59
- require('class.su-importmodule.php');
60
- require('class.su-parentmodule.php');
61
- require('class.su-widget.php');
62
  require('class.su-hitset.php');
63
- require('functions.php');
64
 
65
 
66
  /********** PLUGIN FILE LOAD HANDLER **********/
3
  Plugin Name: SEO Ultimate
4
  Plugin URI: http://www.seodesignsolutions.com/wordpress-seo/
5
  Description: This all-in-one SEO plugin can rewrite title tags, set meta data, add noindex, insert canonical tags, log 404 errors, edit your robots.txt, and more.
6
+ Version: 0.9
7
  Author: SEO Design Solutions
8
  Author URI: http://www.seodesignsolutions.com/
9
  Text Domain: seo-ultimate
12
  /**
13
  * The main SEO Ultimate plugin file.
14
  * @package SeoUltimate
15
+ * @version 0.9
16
  * @link http://www.seodesignsolutions.com/wordpress-seo/ SEO Ultimate Homepage
17
  */
18
 
33
  along with this program. If not, see <http://www.gnu.org/licenses/>.
34
  */
35
 
 
36
  /********** CONSTANTS **********/
37
 
38
+ //Reading plugin info from constants is faster than trying to parse it from the header above.
39
  define("SU_PLUGIN_NAME", "SEO Ultimate");
40
  define("SU_PLUGIN_URI", "http://www.seodesignsolutions.com/wordpress-seo/");
41
+ define("SU_VERSION", "0.9");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
+ define("SU_USER_AGENT", "SeoUltimate/0.9");
45
 
46
  define('SU_MODULE_ENABLED', 10);
47
  define('SU_MODULE_SILENCED', 5);
54
 
55
  /********** INCLUDES **********/
56
 
57
+ require('functions.php');
58
  require('class.seo-ultimate.php');
59
  require('class.su-module.php');
 
 
 
60
  require('class.su-hitset.php');
 
61
 
62
 
63
  /********** PLUGIN FILE LOAD HANDLER **********/
seo-ultimate.pot CHANGED
@@ -1,680 +1,1169 @@
1
- # SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) YEAR SEO Design Solutions
3
- # This file is distributed under the same license as the PACKAGE package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
- #
6
- #, fuzzy
7
- msgid ""
8
- msgstr ""
9
- "Project-Id-Version: PACKAGE VERSION\n"
10
- "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
11
- "POT-Creation-Date: 2009-07-23 22:19+0000\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=CHARSET\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
-
19
- #. #-#-#-#-# plugin.pot (PACKAGE VERSION) #-#-#-#-#
20
- #. Plugin Name of an extension
21
- #: class.seo-ultimate.php:646 modules/settings.php:16
22
- msgid "SEO Ultimate"
23
- msgstr ""
24
-
25
- #: class.seo-ultimate.php:646
26
- msgid "SEO"
27
- msgstr ""
28
-
29
- #: class.seo-ultimate.php:832
30
- #, php-format
31
- msgid "%s Help"
32
- msgstr ""
33
-
34
- #: class.seo-ultimate.php:852
35
- msgid "SEO Settings Help"
36
- msgstr ""
37
-
38
- #: class.seo-ultimate.php:854
39
- msgid "The SEO Settings box lets you customize these settings:"
40
- msgstr ""
41
-
42
- #: class.seo-ultimate.php:856
43
- msgid "(The SEO Settings box is part of the SEO Ultimate plugin.)"
44
- msgstr ""
45
-
46
- #: class.seo-ultimate.php:911
47
- #, php-format
48
- msgid ""
49
- "SEO Ultimate includes the functionality of %1$s. You may want to deactivate %"
50
- "1$s to avoid plugin conflicts."
51
- msgstr ""
52
-
53
- #: class.seo-ultimate.php:992
54
- msgid "SEO Settings"
55
- msgstr ""
56
-
57
- #: class.su-hitset.php:44
58
- msgid "Date"
59
- msgstr ""
60
-
61
- #: class.su-hitset.php:45
62
- msgid "IP Address"
63
- msgstr ""
64
-
65
- #: class.su-hitset.php:46
66
- msgid "User Agent"
67
- msgstr ""
68
-
69
- #: class.su-hitset.php:47
70
- msgid "URL Requested"
71
- msgstr ""
72
-
73
- #: class.su-hitset.php:48
74
- msgid "Redirected To"
75
- msgstr ""
76
-
77
- #: class.su-hitset.php:49
78
- msgid "Status Code"
79
- msgstr ""
80
-
81
- #: class.su-hitset.php:81
82
- #, php-format
83
- msgid "%1$s<br />%2$s"
84
- msgstr ""
85
-
86
- #: class.su-importmodule.php:37
87
- msgid "Import Now"
88
- msgstr ""
89
-
90
- #: class.su-importmodule.php:48
91
- msgid "Return to settings page"
92
- msgstr ""
93
-
94
- #: class.su-importmodule.php:51
95
- msgid "Return to SEO page"
96
- msgstr ""
97
-
98
- #: class.su-module.php:518
99
- #, php-format
100
- msgid "%1$s | %2$s %3$s by %4$s"
101
- msgstr ""
102
-
103
- #: class.su-module.php:552
104
- msgid "Settings updated."
105
- msgstr ""
106
-
107
- #: class.su-module.php:572
108
- msgid "Save Changes"
109
- msgstr ""
110
-
111
- #: class.su-module.php:668
112
- msgid ""
113
- "Are you sure you want to replace the textbox contents with this default "
114
- "value?"
115
- msgstr ""
116
-
117
- #: class.su-module.php:681
118
- msgid "Reset"
119
- msgstr ""
120
-
121
- #: modules/404s.php:19
122
- msgid "404 Monitor"
123
- msgstr ""
124
-
125
- #: modules/404s.php:30
126
- msgid "The log entry was successfully deleted."
127
- msgstr ""
128
-
129
- #: modules/404s.php:32
130
- msgid "This log entry has already been deleted."
131
- msgstr ""
132
-
133
- #: modules/404s.php:39
134
- msgid "The log was successfully cleared."
135
- msgstr ""
136
-
137
- #: modules/404s.php:45
138
- msgid "No 404 errors in the log."
139
- msgstr ""
140
-
141
- #: modules/404s.php:54
142
- msgid "Are you sure you want to delete all 404 log entries?"
143
- msgstr ""
144
-
145
- #: modules/404s.php:56
146
- msgid "Clear Log"
147
- msgstr ""
148
-
149
- #: modules/404s.php:68
150
- msgid "Open"
151
- msgstr ""
152
-
153
- #: modules/404s.php:69
154
- msgid "Google Cache"
155
- msgstr ""
156
-
157
- #: modules/404s.php:70
158
- msgid "Delete Log Entry"
159
- msgstr ""
160
-
161
- #: modules/canonical.php:13
162
- msgid "Canonicalizer"
163
- msgstr ""
164
-
165
- #: modules/canonical.php:23
166
- msgid "Generate <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags."
167
- msgstr ""
168
-
169
- #: modules/files.php:15
170
- msgid "File Editor"
171
- msgstr ""
172
-
173
- #: modules/files.php:41
174
- msgid ""
175
- "A .htaccess file exists, but it&#8217;s not writable. You can edit it here "
176
- "once the file permissions are corrected."
177
- msgstr ""
178
-
179
- #: modules/files.php:45
180
- msgid ""
181
- "WordPress won&#8217;t be able to display your robots.txt file because the "
182
- "default <a href=\"options-permalink.php\" target=\"_blank\">permalink "
183
- "structure</a> is in use."
184
- msgstr ""
185
-
186
- #: modules/files.php:51
187
- #, php-format
188
- msgid "robots.txt [<a href=\"%s\" target=\"_blank\">Open</a>]"
189
- msgstr ""
190
-
191
- #: modules/files.php:53
192
- msgid "Enable this custom robots.txt file and disable the default file"
193
- msgstr ""
194
-
195
- #: modules/files.php:54
196
- msgid "Let other plugins add rules to my custom robots.txt file"
197
- msgstr ""
198
-
199
- #: modules/files.php:55
200
- msgid "robots.txt Settings"
201
- msgstr ""
202
-
203
- #: modules/files.php:58
204
- msgid ""
205
- "Please realize that incorrectly editing your robots.txt file could block "
206
- "search engines from your site."
207
- msgstr ""
208
-
209
- #: modules/files.php:61
210
- msgid ".htaccess"
211
- msgstr ""
212
-
213
- #: modules/files.php:64
214
- msgid ""
215
- "Also, incorrectly editing your .htaccess file could disable your entire "
216
- "website. Edit with caution!"
217
- msgstr ""
218
-
219
- #: modules/files.php:107
220
- #, php-format
221
- msgid ""
222
- "Please note that your privacy settings won&#8217;t have any effect on your "
223
- "robots.txt file, since you&#8217;re using <a href=\"%s\">a custom one</a>."
224
- msgstr ""
225
-
226
- #: modules/linkbox.php:13
227
- msgid "Linkbox Inserter"
228
- msgstr ""
229
-
230
- #: modules/linkbox.php:18
231
- msgid "Link to this post!"
232
- msgstr ""
233
-
234
- #: modules/linkbox.php:47
235
- msgid "At the end of posts"
236
- msgstr ""
237
-
238
- #: modules/linkbox.php:48
239
- msgid "At the end of pages"
240
- msgstr ""
241
-
242
- #: modules/linkbox.php:49
243
- msgid "When called by the su_linkbox hook"
244
- msgstr ""
245
-
246
- #: modules/linkbox.php:50
247
- msgid "Display linkboxes..."
248
- msgstr ""
249
-
250
- #: modules/linkbox.php:51
251
- msgid "Linkbox HTML"
252
- msgstr ""
253
-
254
- #: modules/meta.php:13
255
- msgid "Meta Editor"
256
- msgstr ""
257
-
258
- #: modules/meta.php:30
259
- msgid "Blog Homepage Meta Description"
260
- msgstr ""
261
-
262
- #: modules/meta.php:31
263
- msgid "Blog Homepage Meta Keywords"
264
- msgstr ""
265
-
266
- #: modules/meta.php:34
267
- msgid "Use this blog&#8217s tagline as the default homepage description."
268
- msgstr ""
269
-
270
- #: modules/meta.php:35
271
- msgid "Default Values"
272
- msgstr ""
273
-
274
- #: modules/meta.php:37
275
- msgid ""
276
- "Don&#8217t use this site&#8217s Open Directory description in search results."
277
- msgstr ""
278
-
279
- #: modules/meta.php:38
280
- msgid ""
281
- "Don&#8217t use this site&#8217s Yahoo! Directory description in search "
282
- "results."
283
- msgstr ""
284
-
285
- #: modules/meta.php:39
286
- msgid "Don&#8217t cache or archive this site."
287
- msgstr ""
288
-
289
- #: modules/meta.php:40
290
- msgid "Spider Instructions"
291
- msgstr ""
292
-
293
- #: modules/meta.php:42
294
- msgid "Google Webmaster Tools:"
295
- msgstr ""
296
-
297
- #: modules/meta.php:43
298
- msgid "Yahoo! Site Explorer:"
299
- msgstr ""
300
-
301
- #: modules/meta.php:44
302
- msgid "Bing Webmaster Center:"
303
- msgstr ""
304
-
305
- #: modules/meta.php:45
306
- msgid "Verification Codes"
307
- msgstr ""
308
-
309
- #: modules/meta.php:46
310
- msgid "Custom &lt;head&gt; HTML"
311
- msgstr ""
312
-
313
- #: modules/meta.php:55
314
- msgid "Description:"
315
- msgstr ""
316
-
317
- #: modules/meta.php:58
318
- #, php-format
319
- msgid "You&#8217;ve entered %s characters. Most search engines use up to 160."
320
- msgstr ""
321
-
322
- #: modules/meta.php:60
323
- msgid "Keywords:<br /><em>(separate with commas)</em>"
324
- msgstr ""
325
-
326
- #: modules/meta.php:117
327
- msgid "Custom Header Code"
328
- msgstr ""
329
-
330
- #: modules/meta.php:166
331
- msgid ""
332
- "<strong>Description:</strong> &mdash; The value of the meta description tag. "
333
- "The description will often appear underneath the title in search engine "
334
- "results. "
335
- msgstr ""
336
-
337
- #: modules/meta.php:168
338
- msgid ""
339
- "<strong>Keywords:</strong> &mdash; The value of the meta keywords tag. The "
340
- "keywords list gives search engines a hint as to what this post/page is "
341
- "about. "
342
- msgstr ""
343
-
344
- #: modules/modules.php:13
345
- msgid "Modules"
346
- msgstr ""
347
-
348
- #: modules/modules.php:14
349
- msgid "Module Manager"
350
- msgstr ""
351
-
352
- #: modules/modules.php:35
353
- msgid ""
354
- "Here you can disable or hide modules you don&#8217;t use. You can also "
355
- "silence modules from displaying bubble alerts on the menu."
356
- msgstr ""
357
-
358
- #: modules/modules.php:41
359
- msgid "Status"
360
- msgstr ""
361
-
362
- #: modules/modules.php:42
363
- msgid "Module"
364
- msgstr ""
365
-
366
- #: modules/modules.php:55
367
- msgid "Enabled"
368
- msgstr ""
369
-
370
- #: modules/modules.php:56
371
- msgid "Silenced"
372
- msgstr ""
373
-
374
- #: modules/modules.php:57
375
- msgid "Hidden"
376
- msgstr ""
377
-
378
- #: modules/modules.php:58
379
- msgid "Disabled"
380
- msgstr ""
381
-
382
- #: modules/noindex.php:13
383
- msgid "Noindex Manager"
384
- msgstr ""
385
-
386
- #: modules/noindex.php:33
387
- msgid ""
388
- "Note: The current <a href='options-privacy.php'>privacy settings</a> will "
389
- "block indexing of the entire site, regardless of which options are set below."
390
- msgstr ""
391
-
392
- #: modules/noindex.php:36
393
- msgid "Prevent indexing of..."
394
- msgstr ""
395
-
396
- #: modules/noindex.php:37
397
- msgid "Administration back-end pages"
398
- msgstr ""
399
-
400
- #: modules/noindex.php:38
401
- msgid "Author archives"
402
- msgstr ""
403
-
404
- #: modules/noindex.php:39
405
- msgid "Blog search pages"
406
- msgstr ""
407
-
408
- #: modules/noindex.php:40
409
- msgid "Category archives"
410
- msgstr ""
411
-
412
- #: modules/noindex.php:41
413
- msgid "Comment feeds"
414
- msgstr ""
415
-
416
- #: modules/noindex.php:43
417
- msgid "Date-based archives"
418
- msgstr ""
419
-
420
- #: modules/noindex.php:44
421
- msgid "Subpages of the homepage"
422
- msgstr ""
423
-
424
- #: modules/noindex.php:45
425
- msgid "Tag archives"
426
- msgstr ""
427
-
428
- #: modules/noindex.php:46
429
- msgid "User login/registration pages"
430
- msgstr ""
431
-
432
- #: modules/sds-blog.php:13
433
- msgid "SEO Design Solutions Whitepapers"
434
- msgstr ""
435
-
436
- #: modules/sds-blog.php:14
437
- msgid "Whitepapers"
438
- msgstr ""
439
-
440
- #: modules/sds-blog.php:37
441
- msgid ""
442
- "Search engine optimization articles from the company behind the SEO Ultimate "
443
- "plugin."
444
- msgstr ""
445
-
446
- #: modules/sds-blog.php:88
447
- msgid ""
448
- "The articles below are loaded from the SEO Design Solutions website. Click "
449
- "on an article&#8217s title to read it."
450
- msgstr ""
451
-
452
- #: modules/settings.php:15
453
- msgid "SEO Ultimate Plugin Settings"
454
- msgstr ""
455
-
456
- #: modules/settings.php:65
457
- msgid "Settings successfully imported."
458
- msgstr ""
459
-
460
- #: modules/settings.php:67
461
- msgid ""
462
- "The uploaded file is not in the proper format. Settings could not be "
463
- "imported."
464
- msgstr ""
465
-
466
- #: modules/settings.php:69
467
- msgid "The settings file could not be uploaded successfully."
468
- msgstr ""
469
-
470
- #: modules/settings.php:72
471
- msgid ""
472
- "Settings could not be imported because no settings file was selected. Please "
473
- "click the &#8220;Browse&#8221; button and select a file to import."
474
- msgstr ""
475
-
476
- #: modules/settings.php:80
477
- msgid "All settings have been erased and defaults have been restored."
478
- msgstr ""
479
-
480
- #: modules/settings.php:94
481
- msgid "Plugin Settings"
482
- msgstr ""
483
-
484
- #: modules/settings.php:96
485
- msgid "Enable attribution link"
486
- msgstr ""
487
-
488
- #: modules/settings.php:97
489
- msgid "Enable attribution link CSS styling"
490
- msgstr ""
491
-
492
- #: modules/settings.php:98
493
- msgid "Notify me about unnecessary active plugins"
494
- msgstr ""
495
-
496
- #: modules/settings.php:100
497
- msgid "Insert comments around HTML code insertions"
498
- msgstr ""
499
-
500
- #: modules/settings.php:105
501
- msgid "Manage Settings Data"
502
- msgstr ""
503
-
504
- #: modules/settings.php:109
505
- msgid ""
506
- "This section allows you to export, import, and reset the settings of the "
507
- "plugin and all its modules."
508
- msgstr ""
509
-
510
- #: modules/settings.php:111
511
- msgid ""
512
- "A settings file includes the data of every checkbox and textbox of every "
513
- "installed module, as well as the &#8220;Plugin Settings&#8221; section "
514
- "above. "
515
- msgstr ""
516
-
517
- #: modules/settings.php:120
518
- msgid "Export:"
519
- msgstr ""
520
-
521
- #: modules/settings.php:123
522
- msgid "Download Settings File"
523
- msgstr ""
524
-
525
- #: modules/settings.php:128
526
- msgid "Import:"
527
- msgstr ""
528
-
529
- #: modules/settings.php:133
530
- msgid ""
531
- "Are you sure you want to import this settings file? This will overwrite your "
532
- "current settings and cannot be undone."
533
- msgstr ""
534
-
535
- #: modules/settings.php:134
536
- msgid "Import This Settings File"
537
- msgstr ""
538
-
539
- #: modules/settings.php:141
540
- msgid "Reset:"
541
- msgstr ""
542
-
543
- #: modules/settings.php:144
544
- msgid ""
545
- "Are you sure you want to erase all module settings? This cannot be undone."
546
- msgstr ""
547
-
548
- #: modules/settings.php:145
549
- msgid "Restore Default Settings"
550
- msgstr ""
551
-
552
- #: modules/titles.php:13
553
- msgid "Title Rewriter"
554
- msgstr ""
555
-
556
- #: modules/titles.php:25
557
- msgid "{blog}"
558
- msgstr ""
559
-
560
- #: modules/titles.php:26
561
- msgid "{post} | {blog}"
562
- msgstr ""
563
-
564
- #: modules/titles.php:27
565
- msgid "{page} | {blog}"
566
- msgstr ""
567
-
568
- #: modules/titles.php:28
569
- msgid "{category} | {blog}"
570
- msgstr ""
571
-
572
- #: modules/titles.php:29
573
- msgid "{tag} | {blog}"
574
- msgstr ""
575
-
576
- #: modules/titles.php:30
577
- msgid "Archives for {month} {day}, {year} | {blog}"
578
- msgstr ""
579
-
580
- #: modules/titles.php:31
581
- msgid "Archives for {month} {year} | {blog}"
582
- msgstr ""
583
-
584
- #: modules/titles.php:32
585
- msgid "Archives for {year} | {blog}"
586
- msgstr ""
587
-
588
- #: modules/titles.php:33
589
- msgid "Posts by {author} | {blog}"
590
- msgstr ""
591
-
592
- #: modules/titles.php:34
593
- msgid "Search Results for {query} | {blog}"
594
- msgstr ""
595
-
596
- #: modules/titles.php:35
597
- msgid "404 Not Found | {blog}"
598
- msgstr ""
599
-
600
- #: modules/titles.php:36
601
- msgid "{title} - Page {num}"
602
- msgstr ""
603
-
604
- #: modules/titles.php:42
605
- msgid "Blog Homepage Title"
606
- msgstr ""
607
-
608
- #: modules/titles.php:43
609
- msgid "Post Title Format"
610
- msgstr ""
611
-
612
- #: modules/titles.php:44
613
- msgid "Page Title Format"
614
- msgstr ""
615
-
616
- #: modules/titles.php:45
617
- msgid "Category Title Format"
618
- msgstr ""
619
-
620
- #: modules/titles.php:46
621
- msgid "Tag Title Format"
622
- msgstr ""
623
-
624
- #: modules/titles.php:47
625
- msgid "Day Archive Title Format"
626
- msgstr ""
627
-
628
- #: modules/titles.php:48
629
- msgid "Month Archive Title Format"
630
- msgstr ""
631
-
632
- #: modules/titles.php:49
633
- msgid "Year Archive Title Format"
634
- msgstr ""
635
-
636
- #: modules/titles.php:50
637
- msgid "Author Archive Title Format"
638
- msgstr ""
639
-
640
- #: modules/titles.php:51
641
- msgid "Search Title Format"
642
- msgstr ""
643
-
644
- #: modules/titles.php:52
645
- msgid "404 Title Format"
646
- msgstr ""
647
-
648
- #: modules/titles.php:53
649
- msgid "Pagination Title Format"
650
- msgstr ""
651
-
652
- #: modules/titles.php:64
653
- msgid "Title Tag:"
654
- msgstr ""
655
-
656
- #: modules/titles.php:247
657
- msgid ""
658
- "<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; "
659
- "tag. The title appears in visitors' title bars and in search engine result "
660
- "titles. "
661
- msgstr ""
662
-
663
- #. Plugin URI of an extension
664
- msgid "http://www.seodesignsolutions.com/wordpress-seo/"
665
- msgstr ""
666
-
667
- #. Description of an extension
668
- msgid ""
669
- "This all-in-one SEO plugin can rewrite title tags, set meta data, add "
670
- "noindex, insert canonical tags, log 404 errors, edit your robots.txt, and "
671
- "more."
672
- msgstr ""
673
-
674
- #. Author of an extension
675
- msgid "SEO Design Solutions"
676
- msgstr ""
677
-
678
- #. Author URI of an extension
679
- msgid "http://www.seodesignsolutions.com/"
680
- msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SEO Ultimate
2
+ # Copyright (C) 2009 John Lamansky
3
+ # This file is distributed under the same license as the SEO Ultimate package.
4
+ #
5
+ #, fuzzy
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: SEO Ultimate 0.9\n"
9
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
10
+ "POT-Creation-Date: 2009-07-23 22:19+0000\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=utf-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+
15
+ #. #-#-#-#-# seo-ultimate.pot (SEO Ultimate 0.9) #-#-#-#-#
16
+ #. Plugin Name of an extension
17
+ #: class.seo-ultimate.php:668 modules/settings.php:16
18
+ msgid "SEO Ultimate"
19
+ msgstr ""
20
+
21
+ #: class.seo-ultimate.php:668
22
+ msgid "SEO"
23
+ msgstr ""
24
+
25
+ #: class.seo-ultimate.php:859
26
+ msgid "SEO Settings Help"
27
+ msgstr ""
28
+
29
+ #: class.seo-ultimate.php:861
30
+ msgid "The SEO Settings box lets you customize these settings:"
31
+ msgstr ""
32
+
33
+ #: class.seo-ultimate.php:863
34
+ msgid "(The SEO Settings box is part of the SEO Ultimate plugin.)"
35
+ msgstr ""
36
+
37
+ #: class.seo-ultimate.php:918
38
+ #, php-format
39
+ msgid ""
40
+ "SEO Ultimate includes the functionality of %1$s. You may want to deactivate %"
41
+ "1$s to avoid plugin conflicts."
42
+ msgstr ""
43
+
44
+ #: class.seo-ultimate.php:999
45
+ msgid "SEO Settings"
46
+ msgstr ""
47
+
48
+ #: class.su-hitset.php:44
49
+ msgid "Date"
50
+ msgstr ""
51
+
52
+ #: class.su-hitset.php:45
53
+ msgid "IP Address"
54
+ msgstr ""
55
+
56
+ #: class.su-hitset.php:46
57
+ msgid "User Agent"
58
+ msgstr ""
59
+
60
+ #: class.su-hitset.php:47
61
+ msgid "URL Requested"
62
+ msgstr ""
63
+
64
+ #: class.su-hitset.php:48
65
+ msgid "Redirected To"
66
+ msgstr ""
67
+
68
+ #: class.su-hitset.php:49
69
+ msgid "Status Code"
70
+ msgstr ""
71
+
72
+ #: class.su-hitset.php:50
73
+ msgid "Referring URL"
74
+ msgstr ""
75
+
76
+ #: class.su-hitset.php:82
77
+ #, php-format
78
+ msgid "%1$s<br />%2$s"
79
+ msgstr ""
80
+
81
+ #: class.su-module.php:495
82
+ #, php-format
83
+ msgid "%s %s|Dropdown Title"
84
+ msgstr ""
85
+
86
+ #: class.su-module.php:507
87
+ #, php-format
88
+ msgid "%s Documentation"
89
+ msgstr ""
90
+
91
+ #: class.su-module.php:511
92
+ msgid "Documentation"
93
+ msgstr ""
94
+
95
+ #: class.su-module.php:529
96
+ #, php-format
97
+ msgid "%1$s | %2$s %3$s by %4$s"
98
+ msgstr ""
99
+
100
+ #: class.su-module.php:563
101
+ msgid "Settings updated."
102
+ msgstr ""
103
+
104
+ #: class.su-module.php:583
105
+ msgid "Save Changes"
106
+ msgstr ""
107
+
108
+ #: class.su-module.php:679
109
+ msgid ""
110
+ "Are you sure you want to replace the textbox contents with this default "
111
+ "value?"
112
+ msgstr ""
113
+
114
+ #: class.su-module.php:692
115
+ msgid "Reset"
116
+ msgstr ""
117
+
118
+ #: modules/404s.php:20
119
+ msgid "404 Monitor"
120
+ msgstr ""
121
+
122
+ #: modules/404s.php:38
123
+ msgid "The log entry was successfully deleted."
124
+ msgstr ""
125
+
126
+ #: modules/404s.php:40
127
+ msgid "This log entry has already been deleted."
128
+ msgstr ""
129
+
130
+ #: modules/404s.php:49
131
+ msgid "The log was successfully cleared."
132
+ msgstr ""
133
+
134
+ #: modules/404s.php:57
135
+ msgid "No 404 errors in the log."
136
+ msgstr ""
137
+
138
+ #: modules/404s.php:68
139
+ msgid "Are you sure you want to delete all 404 log entries?"
140
+ msgstr ""
141
+
142
+ #: modules/404s.php:70
143
+ msgid "Clear Log"
144
+ msgstr ""
145
+
146
+ #: modules/404s.php:83
147
+ msgid "Open"
148
+ msgstr ""
149
+
150
+ #: modules/404s.php:84
151
+ msgid "Google Cache"
152
+ msgstr ""
153
+
154
+ #: modules/404s.php:85
155
+ msgid "Delete Log Entry"
156
+ msgstr ""
157
+
158
+ #: modules/404s.php:101 modules/canonical.php:136 modules/files.php:140
159
+ #: modules/linkbox.php:90 modules/meta.php:140 modules/noindex.php:94
160
+ #: modules/slugs.php:46 modules/titles.php:205
161
+ msgid "Overview"
162
+ msgstr ""
163
+
164
+ #: modules/404s.php:104
165
+ msgid "Options Help"
166
+ msgstr ""
167
+
168
+ #: modules/404s.php:107
169
+ msgid "Troubleshooting"
170
+ msgstr ""
171
+
172
+ #: modules/404s.php:113
173
+ msgid ""
174
+ "\r\n"
175
+ "<ul>\r\n"
176
+ "\t<li><p><strong>What it does:</strong> The 404 Monitor keeps track of non-"
177
+ "existant URLs that generated 404 errors.\r\n"
178
+ "\t\t404 errors are when a search engine or visitor comes to a URL on your "
179
+ "site but nothing exists at that URL.</p></li>\r\n"
180
+ "\t<li><p><strong>Why it helps:</strong> The 404 Monitor helps you spot 404 "
181
+ "errors; \r\n"
182
+ "\t\tthen you can take steps to correct them to reduce linkjuice loss from "
183
+ "broken links.</p></li>\r\n"
184
+ "\t<li><p><strong>How to use it:</strong> Check the 404 Monitor occasionally "
185
+ "for errors.\r\n"
186
+ "\t\t(A numeric bubble will appear next to the &#8220;404 Monitor&#8221; item "
187
+ "on the menu if there are any newly-logged URLs that you haven&#8217;t seen "
188
+ "yet. \r\n"
189
+ "\t\tThese new URLs will also be highlighted green in the table.)\r\n"
190
+ "\t\tIf a 404 error&#8217;s referring URL is located on your site, try "
191
+ "locating and fixing the broken URL.\r\n"
192
+ "\t\tIf moved content was previously located at the requested URL, try using "
193
+ "a redirection plugin to point the old URL to the new one.</p></li>\r\n"
194
+ "</ul>\r\n"
195
+ msgstr ""
196
+
197
+ #: modules/404s.php:130
198
+ msgid ""
199
+ "Currently, the 404 Monitor doesn&#8217;t have any 404 errors in its log. "
200
+ "This is good, and means there&#8217;s no action required on your part. If "
201
+ "the 404 Monitor logs any 404 errors in the future, you&#8217;ll see them on "
202
+ "this page."
203
+ msgstr ""
204
+
205
+ #: modules/404s.php:138
206
+ msgid ""
207
+ "\r\n"
208
+ "<p>Hover over a table row to access these options:</p>\r\n"
209
+ "<ul>\r\n"
210
+ "\t\t<li>The &#8220;View&#8221; link will open the URL in a new window. This "
211
+ "is useful for testing whether or not a redirect is working.</li>\r\n"
212
+ "\t\t<li>The &#8220;Google Cache&#8221; link will open Google&#8217;s "
213
+ "archived version of the URL in a new window. This is useful for determining "
214
+ "what content, if any, used to be located at that URL.</li>\r\n"
215
+ "\t\t<li>Once you've taken care of a 404 error, you can click the &#8220;"
216
+ "Delete Log Entry&#8221; link to remove it from the list. The URL will "
217
+ "reappear on the list if it triggers a 404 error in the future.</li>\r\n"
218
+ "</ul>\r\n"
219
+ msgstr ""
220
+
221
+ #: modules/404s.php:149
222
+ msgid ""
223
+ "\r\n"
224
+ "<p>404 Monitor doesn&#8217;t appear to work? Take these notes into "
225
+ "consideration:</p>\r\n"
226
+ "<ul>\r\n"
227
+ "\t\t<li>In order for the 404 Monitor to track 404 errors, you must have "
228
+ "&#8220;Pretty Permalinks&#8221; enabled in your <a href="
229
+ msgstr ""
230
+
231
+ #: modules/canonical.php:13
232
+ msgid "Canonicalizer"
233
+ msgstr ""
234
+
235
+ #: modules/canonical.php:24
236
+ msgid "Generate <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags."
237
+ msgstr ""
238
+
239
+ #: modules/canonical.php:141
240
+ msgid ""
241
+ "\r\n"
242
+ "<ul>\r\n"
243
+ "\t<li><p><strong>What it does:</strong> Canonicalizer inserts <code>&lt;link "
244
+ "rel=&quot;canonical&quot; /&gt;</code> tags to minimize possible exact-"
245
+ "content duplication penalties.</p></li>\r\n"
246
+ "\t<li><p><strong>Why it helps:</strong> These tags will point Google to the "
247
+ "correct URL for your homepage and each of your posts, Pages, categories, "
248
+ "tags, date archives, and author archives. \r\n"
249
+ "That way, if Google comes across an alternate URL by which one of those "
250
+ "items can be accessed, it will be able to find the correct URL \r\n"
251
+ "and won&#8217;t penalize you for having two identical pages on your site.</"
252
+ "p></li>\r\n"
253
+ "\t<li><p><strong>How to use it:</strong> Just check the checkbox and click "
254
+ "Save Changes. SEO Ultimate will do the rest.</p></li>\r\n"
255
+ "</ul>\r\n"
256
+ msgstr ""
257
+
258
+ #: modules/files.php:15
259
+ msgid "File Editor"
260
+ msgstr ""
261
+
262
+ #: modules/files.php:53
263
+ msgid ""
264
+ "A .htaccess file exists, but it&#8217;s not writable. You can edit it here "
265
+ "once the file permissions are corrected."
266
+ msgstr ""
267
+
268
+ #: modules/files.php:59
269
+ msgid ""
270
+ "WordPress won&#8217;t be able to display your robots.txt file because the "
271
+ "default <a href=\"options-permalink.php\" target=\"_blank\">permalink "
272
+ "structure</a> is in use."
273
+ msgstr ""
274
+
275
+ #: modules/files.php:66
276
+ #, php-format
277
+ msgid "robots.txt [<a href=\"%s\" target=\"_blank\">Open</a>]"
278
+ msgstr ""
279
+
280
+ #: modules/files.php:70
281
+ msgid "Enable this custom robots.txt file and disable the default file"
282
+ msgstr ""
283
+
284
+ #: modules/files.php:71
285
+ msgid "Let other plugins add rules to my custom robots.txt file"
286
+ msgstr ""
287
+
288
+ #: modules/files.php:72
289
+ msgid "robots.txt Settings"
290
+ msgstr ""
291
+
292
+ #: modules/files.php:75
293
+ msgid ""
294
+ "Please realize that incorrectly editing your robots.txt file could block "
295
+ "search engines from your site."
296
+ msgstr ""
297
+
298
+ #: modules/files.php:79
299
+ msgid ".htaccess"
300
+ msgstr ""
301
+
302
+ #: modules/files.php:82
303
+ msgid ""
304
+ "Also, incorrectly editing your .htaccess file could disable your entire "
305
+ "website. Edit with caution!"
306
+ msgstr ""
307
+
308
+ #: modules/files.php:132
309
+ #, php-format
310
+ msgid ""
311
+ "Please note that your privacy settings won&#8217;t have any effect on your "
312
+ "robots.txt file, since you&#8217;re using <a href=\"%s\">a custom one</a>."
313
+ msgstr ""
314
+
315
+ #: modules/files.php:141 modules/slugs.php:47
316
+ msgid "FAQ"
317
+ msgstr ""
318
+
319
+ #: modules/files.php:146
320
+ msgid ""
321
+ "The File Editor module lets you edit system files that are of SEO value. "
322
+ "Edit the files as desired, then click Save Changes. If you create a custom "
323
+ "robots.txt file, be sure to enable it with the checkbox."
324
+ msgstr ""
325
+
326
+ #: modules/files.php:150
327
+ msgid ""
328
+ "\r\n"
329
+ "<h6>Why do I get a &#8220;500 Server Error&#8221; after using the File "
330
+ "Editor?</h6>\r\n"
331
+ "\r\n"
332
+ "<p>You may have inserted code into your .htaccess file that your web server "
333
+ "can't understand. As the File Editor warns, incorrectly editing your ."
334
+ "htaccess file can disable your entire website in this way. To restore your "
335
+ "site, you'll need to use an FTP client (or your web host's File Manager) to "
336
+ "edit or rename your .htaccess file. If you need help, please contact your "
337
+ "web host.</p>\r\n"
338
+ "\r\n"
339
+ "<h6>Will my robots.txt edits remain if I disable the File Editor?</h6>\r\n"
340
+ "\r\n"
341
+ "<p>No. On a WordPress blog, the robots.txt file is dynamically generated "
342
+ "just like your posts and Pages. If you disable the File Editor module or the "
343
+ "entire SEO Ultimate plugin, the File Editor won't be able to insert your "
344
+ "custom code into the robots.txt file anymore.</p>\r\n"
345
+ "\r\n"
346
+ "<h6>Will my .htaccess edits remain if I disable the File Editor?</h6>\r\n"
347
+ "\r\n"
348
+ "<p>Yes. The .htaccess file is static. Your edits will remain even if you "
349
+ "disable SEO Ultimate or its File Editor module.</p>\r\n"
350
+ "\r\n"
351
+ "<h6>Where did my .htaccess edits go?</h6>\r\n"
352
+ "\r\n"
353
+ "<p>The .htaccess file is static, so SEO Ultimate doesn't have total control "
354
+ "over it. It's possible that WordPress, another plugin, or other software may "
355
+ "overwrite your .htaccess file. If you have a backup of your blog's files, "
356
+ "you can try recovering your edits from there.</p>\r\n"
357
+ msgstr ""
358
+
359
+ #: modules/linkbox.php:13
360
+ msgid "Linkbox Inserter"
361
+ msgstr ""
362
+
363
+ #: modules/linkbox.php:19
364
+ msgid "Link to this post!"
365
+ msgstr ""
366
+
367
+ #: modules/linkbox.php:46
368
+ msgid "At the end of posts"
369
+ msgstr ""
370
+
371
+ #: modules/linkbox.php:47
372
+ msgid "At the end of pages"
373
+ msgstr ""
374
+
375
+ #: modules/linkbox.php:48
376
+ msgid "When called by the su_linkbox hook"
377
+ msgstr ""
378
+
379
+ #: modules/linkbox.php:49
380
+ msgid "Display linkboxes..."
381
+ msgstr ""
382
+
383
+ #: modules/linkbox.php:50
384
+ msgid "Linkbox HTML"
385
+ msgstr ""
386
+
387
+ #: modules/linkbox.php:91 modules/meta.php:141 modules/noindex.php:95
388
+ msgid "Settings Help"
389
+ msgstr ""
390
+
391
+ #: modules/linkbox.php:96
392
+ msgid ""
393
+ "\r\n"
394
+ "<ul>\r\n"
395
+ "\t<li><p><strong>What it does:</strong> Linkbox Inserter can add linkboxes "
396
+ "to your posts/pages.</p></li>\r\n"
397
+ "\t<li><p><strong>Why it helps:</strong> Linkboxes contain HTML code that "
398
+ "visitors can use to link to your site. This is a great way to encourage SEO-"
399
+ "beneficial linking activity.</p></li>\r\n"
400
+ "\t<li><p><strong>How to use it:</strong> Use the checkboxes to enable the "
401
+ "Linkbox Inserter in various areas of your site. Customize the HTML if "
402
+ "desired. Click &#8220;Save Changes&#8221; when finished.</p></li>\r\n"
403
+ "</ul>\r\n"
404
+ msgstr ""
405
+
406
+ #: modules/linkbox.php:106
407
+ msgid ""
408
+ "\r\n"
409
+ "<p>Here&#8217;s information on the various settings:</p>\r\n"
410
+ "<ul>\r\n"
411
+ "\t<li><p><strong>Display linkboxes...</strong></p>\r\n"
412
+ "\t\t<ul>\r\n"
413
+ "\t\t\t<li><p><strong>At the end of posts</strong> &mdash; Adds the linkbox "
414
+ "HTML to the end of all posts \r\n"
415
+ "\t\t\t\t(whether they&#8217;re displayed on the blog homepage, in archives, "
416
+ "or by themselves).</p></li>\r\n"
417
+ "\t\t\t<li><p><strong>At the end of pages</strong> &mdash; Adds the linkbox "
418
+ "HTML to the end of all Pages.</p></li>\r\n"
419
+ "\t\t\t<li><p><strong>When called by the su_linkbox hook</strong> &mdash; For "
420
+ "more fine-tuned control over where linkboxes appear, \r\n"
421
+ "\t\t\t\tenable this option and add <code>&lt;?php&nbsp;do_action"
422
+ "('su_linkbox');&nbsp;?&gt;</code> to your theme. \r\n"
423
+ "\t\t\t\tYou can also add an ID parameter to display the linkbox of a "
424
+ "particular post/page; for example: \r\n"
425
+ "\t\t\t\t<code>&lt;?php&nbsp;do_action('su_linkbox',&nbsp;123);&nbsp;?&gt;</"
426
+ "code></p></li>\r\n"
427
+ "\t\t</ul>\r\n"
428
+ "\t</li>\r\n"
429
+ "\t<li><p><strong>HTML</strong> &mdash; The HTML that will be outputted to "
430
+ "display the linkboxes. The HTML field supports these variables:</p>\r\n"
431
+ "\t\t<ul>\r\n"
432
+ "\t\t\t<li>{id} &mdash; The ID of the current post/page, or the ID passed to "
433
+ "the action hook call.</li>\r\n"
434
+ "\t\t\t<li>{url} &mdash; The permalink URL of the post/page.</li>\r\n"
435
+ "\t\t\t<li>{title} &mdash; The title of the post/page.</li>\r\n"
436
+ "\t\t</ul>\r\n"
437
+ "\t</li>\r\n"
438
+ "</ul>\r\n"
439
+ msgstr ""
440
+
441
+ #: modules/meta.php:13
442
+ msgid "Meta Editor"
443
+ msgstr ""
444
+
445
+ #: modules/meta.php:30
446
+ msgid "Blog Homepage Meta Description"
447
+ msgstr ""
448
+
449
+ #: modules/meta.php:31
450
+ msgid "Blog Homepage Meta Keywords"
451
+ msgstr ""
452
+
453
+ #: modules/meta.php:34
454
+ msgid "Use this blog&#8217s tagline as the default homepage description."
455
+ msgstr ""
456
+
457
+ #: modules/meta.php:35
458
+ msgid "Default Values"
459
+ msgstr ""
460
+
461
+ #: modules/meta.php:37
462
+ msgid ""
463
+ "Don&#8217t use this site&#8217s Open Directory description in search results."
464
+ msgstr ""
465
+
466
+ #: modules/meta.php:38
467
+ msgid ""
468
+ "Don&#8217t use this site&#8217s Yahoo! Directory description in search "
469
+ "results."
470
+ msgstr ""
471
+
472
+ #: modules/meta.php:39
473
+ msgid "Don&#8217t cache or archive this site."
474
+ msgstr ""
475
+
476
+ #: modules/meta.php:40
477
+ msgid "Spider Instructions"
478
+ msgstr ""
479
+
480
+ #: modules/meta.php:42
481
+ msgid "Google Webmaster Tools:"
482
+ msgstr ""
483
+
484
+ #: modules/meta.php:43
485
+ msgid "Yahoo! Site Explorer:"
486
+ msgstr ""
487
+
488
+ #: modules/meta.php:44
489
+ msgid "Bing Webmaster Center:"
490
+ msgstr ""
491
+
492
+ #: modules/meta.php:45
493
+ msgid "Verification Codes"
494
+ msgstr ""
495
+
496
+ #: modules/meta.php:46
497
+ msgid "Custom &lt;head&gt; HTML"
498
+ msgstr ""
499
+
500
+ #: modules/meta.php:55
501
+ msgid "Description:"
502
+ msgstr ""
503
+
504
+ #: modules/meta.php:58
505
+ #, php-format
506
+ msgid "You&#8217;ve entered %s characters. Most search engines use up to 160."
507
+ msgstr ""
508
+
509
+ #: modules/meta.php:60
510
+ msgid "Keywords:<br /><em>(separate with commas)</em>"
511
+ msgstr ""
512
+
513
+ #: modules/meta.php:127
514
+ msgid "Custom Header Code"
515
+ msgstr ""
516
+
517
+ #: modules/meta.php:146
518
+ msgid ""
519
+ "\r\n"
520
+ "<ul>\r\n"
521
+ "\t<li><p><strong>What it does:</strong> Meta Editor lets you customize a "
522
+ "wide variety of settings known as &#8220;meta data.&#8221;</p></li>\r\n"
523
+ "\t<li><p><strong>Why it helps:</strong> Using meta data, you can convey "
524
+ "information to search engines, such as what text you want displayed by your "
525
+ "site in search results, what your site is about, whether they can cache your "
526
+ "site, etc.</p></li>\r\n"
527
+ "\t<li><p><strong>How to use it:</strong> Adjust the settings as desired, and "
528
+ "then click Save Changes. You can refer to the &#8220;Settings Help&#8221; "
529
+ "tab for information on the settings available. You can also customize the "
530
+ "meta data of an individual post or page by using the textboxes that Meta "
531
+ "Editor adds to the post/page editors.</p></li>\r\n"
532
+ "</ul>\r\n"
533
+ msgstr ""
534
+
535
+ #: modules/meta.php:156
536
+ msgid ""
537
+ "\r\n"
538
+ "<p>Here&#8217;s information on the various settings:</p>\r\n"
539
+ "<ul>\r\n"
540
+ "\t<li><p><strong>Blog Homepage Meta Description</strong> &mdash; When your "
541
+ "blog homepage appears in search results, it&#8217;ll have a title and a "
542
+ "description. \r\n"
543
+ "\t\tWhen you insert content into the description field below, the Meta "
544
+ "Editor will add code to your blog homepage (the <code>&lt;meta&nbsp;"
545
+ "name=&quot;description&quot;&nbsp;/&gt;</code> tag)\r\n"
546
+ "\t\tthat asks search engines to use what you&#8217;ve entered as the "
547
+ "homepage&#8217;s search results description.</p></li>\r\n"
548
+ "\t<li><p><strong>Blog Homepage Meta Keywords</strong> &mdash; Here you can "
549
+ "enter keywords that describe the overall subject matter of your entire blog. "
550
+ "Use commas to separate keywords. \r\n"
551
+ "\t\tYour keywords will be put in the <code>&lt;meta&nbsp;name=&quot;"
552
+ "keywords&quot;&nbsp;/&gt;</code> tag on your blog homepage.</p></li>\r\n"
553
+ "\t<li><p><strong>Default Values</strong></p>\r\n"
554
+ "\t\t<ul>\r\n"
555
+ "\t\t\t<li><p><strong>Use this blog&#8217;s tagline as the default homepage "
556
+ "description.</strong> &mdash; \r\n"
557
+ "\t\t\t\tIf this box is checked and if the Blog Homepage Meta Description "
558
+ "field is empty, \r\n"
559
+ "\t\t\t\tMeta Editor will use your blog&#8217;s <a href="
560
+ msgstr ""
561
+
562
+ #: modules/meta.php:191
563
+ msgid ""
564
+ "<strong>Description:</strong> &mdash; The value of the meta description tag. "
565
+ "The description will often appear underneath the title in search engine "
566
+ "results. "
567
+ msgstr ""
568
+
569
+ #: modules/meta.php:193
570
+ msgid ""
571
+ "<strong>Keywords:</strong> &mdash; The value of the meta keywords tag. The "
572
+ "keywords list gives search engines a hint as to what this post/page is "
573
+ "about. "
574
+ msgstr ""
575
+
576
+ #: modules/modules.php:13
577
+ msgid "Modules"
578
+ msgstr ""
579
+
580
+ #: modules/modules.php:14
581
+ msgid "Module Manager"
582
+ msgstr ""
583
+
584
+ #: modules/modules.php:35
585
+ msgid ""
586
+ "SEO Ultimate&#8217;s features are located in groups called &#8220;modules."
587
+ "&#8221; By default, most of these modules are listed in the &#8220;"
588
+ "SEO&#8221; menu on the left. Whenever you&#8217;re working with a module, "
589
+ "you can view documentation by clicking the &#8220;Help&#8221; tab in the "
590
+ "upper-right-hand corner of your administration screen."
591
+ msgstr ""
592
+
593
+ #: modules/modules.php:37
594
+ msgid ""
595
+ "The Module Manager lets you disable or hide modules you don&#8217;t use. "
596
+ "You can also silence modules from displaying bubble alerts on the menu."
597
+ msgstr ""
598
+
599
+ #: modules/modules.php:43
600
+ msgid "Status"
601
+ msgstr ""
602
+
603
+ #: modules/modules.php:44
604
+ msgid "Module"
605
+ msgstr ""
606
+
607
+ #: modules/modules.php:57
608
+ msgid "Enabled"
609
+ msgstr ""
610
+
611
+ #: modules/modules.php:58
612
+ msgid "Silenced"
613
+ msgstr ""
614
+
615
+ #: modules/modules.php:59
616
+ msgid "Hidden"
617
+ msgstr ""
618
+
619
+ #: modules/modules.php:60
620
+ msgid "Disabled"
621
+ msgstr ""
622
+
623
+ #: modules/modules.php:109
624
+ msgid ""
625
+ "\r\n"
626
+ "<p>The Module Manager lets you customize the visibility and accessibility of "
627
+ "each module; here are the options available:</p>\r\n"
628
+ "<ul>\r\n"
629
+ "\t<li><strong>Enabled</strong> &mdash; The default option. The module will "
630
+ "be fully enabled and accessible.</li>\r\n"
631
+ "\t<li><strong>Silenced</strong> &mdash; The module will be enabled and "
632
+ "accessible, but it won&#8217;t be allowed to display numeric bubble alerts "
633
+ "on the menu.</li>\r\n"
634
+ "\t<li><strong>Hidden</strong> &mdash; The module&#8217;s functionality will "
635
+ "be enabled, but the module won&#8217;t be visible on the SEO menu. You will "
636
+ "still be able to access the module&#8217;s admin page by clicking on its "
637
+ "title in the Module Manager table.</li>\r\n"
638
+ "\t<li><strong>Disabled</strong> &mdash; The module will be completely "
639
+ "disabled and inaccessible.</li>\r\n"
640
+ "</ul>\r\n"
641
+ msgstr ""
642
+
643
+ #: modules/noindex.php:13
644
+ msgid "Noindex Manager"
645
+ msgstr ""
646
+
647
+ #: modules/noindex.php:40
648
+ msgid ""
649
+ "Note: The current <a href='options-privacy.php'>privacy settings</a> will "
650
+ "block indexing of the entire site, regardless of which options are set below."
651
+ msgstr ""
652
+
653
+ #: modules/noindex.php:43
654
+ msgid "Prevent indexing of..."
655
+ msgstr ""
656
+
657
+ #: modules/noindex.php:44
658
+ msgid "Administration back-end pages"
659
+ msgstr ""
660
+
661
+ #: modules/noindex.php:45
662
+ msgid "Author archives"
663
+ msgstr ""
664
+
665
+ #: modules/noindex.php:46
666
+ msgid "Blog search pages"
667
+ msgstr ""
668
+
669
+ #: modules/noindex.php:47
670
+ msgid "Category archives"
671
+ msgstr ""
672
+
673
+ #: modules/noindex.php:48
674
+ msgid "Comment feeds"
675
+ msgstr ""
676
+
677
+ #: modules/noindex.php:49
678
+ msgid "Comment subpages"
679
+ msgstr ""
680
+
681
+ #: modules/noindex.php:50
682
+ msgid "Date-based archives"
683
+ msgstr ""
684
+
685
+ #: modules/noindex.php:51
686
+ msgid "Subpages of the homepage"
687
+ msgstr ""
688
+
689
+ #: modules/noindex.php:52
690
+ msgid "Tag archives"
691
+ msgstr ""
692
+
693
+ #: modules/noindex.php:53
694
+ msgid "User login/registration pages"
695
+ msgstr ""
696
+
697
+ #: modules/noindex.php:100
698
+ msgid ""
699
+ "\r\n"
700
+ "<ul>\r\n"
701
+ "\t<li><p><strong>What it does:</strong> Noindex Manager lets you prohibit "
702
+ "the search engine spiders from indexing certain pages on your blog using the "
703
+ "&quot;meta robots noindex&quot; tag.</p></li>\r\n"
704
+ "\t<li><p><strong>Why it helps:</strong> This module lets you &#8220;"
705
+ "noindex&#8221; pages that contain unimportant content (e.g. the login page), "
706
+ "or pages that mostly contain duplicate content.</p></li>\r\n"
707
+ "\t<li><p><strong>How to use it:</strong> Adjust the settings as desired, and "
708
+ "then click Save Changes. You can refer to the &#8220;Settings Help&#8221; "
709
+ "tab for information on the settings available.</p></li>\r\n"
710
+ "</ul>\r\n"
711
+ msgstr ""
712
+
713
+ #: modules/noindex.php:110
714
+ msgid ""
715
+ "\r\n"
716
+ "<p>Here&#8217;s information on the various settings:</p>\r\n"
717
+ "<ul>\r\n"
718
+ "\t<li><p><strong>Administration back-end pages</strong> &mdash; Tells "
719
+ "spiders not to index the administration area (the part you&#8217;re in now),"
720
+ "\r\n"
721
+ "\t\tin the unlikely event a spider somehow gains access to the "
722
+ "administration. Recommended.</p></li>\r\n"
723
+ "\t<li><p><strong>Author archives</strong> &mdash; Tells spiders not to index "
724
+ "author archives. Useful if your blog only has one author.</p></li>\r\n"
725
+ "\t<li><p><strong>Blog search pages</strong> &mdash; Tells spiders not to "
726
+ "index the result pages of WordPress&#8217;s blog search function. "
727
+ "Recommended.</p></li>\r\n"
728
+ "\t<li><p><strong>Category archives</strong> &mdash; Tells spiders not to "
729
+ "index category archives. Recommended only if you don&#8217;t use categories."
730
+ "</p></li>\r\n"
731
+ "\t<li><p><strong>Comment feeds</strong> &mdash; Tells spiders not to index "
732
+ "the RSS feeds that exist for every post&#8217;s comments.\r\n"
733
+ "\t\t(These comment feeds are totally separate from your normal blog feeds.) "
734
+ "Recommended.</p></li>\r\n"
735
+ "\t<li><p><strong>Comment subpages</strong> &mdash; Tells spiders not to "
736
+ "index comment subpages (page 2, page 3, etc.).</p></li>\r\n"
737
+ "\t<li><p><strong>Date-based archives</strong> &mdash; Tells spiders not to "
738
+ "index day/month/year archives.\r\n"
739
+ "\t\tRecommended, since these pages have little keyword value.</p></li>\r\n"
740
+ "\t<li><p><strong>Subpages of the homepage</strong> &mdash; Tells spiders not "
741
+ "to index the homepage's subpages (page 2, page 3, etc).\r\n"
742
+ "\t\tRecommended.</p></li>\r\n"
743
+ "\t<li><p><strong>Tag archives</strong> &mdash; Tells spiders not to index "
744
+ "tag archives. Recommended only if you don&#8217;t use tags.</p></li>\r\n"
745
+ "\t<li><p><strong>User login/registration pages</strong> &mdash; Tells "
746
+ "spiders not to index WordPress&#8217;s user login and registration pages. "
747
+ "Recommended.</p></li>\r\n"
748
+ "</ul>\r\n"
749
+ msgstr ""
750
+
751
+ #: modules/sds-blog.php:13
752
+ msgid "SEO Design Solutions Whitepapers"
753
+ msgstr ""
754
+
755
+ #: modules/sds-blog.php:14
756
+ msgid "Whitepapers"
757
+ msgstr ""
758
+
759
+ #: modules/sds-blog.php:37
760
+ msgid ""
761
+ "Search engine optimization articles from the company behind the SEO Ultimate "
762
+ "plugin."
763
+ msgstr ""
764
+
765
+ #: modules/sds-blog.php:88
766
+ msgid ""
767
+ "The articles below are loaded from the SEO Design Solutions website. Click "
768
+ "on an article&#8217s title to read it."
769
+ msgstr ""
770
+
771
+ #: modules/settings.php:15
772
+ msgid "SEO Ultimate Plugin Settings"
773
+ msgstr ""
774
+
775
+ #: modules/settings.php:65
776
+ msgid "Settings successfully imported."
777
+ msgstr ""
778
+
779
+ #: modules/settings.php:67
780
+ msgid ""
781
+ "The uploaded file is not in the proper format. Settings could not be "
782
+ "imported."
783
+ msgstr ""
784
+
785
+ #: modules/settings.php:69
786
+ msgid "The settings file could not be uploaded successfully."
787
+ msgstr ""
788
+
789
+ #: modules/settings.php:72
790
+ msgid ""
791
+ "Settings could not be imported because no settings file was selected. Please "
792
+ "click the &#8220;Browse&#8221; button and select a file to import."
793
+ msgstr ""
794
+
795
+ #: modules/settings.php:80
796
+ msgid "All settings have been erased and defaults have been restored."
797
+ msgstr ""
798
+
799
+ #: modules/settings.php:94
800
+ msgid "Plugin Settings"
801
+ msgstr ""
802
+
803
+ #: modules/settings.php:96
804
+ msgid "Enable attribution link"
805
+ msgstr ""
806
+
807
+ #: modules/settings.php:97
808
+ msgid "Enable attribution link CSS styling"
809
+ msgstr ""
810
+
811
+ #: modules/settings.php:98
812
+ msgid "Notify me about unnecessary active plugins"
813
+ msgstr ""
814
+
815
+ #: modules/settings.php:100
816
+ msgid "Insert comments around HTML code insertions"
817
+ msgstr ""
818
+
819
+ #: modules/settings.php:105
820
+ msgid "Manage Settings Data"
821
+ msgstr ""
822
+
823
+ #: modules/settings.php:109
824
+ msgid ""
825
+ "This section allows you to export, import, and reset the settings of the "
826
+ "plugin and all its modules."
827
+ msgstr ""
828
+
829
+ #: modules/settings.php:111
830
+ msgid ""
831
+ "A settings file includes the data of every checkbox and textbox of every "
832
+ "installed module, as well as the &#8220;Plugin Settings&#8221; section "
833
+ "above. "
834
+ msgstr ""
835
+
836
+ #: modules/settings.php:120
837
+ msgid "Export:"
838
+ msgstr ""
839
+
840
+ #: modules/settings.php:123
841
+ msgid "Download Settings File"
842
+ msgstr ""
843
+
844
+ #: modules/settings.php:128
845
+ msgid "Import:"
846
+ msgstr ""
847
+
848
+ #: modules/settings.php:133
849
+ msgid ""
850
+ "Are you sure you want to import this settings file? This will overwrite your "
851
+ "current settings and cannot be undone."
852
+ msgstr ""
853
+
854
+ #: modules/settings.php:134
855
+ msgid "Import This Settings File"
856
+ msgstr ""
857
+
858
+ #: modules/settings.php:141
859
+ msgid "Reset:"
860
+ msgstr ""
861
+
862
+ #: modules/settings.php:144
863
+ msgid ""
864
+ "Are you sure you want to erase all module settings? This cannot be undone."
865
+ msgstr ""
866
+
867
+ #: modules/settings.php:145
868
+ msgid "Restore Default Settings"
869
+ msgstr ""
870
+
871
+ #: modules/settings.php:169
872
+ msgid ""
873
+ "\r\n"
874
+ "<p>The Settings module lets you manage settings related to the SEO Ultimate "
875
+ "plugin as a whole.</p>\r\n"
876
+ "<p>Here&#8217;s information on each of the settings:</p>\r\n"
877
+ "<ul>\r\n"
878
+ "\t<li><p><strong>Enable attribution link</strong> &mdash; If enabled, the "
879
+ "plugin will display an attribution link on your site.\r\n"
880
+ "\t\tWe ask that you please leave this enabled.</p></li>\r\n"
881
+ "\t<li><p><strong>Insert comments around HTML code insertions</strong> "
882
+ "&mdash; If enabled, SEO Ultimate will use HTML comments to identify all code "
883
+ "it inserts into your &lt;head&gt; tag.\r\n"
884
+ "\t\tThis is useful if you&#8217;re trying to figure out whether or not SEO "
885
+ "Ultimate is inserting a certain piece of header code.</p></li>\r\n"
886
+ "</ul>\r\n"
887
+ msgstr ""
888
+
889
+ #: modules/slugs.php:13
890
+ msgid "Slug Optimizer"
891
+ msgstr ""
892
+
893
+ #: modules/slugs.php:17
894
+ msgid "Words to Remove"
895
+ msgstr ""
896
+
897
+ #: modules/slugs.php:52
898
+ msgid ""
899
+ "\r\n"
900
+ "<ul>\r\n"
901
+ "\t<li><p><strong>What it does:</strong> Slug Optimizer removes common words "
902
+ "from the portion of a post&#8217;s or Page&#8217;s URL that is based on its "
903
+ "title. (This portion is also known as the &#8220;slug.&#8221;)</p></li>\r\n"
904
+ "\t<li><p><strong>Why it helps:</strong> Slug Optimizer increases keyword "
905
+ "potency because there are fewer words in your URLs competing for relevance.</"
906
+ "p></li>\r\n"
907
+ "\t<li><p><strong>How to use it:</strong> Slug Optimizer goes to work when "
908
+ "you&#8217;re editing a post or Page, with no action required on your part."
909
+ "\r\n"
910
+ "\t\tIf needed, you can use the textbox below to customize which words are "
911
+ "removed.</p></li>\r\n"
912
+ "</ul>\r\n"
913
+ msgstr ""
914
+
915
+ #: modules/slugs.php:63
916
+ msgid ""
917
+ "\r\n"
918
+ "<h6>What's a slug?</h6>\r\n"
919
+ "<p>The slug of a post or page is the portion of its URL that is based on its "
920
+ "title.</p>\r\n"
921
+ "<p>When you edit a post or Page in WordPress, the slug is the yellow-"
922
+ "highlighted portion of the Permalink beneath the Title textbox.</p>\r\n"
923
+ "\r\n"
924
+ "<h6>Does the Slug Optimizer change my existing URLs?</h6>\r\n"
925
+ "<p>No. Slug Optimizer will not relocate your content by changing existing "
926
+ "URLs. Slug Optimizer only takes effect on new posts and pages.</p>\r\n"
927
+ "\r\n"
928
+ "<h6>How do I see Slug Optimizer in action?</h6>\r\n"
929
+ "<ol>\r\n"
930
+ "\t<li>Create a new post/Page in WordPress.</li>\r\n"
931
+ "\t<li>Type in a title containing some common words.</li>\r\n"
932
+ "\t<li>Click outside the Title box. WordPress will insert a URL labeled "
933
+ "&#8220;Permalink&#8221; below the Title textbox. The Slug Optimizer will "
934
+ "have removed the common words from the URL.</li>\r\n"
935
+ "</ol>\r\n"
936
+ "\r\n"
937
+ "<h6>Why didn't the Slug Optimizer remove common words from my slug?</h6>\r\n"
938
+ "<p>It's possible that every word in your post title is in the list of words "
939
+ "to remove. In this case, Slug Optimizer doesn't remove the words, because if "
940
+ "it did, you'd end up with a blank slug.</p>\r\n"
941
+ "\r\n"
942
+ "<h6>What if I want to include a common word in my slug?</h6>\r\n"
943
+ "<p>When editing the post or page in question, just click the Edit button "
944
+ "next to the permalink and change the slug as desired.</p>\r\n"
945
+ "\r\n"
946
+ "<h6>How do I revert back to the optimized slug after making changes?</h6>\r\n"
947
+ "<p>When editing the post or page in question, just click the Edit button "
948
+ "next to the permalink; a Save button will appear in its place. Next erase "
949
+ "the contents of the textbox, and then click the aforementioned Save button.</"
950
+ "p>\r\n"
951
+ msgstr ""
952
+
953
+ #: modules/titles.php:13
954
+ msgid "Title Rewriter"
955
+ msgstr ""
956
+
957
+ #: modules/titles.php:25
958
+ msgid "{blog}"
959
+ msgstr ""
960
+
961
+ #: modules/titles.php:26
962
+ msgid "{post} | {blog}"
963
+ msgstr ""
964
+
965
+ #: modules/titles.php:27
966
+ msgid "{page} | {blog}"
967
+ msgstr ""
968
+
969
+ #: modules/titles.php:28
970
+ msgid "{category} | {blog}"
971
+ msgstr ""
972
+
973
+ #: modules/titles.php:29
974
+ msgid "{tag} | {blog}"
975
+ msgstr ""
976
+
977
+ #: modules/titles.php:30
978
+ msgid "Archives for {month} {day}, {year} | {blog}"
979
+ msgstr ""
980
+
981
+ #: modules/titles.php:31
982
+ msgid "Archives for {month} {year} | {blog}"
983
+ msgstr ""
984
+
985
+ #: modules/titles.php:32
986
+ msgid "Archives for {year} | {blog}"
987
+ msgstr ""
988
+
989
+ #: modules/titles.php:33
990
+ msgid "Posts by {author} | {blog}"
991
+ msgstr ""
992
+
993
+ #: modules/titles.php:34
994
+ msgid "Search Results for {query} | {blog}"
995
+ msgstr ""
996
+
997
+ #: modules/titles.php:35
998
+ msgid "404 Not Found | {blog}"
999
+ msgstr ""
1000
+
1001
+ #: modules/titles.php:36
1002
+ msgid "{title} - Page {num}"
1003
+ msgstr ""
1004
+
1005
+ #: modules/titles.php:42
1006
+ msgid "Blog Homepage Title"
1007
+ msgstr ""
1008
+
1009
+ #: modules/titles.php:43
1010
+ msgid "Post Title Format"
1011
+ msgstr ""
1012
+
1013
+ #: modules/titles.php:44
1014
+ msgid "Page Title Format"
1015
+ msgstr ""
1016
+
1017
+ #: modules/titles.php:45
1018
+ msgid "Category Title Format"
1019
+ msgstr ""
1020
+
1021
+ #: modules/titles.php:46
1022
+ msgid "Tag Title Format"
1023
+ msgstr ""
1024
+
1025
+ #: modules/titles.php:47
1026
+ msgid "Day Archive Title Format"
1027
+ msgstr ""
1028
+
1029
+ #: modules/titles.php:48
1030
+ msgid "Month Archive Title Format"
1031
+ msgstr ""
1032
+
1033
+ #: modules/titles.php:49
1034
+ msgid "Year Archive Title Format"
1035
+ msgstr ""
1036
+
1037
+ #: modules/titles.php:50
1038
+ msgid "Author Archive Title Format"
1039
+ msgstr ""
1040
+
1041
+ #: modules/titles.php:51
1042
+ msgid "Search Title Format"
1043
+ msgstr ""
1044
+
1045
+ #: modules/titles.php:52
1046
+ msgid "404 Title Format"
1047
+ msgstr ""
1048
+
1049
+ #: modules/titles.php:53
1050
+ msgid "Pagination Title Format"
1051
+ msgstr ""
1052
+
1053
+ #: modules/titles.php:64
1054
+ msgid "Title Tag:"
1055
+ msgstr ""
1056
+
1057
+ #: modules/titles.php:206
1058
+ msgid "Settings & Variables"
1059
+ msgstr ""
1060
+
1061
+ #: modules/titles.php:211
1062
+ msgid ""
1063
+ "\r\n"
1064
+ "<ul>\r\n"
1065
+ "\t<li><p><strong>What it does:</strong> Title Rewriter helps you customize "
1066
+ "the contents of your website&#8217;s <code>&lt;title&gt;</code> tags.\r\n"
1067
+ "\t\tThe tag contents are displayed in web browser title bars and in search "
1068
+ "engine result pages.</p></li>\r\n"
1069
+ "\t<li><p><strong>Why it helps:</strong> Proper title rewriting ensures that "
1070
+ "the keywords in your post/Page titles have greater prominence for search "
1071
+ "engine spiders and users.\r\n"
1072
+ "\t\tThis is an important foundation for WordPress SEO.</p></li>\r\n"
1073
+ "\t<li><p><strong>How to use it:</strong> Title Rewriter enables recommended "
1074
+ "settings automatically, so you shouldn&#8217;t need to change anything.\r\n"
1075
+ "\t\tIf you do wish to edit the rewriting formats, you can do so using the "
1076
+ "textboxes below (the &#8220;Settings Help&#8221; tab includes additional "
1077
+ "information on this).\r\n"
1078
+ "\t\tYou also have the option of overriding the <code>&lt;title&gt;</code> "
1079
+ "tag of an individual post or page by using the &#8220;Title Tag&#8221; "
1080
+ "textbox that Title Rewriter adds to the post/page editors.</p></li>\r\n"
1081
+ "</ul>\r\n"
1082
+ msgstr ""
1083
+
1084
+ #: modules/titles.php:225
1085
+ msgid ""
1086
+ "\r\n"
1087
+ "<p>Various variables, surrounded in {curly brackets}, are provided for use "
1088
+ "in the title formats.\r\n"
1089
+ "All settings support the {blog} variable, which is replaced with the name of "
1090
+ "the blog.</p>\r\n"
1091
+ "<p>Here&#8217;s information on each of the settings and its supported "
1092
+ "variables:</p>\r\n"
1093
+ "<ul>\r\n"
1094
+ "\t<li><p><strong>Blog Homepage Title</strong> &mdash; Displays on the main "
1095
+ "blog posts page.</p></li>\r\n"
1096
+ "\t<li><p><strong>Post Title Format</strong> &mdash; Displays on single-post "
1097
+ "pages. The {post} variable is replaced with the post&#8217;s title.</p></li>"
1098
+ "\r\n"
1099
+ "\t<li><p><strong>Page Title Format</strong> &mdash; Displays on WordPress "
1100
+ "Pages. The {page} variable is replaced with the Page&#8217;s title.</p></li>"
1101
+ "\r\n"
1102
+ "\t<li><p><strong>Category Title Format</strong> &mdash; Displays on category "
1103
+ "archives. The {category} variable is replaced with the name of the category."
1104
+ "</p></li>\r\n"
1105
+ "\t<li><p><strong>Tag Title Format</strong> &mdash; Displays on tag archives. "
1106
+ "The {tag} variable is replaced with the name of the tag.</p></li>\r\n"
1107
+ "\t<li><p><strong>Day Archive Title Format</strong> &mdash; Displays on day "
1108
+ "archives. Supports these variables:</p>\r\n"
1109
+ "\t\t<ul>\r\n"
1110
+ "\t\t\t<li>{day} &mdash; The day number, with ordinal suffix, e.g. 23rd</li>"
1111
+ "\r\n"
1112
+ "\t\t\t<li>{daynum} &mdash; The two-digit day number, e.g. 23</li>\r\n"
1113
+ "\t\t\t<li>{month} &mdash; The name of the month, e.g. April</li>\r\n"
1114
+ "\t\t\t<li>{monthnum} &mdash; The two-digit number of the month, e.g. 04</li>"
1115
+ "\r\n"
1116
+ "\t\t\t<li>{year} &mdash; The year, e.g. 2009</li>\r\n"
1117
+ "\t\t</ul></li>\r\n"
1118
+ "\t<li><p><strong>Month Archive Title Format</strong> &mdash; Displays on "
1119
+ "month archives. Supports {month}, {monthnum}, and {year}.</p></li>\r\n"
1120
+ "\t<li><p><strong>Year Archive Title Format</strong> &mdash; Displays on year "
1121
+ "archives. Supports the {year} variable.</p></li>\r\n"
1122
+ "\t<li><p><strong>Author Archive Title Format</strong> &mdash; Displays on "
1123
+ "author archives. The {author} variable is replaced with the author&#8217;s "
1124
+ "Display Name.</p></li>\r\n"
1125
+ "\t<li><p><strong>Search Title Format</strong> &mdash; Displays on the result "
1126
+ "pages for WordPress&#8217;s blog search function.\r\n"
1127
+ "\t\tThe {query} variable is replaced with the search query as-is. The "
1128
+ "{ucwords} variable returns the search query with the first letter of each "
1129
+ "word capitalized.</p></li>\r\n"
1130
+ "\t<li><p><strong>404 Title Format</strong> &mdash; Displays whenever a URL "
1131
+ "doesn&#8217;t go anywhere.</p></li>\r\n"
1132
+ "\t<li><p><strong>Pagination Title Format</strong> &mdash; Displays whenever "
1133
+ "the visitor is on a subpage (page 2, page 3, etc). Supports these variables:"
1134
+ "</p>\r\n"
1135
+ "\t\t<ul>\r\n"
1136
+ "\t\t\t<li>{title} &mdash; The title that would normally be displayed on page "
1137
+ "1.</li>\r\n"
1138
+ "\t\t\t<li>{num} &mdash; The current page number (2, 3, etc).</li>\r\n"
1139
+ "\t\t\t<li>{max} &mdash; The total number of subpages available. Would "
1140
+ "usually be used like this: Page {num} of {max}</li>\r\n"
1141
+ "\t\t</ul></li>\r\n"
1142
+ "</ul>\r\n"
1143
+ msgstr ""
1144
+
1145
+ #: modules/titles.php:260
1146
+ msgid ""
1147
+ "<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; "
1148
+ "tag. The title appears in visitors' title bars and in search engine result "
1149
+ "titles. "
1150
+ msgstr ""
1151
+
1152
+ #. Plugin URI of an extension
1153
+ msgid "http://www.seodesignsolutions.com/wordpress-seo/"
1154
+ msgstr ""
1155
+
1156
+ #. Description of an extension
1157
+ msgid ""
1158
+ "This all-in-one SEO plugin can rewrite title tags, set meta data, add "
1159
+ "noindex, insert canonical tags, log 404 errors, edit your robots.txt, and "
1160
+ "more."
1161
+ msgstr ""
1162
+
1163
+ #. Author of an extension
1164
+ msgid "SEO Design Solutions"
1165
+ msgstr ""
1166
+
1167
+ #. Author URI of an extension
1168
+ msgid "http://www.seodesignsolutions.com/"
1169
+ msgstr ""
tabs.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function()
2
+ {
3
+ su_init_tabs();
4
+ });
5
+
6
+ function su_init_tabs()
7
+ {
8
+ /* if this is not the breadcrumb admin page, quit */
9
+ if (!jQuery("#su-tabset").length) return;
10
+
11
+ /* init markup for tabs */
12
+ jQuery('#su-tabset').prepend("<ul><\/ul>");
13
+ jQuery('#su-tabset > fieldset').each(function(i)
14
+ {
15
+ id = jQuery(this).attr('id');
16
+ caption = jQuery(this).find('h3').text();
17
+ jQuery('#su-tabset > ul').append('<li><a href="#'+id+'"><span>'+caption+"<\/span><\/a><\/li>");
18
+ jQuery(this).find('h3').hide();
19
+ });
20
+
21
+ /* init the tabs plugin */
22
+ var jquiver = undefined == jQuery.ui ? [0,0,0] : undefined == jQuery.ui.version ? [0,1,0] : jQuery.ui.version.split('.');
23
+ switch(true) {
24
+ // tabs plugin has been fixed to work on the parent element again.
25
+ case jquiver[0] >= 1 && jquiver[1] >= 7:
26
+ jQuery("#su-tabset").tabs();
27
+ break;
28
+ // tabs plugin has bug and needs to work on ul directly.
29
+ default:
30
+ jQuery("#su-tabset > ul").tabs();
31
+ }
32
+
33
+ /* handler for openeing the last tab after submit (compability version) */
34
+ jQuery('#su-tabset ul a').click(function(i){
35
+ var form = jQuery('#bcn_admin_options');
36
+ var action = form.attr("action").split('#', 1) + jQuery(this).attr('href');
37
+ // an older bug pops up with some jQuery version(s), which makes it
38
+ // necessary to set the form's action attribute by standard javascript
39
+ // node access:
40
+ form.get(0).setAttribute("action", action);
41
+ });
42
+ }