SEO Ultimate - Version 2.1

Version Description

Download this release

Release Info

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

Code changes from version 2.0 to 2.1

Files changed (85) hide show
  1. includes/jlfunctions/arr.php +7 -0
  2. includes/jlfunctions/str.php +30 -0
  3. includes/jlwp/functions.php +1 -0
  4. includes/tabs.js +3 -3
  5. modules/404s/404s.php +0 -117
  6. modules/404s/fofs-log.css +26 -0
  7. modules/404s/fofs-log.php +262 -0
  8. modules/404s/fofs-settings.php +28 -0
  9. modules/404s/fofs.php +17 -0
  10. modules/404s/hit-cache.png +0 -0
  11. modules/404s/hit-delete.png +0 -0
  12. modules/404s/hit-details.png +0 -0
  13. modules/404s/hit-open.png +0 -0
  14. modules/404s/hit-redirect.png +0 -0
  15. modules/404s/index.php +4 -0
  16. modules/autolinks/autolinks.css +4 -0
  17. modules/autolinks/autolinks.php +1 -12
  18. modules/autolinks/index.php +4 -0
  19. modules/canonical/canonical.php +0 -1
  20. modules/canonical/index.php +4 -0
  21. modules/class.su-importmodule.php +3 -6
  22. modules/class.su-module.php +207 -53
  23. modules/competition-queries/competition-queries.js +8 -0
  24. modules/competition-queries/competition-queries.php +0 -15
  25. modules/competition-queries/index.php +4 -0
  26. modules/files/files.php +0 -32
  27. modules/files/index.php +4 -0
  28. modules/import-aiosp/import-aiosp.css +16 -0
  29. modules/import-aiosp/import-aiosp.php +0 -23
  30. modules/import-aiosp/index.php +4 -0
  31. modules/linkbox/index.php +4 -0
  32. modules/linkbox/linkbox.php +0 -1
  33. modules/meta/index.php +4 -0
  34. modules/meta/meta-settings.php +1 -2
  35. modules/meta/meta.php +1 -4
  36. modules/modules.css +20 -5
  37. modules/modules.js +11 -0
  38. modules/modules/index.php +4 -0
  39. modules/modules/modules.css +29 -0
  40. modules/modules/modules.js +8 -0
  41. modules/modules/modules.php +1 -51
  42. modules/more-links/index.php +4 -0
  43. modules/more-links/more-links.php +0 -1
  44. modules/noindex/index.php +4 -0
  45. modules/noindex/noindex.php +1 -2
  46. modules/sds-blog/index.php +4 -0
  47. modules/sds-blog/sds-blog.css +38 -0
  48. modules/sds-blog/sds-blog.php +27 -66
  49. modules/settings/global-settings.php +66 -0
  50. modules/settings/index.php +4 -0
  51. modules/settings/settings-data.css +20 -0
  52. modules/settings/settings-data.php +225 -0
  53. modules/settings/settings.php +2 -211
  54. modules/settings/uninstall.php +66 -0
  55. modules/site-keyword-queries/index.php +4 -0
  56. modules/site-keyword-queries/site-keyword-queries.php +0 -1
  57. modules/slugs/index.php +4 -0
  58. modules/slugs/slugs.php +0 -1
  59. modules/titles/index.php +4 -0
  60. modules/titles/titles-formats.php +6 -0
  61. modules/titles/titles-posts.php +0 -1
  62. modules/titles/titles-taxonomies.php +0 -1
  63. modules/titles/titles.css +7 -0
  64. modules/titles/titles.php +5 -31
  65. plugin/class.seo-ultimate.php +247 -127
  66. plugin/class.su-hitset.php +0 -112
  67. plugin/su-functions.php +10 -18
  68. readme.txt +58 -36
  69. screenshot-1.png +0 -0
  70. screenshot-10.png +0 -0
  71. screenshot-11.png +0 -0
  72. screenshot-12.png +0 -0
  73. screenshot-13.png +0 -0
  74. screenshot-14.png +0 -0
  75. screenshot-15.png +0 -0
  76. screenshot-2.png +0 -0
  77. screenshot-3.png +0 -0
  78. screenshot-4.png +0 -0
  79. screenshot-5.png +0 -0
  80. screenshot-6.png +0 -0
  81. screenshot-7.png +0 -0
  82. screenshot-8.png +0 -0
  83. screenshot-9.png +0 -0
  84. seo-ultimate.php +4 -5
  85. seo-ultimate.pot +412 -385
includes/jlfunctions/arr.php CHANGED
@@ -59,6 +59,13 @@ class suarr {
59
  $valuekey = sustr::preg_filter('A-Za-z0-9', $valuekey);
60
  uksort($arr, create_function('$a,$b', 'return strlen($b["'.$valuekey.'"]) - strlen($a["'.$valuekey.'"]);'));
61
  }
 
 
 
 
 
 
 
62
  }
63
 
64
  ?>
59
  $valuekey = sustr::preg_filter('A-Za-z0-9', $valuekey);
60
  uksort($arr, create_function('$a,$b', 'return strlen($b["'.$valuekey.'"]) - strlen($a["'.$valuekey.'"]);'));
61
  }
62
+
63
+ function flatten_values($arr, $value_key = 0) {
64
+ if (!is_array($arr) || !count($arr)) return array();
65
+ $newarr = array();
66
+ foreach ($arr as $key => $array_value) $newarr[$key] = $array_value[$value_key];
67
+ return $newarr;
68
+ }
69
  }
70
 
71
  ?>
includes/jlfunctions/str.php CHANGED
@@ -28,6 +28,13 @@ class sustr {
28
  return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
29
  }
30
 
 
 
 
 
 
 
 
31
  function has($str, $sub) {
32
  return (strpos($str, $sub) !== false);
33
  }
@@ -46,6 +53,13 @@ class sustr {
46
  return $str;
47
  }
48
 
 
 
 
 
 
 
 
49
  /**
50
  * Joins strings into a natural-language list.
51
  * Can be internationalized with gettext or the su_lang_implode filter.
@@ -99,6 +113,16 @@ class sustr {
99
  return $str;
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
102
  function batch_replace($search, $replace, $subjects) {
103
  $subjects = array_unique((array)$subjects);
104
  $results = array();
@@ -115,6 +139,12 @@ class sustr {
115
  return $str;
116
  }
117
 
 
 
 
 
 
 
118
  function preg_filter($filter, $str) {
119
  return preg_replace("/[^{$filter}]/", '', $str);
120
  }
28
  return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
29
  }
30
 
31
+ function endwith( $str, $end ) {
32
+ if (!sustr::endswith($str, $end))
33
+ return $str.$end;
34
+ else
35
+ return $str;
36
+ }
37
+
38
  function has($str, $sub) {
39
  return (strpos($str, $sub) !== false);
40
  }
53
  return $str;
54
  }
55
 
56
+ function truncate_at( $str, $end ) {
57
+ if ($endpos = strpos($str, $end))
58
+ return substr($str, 0, $endpos);
59
+ else
60
+ return $str;
61
+ }
62
+
63
  /**
64
  * Joins strings into a natural-language list.
65
  * Can be internationalized with gettext or the su_lang_implode filter.
113
  return $str;
114
  }
115
 
116
+ function rtrim_substr($str, $totrim) {
117
+ for ($i = strlen($totrim); $i > 0; $i--) {
118
+ $totrimsub = substr($totrim, 0, $i);
119
+ if (sustr::endswith($str, $totrimsub))
120
+ return sustr::rtrim_str($str, $totrimsub);
121
+ }
122
+
123
+ return $str;
124
+ }
125
+
126
  function batch_replace($search, $replace, $subjects) {
127
  $subjects = array_unique((array)$subjects);
128
  $results = array();
139
  return $str;
140
  }
141
 
142
+ function remove_double_words($str) {
143
+ $words = explode(' ', $str);
144
+ foreach ($words as $word) $str = str_replace("$word $word", $word, $str);
145
+ return $str;
146
+ }
147
+
148
  function preg_filter($filter, $str) {
149
  return preg_replace("/[^{$filter}]/", '', $str);
150
  }
includes/jlwp/functions.php CHANGED
@@ -115,4 +115,5 @@ class suwp {
115
  return false;
116
  }
117
  }
 
118
  ?>
115
  return false;
116
  }
117
  }
118
+
119
  ?>
includes/tabs.js CHANGED
@@ -7,7 +7,7 @@ function su_init_tabs()
7
  {
8
  /* if this is not the SEO Ultimate 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)
@@ -29,8 +29,8 @@ function su_init_tabs()
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('#su-admin-form');
36
  var action = form.attr("action").split('#', 1) + jQuery(this).attr('href');
7
  {
8
  /* if this is not the SEO Ultimate 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)
29
  default:
30
  jQuery("#su-tabset > ul").tabs();
31
  }
32
+
33
+ /* handler for opening the last tab after submit (compability version) */
34
  jQuery('#su-tabset ul a').click(function(i){
35
  var form = jQuery('#su-admin-form');
36
  var action = form.attr("action").split('#', 1) + jQuery(this).attr('href');
modules/404s/404s.php DELETED
@@ -1,117 +0,0 @@
1
- <?php
2
- /**
3
- * 404 Monitor Module
4
- *
5
- * @version 1.0.8
6
- * @since 0.4
7
- */
8
-
9
- if (class_exists('SU_Module')) {
10
-
11
- class SU_404s extends SU_Module {
12
-
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
- add_filter('su_save_hit', array(&$this, 'should_log_hit'), 10, 2);
20
- }
21
-
22
- function should_log_hit($should_log, $hit) {
23
- if ($hit['status_code'] == 404)
24
- return true;
25
- else
26
- return $should_log;
27
- }
28
-
29
- function get_module_title() { return __('404 Monitor', 'seo-ultimate'); }
30
-
31
- function has_menu_count() { return true; }
32
-
33
- function get_menu_count() {
34
- //Find out how many *new* 404s there are
35
- global $wpdb;
36
- $table = $this->plugin->get_table_name('hits');
37
- return $wpdb->query("SELECT id FROM $table WHERE is_new=1 AND status_code=404 AND redirect_url='' AND url NOT LIKE '%/favicon.ico'");
38
- }
39
-
40
- function admin_page_contents() {
41
-
42
- global $wpdb;
43
- $table = $this->plugin->get_table_name('hits');
44
-
45
- if (!$this->get_setting('log_hits', true, 'settings'))
46
-
47
- $this->queue_message('warning', sprintf(
48
- __('Please note that new 404 errors will not be recorded, since visitor logging is disabled in the %s.', 'seo-ultimate'),
49
- $this->get_admin_link('settings', __('Plugin Settings module', 'seo-ultimate'))
50
- ));
51
-
52
- //Are we deleting a 404 entry?
53
- if ($this->is_action('delete')) {
54
-
55
- if ($wpdb->query($wpdb->prepare("DELETE FROM $table WHERE id = %d LIMIT 1", intval($_GET['object']))))
56
- $this->queue_message('success', __('The log entry was successfully deleted.', 'seo-ultimate'));
57
- else
58
- $this->queue_message('error', __('This log entry has already been deleted.', 'seo-ultimate'));
59
-
60
- //The database has changed, so reload our data from it
61
- $this->hitset->query_db();
62
-
63
- //Are we clearing the whole 404 log?
64
- } elseif ($this->is_action('clear')) {
65
-
66
- if ($wpdb->query("DELETE FROM $table WHERE status_code=404")) {
67
- $this->queue_message('success', __('The log was successfully cleared.', 'seo-ultimate'));
68
-
69
- //The database has changed, so reload our data from it
70
- $this->hitset->query_db();
71
- }
72
- }
73
-
74
- if (!$this->hitset->have_hits())
75
- $this->queue_message('success', __("No 404 errors in the log.", 'seo-ultimate'));
76
-
77
- $this->print_messages();
78
-
79
- if ($this->hitset->have_hits()) {
80
-
81
- //Display the 404 table
82
- $this->hitset->admin_table(array(&$this, 'hits_table_action_links'));
83
-
84
- //Create the "Clear Log" button
85
- $clearurl = $this->get_nonce_url('clear');
86
- $confirm = __("Are you sure you want to delete all 404 log entries?", 'seo-ultimate');
87
- echo "<a href=\"$clearurl\" class=\"button-secondary\" onclick=\"javascript:return confirm('$confirm')\">";
88
- _e("Clear Log", 'seo-ultimate');
89
- echo "</a>";
90
- }
91
- }
92
-
93
- //Returns the HTML that should appear when the user hovers over a row of the 404s table
94
- function hits_table_action_links($row) {
95
- $url = $row['url'];
96
-
97
- $deleteurl = $this->get_nonce_url('delete', $row['id']);
98
- $url_encoded = urlencode($url);
99
-
100
- $anchors = array(
101
- __("Open", 'seo-ultimate')
102
- , __("Google Cache", 'seo-ultimate')
103
- , __("Delete Log Entry", 'seo-ultimate')
104
- );
105
-
106
- return <<<STR
107
-
108
- <span class="open"><a href="$url" target="_blank">{$anchors[0]}</a> | </span>
109
- <span class="cache"><a href="http://www.google.com/search?q=cache%3A$url_encoded" target="_blank">{$anchors[1]}</a> | </span>
110
- <span class="delete"><a href="$deleteurl">{$anchors[2]}</a></span>
111
-
112
- STR;
113
- }
114
- }
115
-
116
- }
117
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/404s/fofs-log.css ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #su-fofs table.widefat {
2
+ width: 100%;
3
+ }
4
+
5
+ #su-fofs table tr.su-404s-hit-data td,
6
+ #su-fofs table tr.su-404s-hit-referers td {
7
+ border-bottom: 0 none;
8
+ }
9
+
10
+ #su-fofs table tr.su-404s-hit-referers td,
11
+ #su-fofs table tr.su-404s-hit-user-agents td {
12
+ padding-top: 0;
13
+ padding-bottom: 0;
14
+ }
15
+
16
+ #su-fofs table tr.su-404s-new-hit td {
17
+ background-color: #DFFFE3;
18
+ }
19
+
20
+ #su-fofs table .actions span {
21
+ padding-right: 0.5em;
22
+ }
23
+
24
+ #su-fofs .su-404s-clear-log {
25
+ float: right;
26
+ }
modules/404s/fofs-log.php ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * 404 Monitor Log Module
4
+ *
5
+ * @since 2.1
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_FofsLog extends SU_Module {
11
+
12
+ function get_parent_module() { return 'fofs'; }
13
+ function get_child_order() { return 10; }
14
+ function is_independent_module() { return false; }
15
+
16
+ function get_module_title() { return __('404 Monitor Log', 'seo-ultimate'); }
17
+ function get_module_subtitle() { return __('Log', 'seo-ultimate'); }
18
+
19
+ function has_menu_count() { return true; }
20
+ function get_settings_key() { return '404s'; }
21
+
22
+ function get_menu_count() {
23
+ $new = 0;
24
+ $the404s = $this->get_setting('log');
25
+ if (count($the404s)) {
26
+ foreach ($the404s as $a404) {
27
+ if ($a404['is_new']) $new++;
28
+ }
29
+ }
30
+ return $new;
31
+ }
32
+
33
+ function get_default_settings() {
34
+ return array(
35
+ 'exceptions' => "*/favicon.ico\n*/apple-touch-icon.png"
36
+ , 'max_log_size' => 1000
37
+ , 'log_enabled' => $this->flush_setting('log_hits', true, 'settings')
38
+ );
39
+ }
40
+
41
+ function init() {
42
+ add_action('admin_enqueue_scripts', array(&$this, 'queue_admin_scripts'));
43
+ add_action('su_save_hit', array(&$this, 'log_hit'));
44
+ add_filter('su_settings_export_array', array(&$this, 'filter_export_array'));
45
+ }
46
+
47
+ function filter_export_array($settings) {
48
+ unset($settings[$this->get_module_key()]['log']);
49
+ return $settings;
50
+ }
51
+
52
+ //Upgrade to new wp_options-only system if needed
53
+ function upgrade() {
54
+ global $wpdb;
55
+ //Get old storage system if it exists
56
+ if ($result = @$wpdb->get_results("SELECT * FROM {$wpdb->prefix}sds_hits WHERE status_code=404 AND redirect_url='' AND url NOT LIKE '%/favicon.ico' ORDER BY id DESC", ARRAY_A)) {
57
+
58
+ //Get new storage system
59
+ $l = $this->get_setting('log', array());
60
+
61
+ //Move old to new
62
+ foreach ($result as $row) $this->log_hit($row);
63
+
64
+ //Out with the old
65
+ mysql_query("DROP TABLE IF EXISTS {$wpdb->prefix}sds_hits");
66
+ }
67
+ }
68
+
69
+ function queue_admin_scripts() {
70
+ if ($this->is_module_admin_page()) wp_enqueue_script('scriptaculous-effects');
71
+ }
72
+
73
+ function log_hit($hit) {
74
+
75
+ if ($hit['status_code'] == 404) {
76
+
77
+ $exceptions = explode("\n", $this->get_setting('exceptions', ''));
78
+ foreach ($exceptions as $exception) {
79
+ $exception = trim($exception); //Remove any \r's
80
+ $exception = str_replace('*', '.*', $exception);
81
+ $regex = "@^$exception$@i";
82
+ $regex = str_replace(array('@^.*', '.*$@i'), array('@', '@i'), $regex);
83
+ if (preg_match($regex, $hit['url'])) return;
84
+ }
85
+
86
+ $l = $this->get_setting('log', array());
87
+ while (count($l) >= $this->get_setting('max_log_size')) array_pop($l);
88
+
89
+ $u = $hit['url'];
90
+ if (!isset($l[$u])) {
91
+ $l[$u] = array();
92
+ $l[$u]['hit_count'] = 0;
93
+ $l[$u]['is_new'] = isset($hit['is_new']) ? $hit['is_new'] : true;
94
+ $l[$u]['referers'] = array();
95
+ $l[$u]['user_agents'] = array();
96
+ $l[$u]['last_hit_time'] = 0;
97
+ }
98
+
99
+ $l[$u]['hit_count']++;
100
+ if (!$l[$u]['is_new'] && $hit['is_new'])
101
+ $l[$u]['is_new'] = true;
102
+ if ($hit['time'] > $l[$u]['last_hit_time'])
103
+ $l[$u]['last_hit_time'] = $hit['time'];
104
+ if (strlen($hit['referer']))
105
+ $l[$u]['referers'][] = $hit['referer'];
106
+ if (strlen($hit['user_agent']) && !in_array($hit['user_agent'], $l[$u]['user_agents']))
107
+ $l[$u]['user_agents'][] = $hit['user_agent'];
108
+
109
+ $this->update_setting('log', $l);
110
+ }
111
+ }
112
+
113
+ function get_admin_table_columns() {
114
+ return array(
115
+ 'actions' => __('Actions', 'seo-ultimate')
116
+ , 'hit-count' => __('Hits', 'seo-ultimate')
117
+ , 'url' => __('URL with 404 Error', 'seo-ultimate')
118
+ , 'last-hit-time' => __('Date of Most Recent Hit', 'seo-ultimate')
119
+ , 'referers' => __('Referers', 'seo-ultimate')
120
+ , 'user-agents' => __('User Agents', 'seo-ultimate')
121
+ );
122
+ }
123
+
124
+ function sort_log_callback($a, $b) {
125
+ if ($a['is_new'] == $b['is_new'])
126
+ return $b['last_hit_time'] - $a['last_hit_time'];
127
+
128
+ return $a['is_new'] ? -1 : 1;
129
+ }
130
+
131
+ function admin_page_contents() {
132
+
133
+ $the404s = $this->get_setting('log');
134
+
135
+ if (!$this->get_setting('log_enabled', true))
136
+ $this->queue_message('warning', __('New 404 errors will not be recorded because 404 logging is disabled on the Settings tab.', 'seo-ultimate'));
137
+
138
+ //Are we deleting a 404 entry?
139
+ if ($this->is_action('delete')) {
140
+
141
+ if (isset($the404s[$_GET['object']])) {
142
+ unset($the404s[$_GET['object']]);
143
+ $this->queue_message('success', __('The log entry was successfully deleted.', 'seo-ultimate'));
144
+ } else
145
+ $this->queue_message('error', __('This log entry has already been deleted.', 'seo-ultimate'));
146
+
147
+ $this->update_setting('log', $the404s);
148
+
149
+ //Are we clearing the whole 404 log?
150
+ } elseif ($this->is_action('clear')) {
151
+
152
+ $the404s = array();
153
+ $this->update_setting('log', array());
154
+ $this->queue_message('success', __('The log was successfully cleared.', 'seo-ultimate'));
155
+ }
156
+
157
+ if (!count($the404s))
158
+ $this->queue_message('success', __("No 404 errors in the log.", 'seo-ultimate'));
159
+
160
+ $this->print_messages();
161
+
162
+ if (count($the404s)) {
163
+
164
+ $this->clear_log_button();
165
+
166
+ $headers = $this->get_admin_table_columns();
167
+ $this->admin_wftable_start();
168
+
169
+ uasort($the404s, array(&$this, 'sort_log_callback'));
170
+
171
+ foreach ($the404s as $url => $data) {
172
+ $new = $data['is_new'] ? ' su-404s-new-hit' : '';
173
+
174
+ $escurl = su_esc_attr($url);
175
+ $encurl = urlencode($escurl);
176
+ $md5url = md5($url);
177
+
178
+ echo "\t<tr id='su-404s-hit-$md5url-data' class='su-404s-hit-data$new'>\n";
179
+
180
+ $this->table_cells(array(
181
+ 'actions' =>
182
+ "<span class='su-404s-hit-open'><a href='$escurl' target='_blank'><img src='{$this->module_dir_url}hit-open.png' title='".__('Open URL in new window (will not be logged)', 'seo-ultimate')."' /></a></span>"
183
+ . "<span class='su-404s-hit-cache'><a href='http://www.google.com/search?q=cache%3A$encurl' target='_blank'><img src='{$this->module_dir_url}hit-cache.png' title='".__('Query Google for cached version of URL (opens in new window)', 'seo-ultimate')."' /></a></span>"
184
+ . "<span class='su-404s-hit-delete'><a href='".$this->get_nonce_url('delete', $url)."'><img src='{$this->module_dir_url}hit-delete.png' title='".__('Remove this URL from the log', 'seo-ultimate')."' /></a></span>"
185
+ , 'hit-count' => $data['hit_count']
186
+ , 'url' => $url
187
+ , 'last-hit-time' => sprintf(__('%s at %s', 'seo-ultimate')
188
+ , date_i18n(get_option('date_format'), $data['last_hit_time'])
189
+ , date_i18n(get_option('time_format'), $data['last_hit_time'])
190
+ )
191
+ , 'referers' => number_format_i18n(count($data['referers'])) . (count($data['referers']) ? " <a href='#' onclick=\"su_toggle_blind('su-404s-hit-$md5url-referers')\";'><img src='{$this->module_dir_url}hit-details.png' title='".__('View list of referring URLs', 'seo-ultimate')."' /></a>" : '')
192
+ , 'user-agents' => number_format_i18n(count($data['user_agents'])) . (count($data['user_agents']) ? " <a href='#' onclick=\"su_toggle_blind('su-404s-hit-$md5url-user-agents')\";'><img src='{$this->module_dir_url}hit-details.png' title='".__('View list of user agents', 'seo-ultimate')."' /></a>" : '')
193
+ ));
194
+
195
+ echo "\t</tr>\n";
196
+
197
+ echo "\t<tr class='su-404s-hit-referers$new'>\n\t\t<td colspan='".count($headers)."'>";
198
+
199
+ if (count($data['referers'])) {
200
+
201
+ echo "<div id='su-404s-hit-$md5url-referers' style='display: none;'>\n";
202
+ echo "\t\t\t<div><strong>".__('Referring URLs', 'seo-ultimate')."</strong> &mdash; ";
203
+ echo "<a href='#' onclick=\"Effect.BlindUp('su-404s-hit-$md5url-referers')\"; return false;'>".__('Hide list', 'seo-ultimate')."</a>";
204
+ echo "</div>\n";
205
+ echo "\t\t\t<ul>\n";
206
+
207
+ foreach ($data['referers'] as $referer) {
208
+ $referer = su_esc_attr($referer); //Don't let attacks pass through the referer URLs!
209
+ echo "\t\t\t\t<li><a href='$referer' target='_blank'>$referer</a></li>\n";
210
+ }
211
+
212
+ echo "\t\t\t</ul>\n";
213
+
214
+ echo "\t\t</div>";
215
+ }
216
+
217
+ echo "</td>\n\t</tr>\n";
218
+
219
+ echo "\t<tr class='su-404s-hit-user-agents$new'>\n\t\t<td colspan='".count($headers)."'>";
220
+
221
+ if (count($data['user_agents'])) {
222
+ echo "<div id='su-404s-hit-$md5url-user-agents' style='display: none;'>\n";
223
+ echo "\t\t\t<div><strong>".__('User Agents', 'seo-ultimate')."</strong> &mdash; ";
224
+ echo "<a href='#' onclick=\"Effect.BlindUp('su-404s-hit-$md5url-user-agents')\"; return false;'>".__('Hide list', 'seo-ultimate')."</a>";
225
+ echo "</div>\n";
226
+ echo "\t\t\t<ul>\n";
227
+
228
+ foreach ($data['user_agents'] as $useragent) {
229
+ $useragent = su_esc_html($useragent); //Don't let attacks pass through the user agent strings!
230
+ echo "\t\t\t\t<li>$useragent</li>\n";
231
+ }
232
+
233
+ echo "\t\t\t</ul>\n";
234
+
235
+ echo "</td>\n\t</tr>\n";
236
+ }
237
+
238
+ echo "\t\t</div>";
239
+
240
+ $the404s[$url]['is_new'] = false;
241
+ }
242
+
243
+ $this->update_setting('log', $the404s);
244
+
245
+ $this->admin_wftable_end();
246
+
247
+ $this->clear_log_button();
248
+ }
249
+ }
250
+
251
+ function clear_log_button() {
252
+ //Create the "Clear Log" button
253
+ $clearurl = $this->get_nonce_url('clear');
254
+ $confirm = __("Are you sure you want to delete all 404 log entries?", 'seo-ultimate');
255
+ echo "<div class='su-404s-clear-log'><a href=\"$clearurl\" class=\"button-secondary\" onclick=\"javascript:return confirm('$confirm')\">";
256
+ _e("Clear Log", 'seo-ultimate');
257
+ echo "</a></div>";
258
+ }
259
+ }
260
+
261
+ }
262
+ ?>
modules/404s/fofs-settings.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * 404 Monitor Settings Module
4
+ *
5
+ * @since 2.1
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_FofsSettings extends SU_Module {
11
+
12
+ function get_parent_module() { return 'fofs'; }
13
+ function get_child_order() { return 20; }
14
+ function is_independent_module() { return false; }
15
+
16
+ function get_module_title() { return __('404 Monitor Settings', 'seo-ultimate'); }
17
+ function get_module_subtitle() { return __('Settings', 'seo-ultimate'); }
18
+ function get_settings_key() { return '404s'; }
19
+
20
+ function admin_page_contents() {
21
+ $this->admin_form_start();
22
+ $this->checkbox('log_enabled', __("Continue monitoring for new 404 errors", 'seo-ultimate'));
23
+ $this->admin_form_end();
24
+ }
25
+ }
26
+
27
+ }
28
+ ?>
modules/404s/fofs.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * 404 Monitor Module
4
+ *
5
+ * @since 0.4
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_Fofs extends SU_Module {
11
+ function get_module_title() { return __('404 Monitor', 'seo-ultimate'); }
12
+ function has_menu_count() { return true; }
13
+ function admin_page_contents() { $this->children_admin_page_tabs(); }
14
+ }
15
+
16
+ }
17
+ ?>
modules/404s/hit-cache.png ADDED
Binary file
modules/404s/hit-delete.png ADDED
Binary file
modules/404s/hit-details.png ADDED
Binary file
modules/404s/hit-open.png ADDED
Binary file
modules/404s/hit-redirect.png ADDED
Binary file
modules/404s/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/autolinks/autolinks.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ #su-autolinks table.widefat,
2
+ #su-autolinks table.widefat input {
3
+ width: 100%;
4
+ }
modules/autolinks/autolinks.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Deeplink Juggernaut Module
4
  *
5
- * @version 0.1
6
  * @since 1.8
7
  */
8
 
@@ -76,19 +75,9 @@ class SU_Autolinks extends SU_Module {
76
  }
77
 
78
  $this->admin_wftable_end();
79
- $this->admin_form_end(false, false);
80
  }
81
  }
82
 
83
- } elseif ($_GET['css'] == 'admin') {
84
- header('Content-type: text/css');
85
- ?>
86
-
87
- #su-autolinks table.widefat,
88
- #su-autolinks table.widefat input {
89
- width: 100%;
90
- }
91
-
92
- <?php
93
  }
94
  ?>
2
  /**
3
  * Deeplink Juggernaut Module
4
  *
 
5
  * @since 1.8
6
  */
7
 
75
  }
76
 
77
  $this->admin_wftable_end();
78
+ $this->admin_form_end(null, false);
79
  }
80
  }
81
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
  ?>
modules/autolinks/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/canonical/canonical.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Canonicalizer Module
4
  *
5
- * @version 1.1.2
6
  * @since 0.3
7
  */
8
 
2
  /**
3
  * Canonicalizer Module
4
  *
 
5
  * @since 0.3
6
  */
7
 
modules/canonical/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/class.su-importmodule.php CHANGED
@@ -3,7 +3,6 @@
3
  * Import Module
4
  *
5
  * @abstract
6
- * @version 1.0
7
  * @since 1.5
8
  */
9
 
@@ -33,8 +32,8 @@ class SU_ImportModule extends SU_Module {
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
  $this->print_message('warning', sprintf(__('The import cannot be undone. It is your responsibility to <a href="%s" target="_blank">backup your database</a> before proceeding!', 'seo-ultimate'), suwp::get_backup_url()));
@@ -66,10 +65,8 @@ class SU_ImportModule extends SU_Module {
66
  }
67
 
68
  function import_status($type, $message) {
69
- //echo "<tr><td class='image'><img src='{$this->import_status_image}' alt='' /></td><td class='message'>$message</td></tr>";
70
- $type = su_esc_attr($type);
71
  if (strcmp($type, 'error') == 0) $this->error = true;
72
- echo "<div class='su-status su-$type'>$message</div>";
73
  }
74
 
75
  function import_option($module, $key, $option) {
3
  * Import Module
4
  *
5
  * @abstract
 
6
  * @since 1.5
7
  */
8
 
32
  $this->admin_page_end();
33
  }
34
 
35
+ function admin_form_end($button = null, $table = true) {
36
+ if ($button === null) $button = __("Import Now", 'seo-ultimate');
37
  parent::admin_form_end($button, $table);
38
 
39
  $this->print_message('warning', sprintf(__('The import cannot be undone. It is your responsibility to <a href="%s" target="_blank">backup your database</a> before proceeding!', 'seo-ultimate'), suwp::get_backup_url()));
65
  }
66
 
67
  function import_status($type, $message) {
 
 
68
  if (strcmp($type, 'error') == 0) $this->error = true;
69
+ $this->print_mini_message($type, $message);
70
  }
71
 
72
  function import_option($module, $key, $option) {
modules/class.su-module.php CHANGED
@@ -40,13 +40,29 @@ class SU_Module {
40
  var $module_url;
41
 
42
  /**
43
- * Stores the URL to the directory containing the module file's URL. Has trailing slash.
44
  *
45
  * @since 1.5
46
  * @var string
47
  */
48
  var $module_dir_url;
49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  /**
51
  * Stores the module's plugin page hook (the full hook with seo_page_ prefix).
52
  * A reconstructed value of the get_plugin_page_hook() function, which is only available after admin init.
@@ -159,7 +175,13 @@ class SU_Module {
159
  *
160
  * @return int The number that should be displayed.
161
  */
162
- function get_menu_count() { return 0; }
 
 
 
 
 
 
163
 
164
  /**
165
  * Whether or not the module will ever return a non-zero menu count.
@@ -275,6 +297,13 @@ class SU_Module {
275
  */
276
  function activate() { }
277
 
 
 
 
 
 
 
 
278
  /**
279
  * Returns an array of default settings. The defaults will be saved in the database if the settings don't exist.
280
  *
@@ -293,6 +322,17 @@ class SU_Module {
293
  $this->children_admin_page_tabs_form();
294
  }
295
 
 
 
 
 
 
 
 
 
 
 
 
296
  /**
297
  * Returns an array of custom contextual help dropdowns; internationalized titles are the array keys and contents are the array values.
298
  *
@@ -309,20 +349,22 @@ class SU_Module {
309
  $paths = array($this->plugin->get_translated_readme_path(), $this->plugin->get_readme_path());
310
 
311
  foreach ($paths as $path) {
312
- $readme = file_get_contents($path);
313
- $sections = sumd::get_sections(sumd::get_section($readme, $this->get_module_title()));
314
- if (count($sections)) {
315
-
316
- if (sustr::has($path, '/translations/') && preg_match("|\nStable tag: ([a-zA-Z0-9. ]+)|i", $readme, $matches)) {
317
- $version = $matches[1];
318
- if (version_compare($version, SU_VERSION, '<'))
319
- $sections = suarr::aprintf(false, '%s<p><em>'
320
- . __('(Note: This translated documentation was designed for an older version of SEO Ultimate and may be outdated.)', 'seo-ultimate')
321
- . '</em></p>'
322
- , $sections);
 
 
 
 
323
  }
324
-
325
- return $sections;
326
  }
327
  }
328
 
@@ -376,6 +418,17 @@ class SU_Module {
376
  die(str_rot13('Zbqhyr ybnqrq sebz na rkgreany fbhepr!'));
377
  }
378
 
 
 
 
 
 
 
 
 
 
 
 
379
  /**
380
  * Returns the absolute URL of the module's admin page.
381
  *
@@ -433,7 +486,7 @@ class SU_Module {
433
  function is_module_admin_page() {
434
  if (is_admin()) {
435
  global $plugin_page;
436
- if (strcmp($plugin_page, $this->plugin->key_to_hook($this->get_module_key())) == 0) return true;
437
  }
438
 
439
  return false;
@@ -496,9 +549,14 @@ class SU_Module {
496
  foreach ($this->modules as $key => $x_module) {
497
  $module =& $this->modules[$key];
498
  $child_tabs = $module->get_admin_page_tabs();
 
499
  if (empty($child_tabs))
500
  $child_tabs[$module->get_module_subtitle()] = array(&$module, 'admin_page_contents');
501
- $tabs = array_merge($tabs, $child_tabs);
 
 
 
 
502
  }
503
 
504
  return $tabs;
@@ -524,7 +582,7 @@ class SU_Module {
524
  if (count($tabs = $this->get_children_admin_page_tabs())) {
525
  $this->admin_form_start(false, false);
526
  $this->admin_page_tabs($tabs);
527
- $this->admin_form_end(false, false);
528
  }
529
  }
530
 
@@ -645,6 +703,37 @@ class SU_Module {
645
  $this->update_setting($key, 0);
646
  }
647
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
648
  /**
649
  * Updates the value of more than one setting at a time.
650
  *
@@ -684,9 +773,11 @@ class SU_Module {
684
  * @uses admin_page_end()
685
  */
686
  function admin_page() {
687
- $this->admin_page_start();
688
- $this->admin_page_contents();
689
- $this->admin_page_end();
 
 
690
  }
691
 
692
  /**
@@ -723,14 +814,14 @@ class SU_Module {
723
  }
724
 
725
  /**
726
- * Outputs an administration page subheader (an <h3> tag).
727
  *
728
  * @since 0.1
729
  *
730
  * @param string $title The text to output.
731
  */
732
  function admin_subheader($title) {
733
- echo "<h3 class='su-subheader'>$title</h3>\n";
734
  }
735
 
736
  /**
@@ -774,7 +865,7 @@ class SU_Module {
774
 
775
  if ($c > 1) {
776
  $id = preg_replace('/[^a-z0-9]/', '', strtolower($title));
777
- echo "<fieldset id='$id'>\n<h3>$title</h3>\n";
778
  }
779
 
780
  if ($table) echo "<table class='form-table'>\n";
@@ -801,7 +892,7 @@ class SU_Module {
801
  if ($table) echo "</table>";
802
 
803
  if ($c > 1)
804
- echo "</fieldset>\n";
805
  }
806
 
807
  if ($c > 1) {
@@ -836,7 +927,7 @@ class SU_Module {
836
  * Adds the module's custom screen meta, if present.
837
  *
838
  * @since 0.9
839
- * @uses admin_dropdowns()
840
  */
841
  function screen_meta_filter($screen_meta) {
842
 
@@ -849,7 +940,7 @@ class SU_Module {
849
  $content = "<div class='su-help'>\n";
850
 
851
  $header = sprintf(_c('%s %s|Dropdown Title', 'seo-ultimate'), $this->get_module_title(), $label);
852
- $header = sustr::unique_words($header);
853
 
854
  $text = wptexturize(Markdown($text));
855
  $text = str_replace('<a ', '<a target="_blank" ', $text);
@@ -905,11 +996,11 @@ class SU_Module {
905
  * @param mixed $header The text of the subheader that should go right before the form. Optional.
906
  * @param boolean $table Whether or not to start a form table.
907
  */
908
- function admin_form_start($header = false, $table = true) {
909
- $hook = $this->plugin->key_to_hook($this->get_module_key());
910
  if ($header) $this->admin_subheader($header);
911
 
912
- if (!$this->get_parent_module()) {
913
  if ($this->is_action('update')) $this->print_message('success', __('Settings updated.', 'seo-ultimate'));
914
  echo "<form id='su-admin-form' method='post' action='?page=$hook'>\n";
915
  settings_fields($hook);
@@ -929,11 +1020,11 @@ class SU_Module {
929
  * @param string|false $button The label of the submit button.
930
  * @param boolean $table Whether or not a form table should be ended.
931
  */
932
- function admin_form_end($button = false, $table = true) {
933
- if (!$button) $button = __('Save Changes'); //This string is used in normal WP, so we don't need a textdomain
934
  if ($table) echo "</table>\n";
935
 
936
- if (!$this->get_parent_module()) {
937
  ?>
938
  <p class="submit">
939
  <input type="submit" class="button-primary" value="<?php echo $button ?>" />
@@ -968,24 +1059,69 @@ class SU_Module {
968
  *
969
  * @param $headers Array of (CSS class => Internationalized column title)
970
  */
971
- function admin_wftable_start($headers) {
972
- echo <<<STR
973
- <table class="widefat" cellspacing="0">
974
- <thead><tr>
975
-
976
- STR;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
977
  foreach ($headers as $class => $header) {
978
- $class = is_numeric($class) ? '' : " class='$class'";
979
  echo "\t\t<th scope='col'$class>$header</th>\n";
980
  }
 
 
 
 
 
 
 
 
 
 
 
981
 
982
- echo <<<STR
983
- </tr></thead>
984
- <tbody>
985
-
986
- STR;
 
 
 
 
 
 
 
 
 
 
987
  }
988
 
 
 
 
 
 
989
  function admin_wftable_end() {
990
  echo "\t</tbody>\n</table>\n";
991
  }
@@ -1154,14 +1290,22 @@ STR;
1154
  register_setting($this->get_module_key(), $name);
1155
  $name = su_esc_attr($name);
1156
 
 
1157
  foreach ($values as $value => $desc) {
1158
 
1159
  $value = su_esc_attr($value);
1160
  $id = "{$name}_{$value}";
1161
 
1162
- echo "<label for='$id'><input name='$name' id='$id' type='radio' value='$value'";
1163
- if (strcmp($this->get_setting($name), $value) == 0) echo " checked='checked'";
1164
- echo " /> $desc</label><br />\n";
 
 
 
 
 
 
 
1165
  }
1166
  }
1167
 
@@ -1310,7 +1454,7 @@ STR;
1310
  return (
1311
  (
1312
  ( strcasecmp($_GET['page'], $this->plugin->key_to_hook($this->get_module_key())) == 0 ) //Is $this module being shown?
1313
- || ( strlen($this->get_parent_module()) && strcasecmp($_GET['page'], $this->plugin->key_to_hook($this->get_parent_module())) == 0)
1314
  )
1315
  && ($_GET['action'] == $action || $_POST['action'] == $action) //Is this $action being executed?
1316
  && $this->nonce_validates($action, $object) //Is the nonce valid?
@@ -1375,7 +1519,7 @@ STR;
1375
  $action = urlencode($action);
1376
  if ($object) $objectqs = '&object='.urlencode($object); else $objectqs = '';
1377
 
1378
- $hook = $this->plugin->key_to_hook($this->get_module_key());
1379
 
1380
  //We don't need to escape ampersands since wp_nonce_url will do that for us
1381
  return wp_nonce_url("?page=$hook&action=$action$objectqs",
@@ -1431,6 +1575,16 @@ STR;
1431
  $this->messages = array();
1432
  }
1433
 
 
 
 
 
 
 
 
 
 
 
1434
  /********** ADMIN POST META BOX FUNCTIONS **********/
1435
 
1436
  /**
@@ -1492,12 +1646,12 @@ STR;
1492
  $title = str_replace(' ', '&nbsp;', $title);
1493
 
1494
  $html .= "<tr class='textbox'>\n<th scope='row'><label for='$id'>$title</label></th>\n"
1495
- ."<td><input name='$id' id='$id' type='text' value='$value' class='regular-text' /></td>\n</tr>\n";
1496
  }
1497
 
1498
  return $html;
1499
  }
1500
-
1501
  /**
1502
  * Generates the HTML for a single post meta textbox.
1503
  *
@@ -1533,7 +1687,7 @@ STR;
1533
  $checked = ($this->get_postmeta($name) == 1);
1534
  $name = "_su_".su_esc_attr($name);
1535
 
1536
- $html .= "<label for='$name'><input name='$name' id='$name' type='checkbox' value='1'";
1537
  if ($checked) $html .= " checked='checked'";
1538
  $html .= " /> $desc</label><br />\n";
1539
  }
40
  var $module_url;
41
 
42
  /**
43
+ * Stores the URL to the directory containing the module file. Has trailing slash.
44
  *
45
  * @since 1.5
46
  * @var string
47
  */
48
  var $module_dir_url;
49
 
50
+ /**
51
+ * Stores the module file's URL relative to the plugin directory.
52
+ *
53
+ * @since 2.1
54
+ * @var string
55
+ */
56
+ var $module_rel_url;
57
+
58
+ /**
59
+ * Stores the URL to the directory containing the module file, relative to the plugin directory. Has trailing slash.
60
+ *
61
+ * @since 2.1
62
+ * @var string
63
+ */
64
+ var $module_dir_rel_url;
65
+
66
  /**
67
  * Stores the module's plugin page hook (the full hook with seo_page_ prefix).
68
  * A reconstructed value of the get_plugin_page_hook() function, which is only available after admin init.
175
  *
176
  * @return int The number that should be displayed.
177
  */
178
+ function get_menu_count() {
179
+ $count = 0;
180
+ foreach ($this->modules as $key => $module) {
181
+ $count += $this->modules[$key]->get_menu_count();
182
+ }
183
+ return $count;
184
+ }
185
 
186
  /**
187
  * Whether or not the module will ever return a non-zero menu count.
297
  */
298
  function activate() { }
299
 
300
+ /**
301
+ * Called when SEO Ultimate has just been upgraded to a new version.
302
+ *
303
+ * @since 2.1
304
+ */
305
+ function upgrade() { }
306
+
307
  /**
308
  * Returns an array of default settings. The defaults will be saved in the database if the settings don't exist.
309
  *
322
  $this->children_admin_page_tabs_form();
323
  }
324
 
325
+ /**
326
+ * Returns a list of possible admin table columns that should be registered in "Screen Options"
327
+ *
328
+ * @since 2.1
329
+ *
330
+ * @return array
331
+ */
332
+ function get_admin_table_columns() {
333
+ return array();
334
+ }
335
+
336
  /**
337
  * Returns an array of custom contextual help dropdowns; internationalized titles are the array keys and contents are the array values.
338
  *
349
  $paths = array($this->plugin->get_translated_readme_path(), $this->plugin->get_readme_path());
350
 
351
  foreach ($paths as $path) {
352
+ if (is_readable($path)) {
353
+ $readme = file_get_contents($path);
354
+ $sections = sumd::get_sections(sumd::get_section($readme, $this->get_module_title()));
355
+ if (count($sections)) {
356
+
357
+ if (sustr::has($path, '/translations/') && preg_match("|\nStable tag: ([a-zA-Z0-9. ]+)|i", $readme, $matches)) {
358
+ $version = $matches[1];
359
+ if (version_compare($version, SU_VERSION, '<'))
360
+ $sections = suarr::aprintf(false, '%s<p><em>'
361
+ . __('(Note: This translated documentation was designed for an older version of SEO Ultimate and may be outdated.)', 'seo-ultimate')
362
+ . '</em></p>'
363
+ , $sections);
364
+ }
365
+
366
+ return $sections;
367
  }
 
 
368
  }
369
  }
370
 
418
  die(str_rot13('Zbqhyr ybnqrq sebz na rkgreany fbhepr!'));
419
  }
420
 
421
+ /**
422
+ * Returns the key of the parent module if there is one; if not, the key of the current module.
423
+ *
424
+ * @since 2.1
425
+ *
426
+ * @return string
427
+ */
428
+ function get_module_or_parent_key() {
429
+ return strlen($p = $this->get_parent_module()) ? $p : $this->get_module_key();
430
+ }
431
+
432
  /**
433
  * Returns the absolute URL of the module's admin page.
434
  *
486
  function is_module_admin_page() {
487
  if (is_admin()) {
488
  global $plugin_page;
489
+ if (strcmp($plugin_page, $this->plugin->key_to_hook($this->get_module_or_parent_key())) == 0) return true;
490
  }
491
 
492
  return false;
549
  foreach ($this->modules as $key => $x_module) {
550
  $module =& $this->modules[$key];
551
  $child_tabs = $module->get_admin_page_tabs();
552
+
553
  if (empty($child_tabs))
554
  $child_tabs[$module->get_module_subtitle()] = array(&$module, 'admin_page_contents');
555
+
556
+ foreach ($child_tabs as $title => $function) {
557
+ if (!is_array($function)) $function = array(&$module, $function);
558
+ $tabs[$title] = $function;
559
+ }
560
  }
561
 
562
  return $tabs;
582
  if (count($tabs = $this->get_children_admin_page_tabs())) {
583
  $this->admin_form_start(false, false);
584
  $this->admin_page_tabs($tabs);
585
+ $this->admin_form_end(null, false);
586
  }
587
  }
588
 
703
  $this->update_setting($key, 0);
704
  }
705
 
706
+ /**
707
+ * Gets a setting's value, deletes the setting, and returns the value.
708
+ *
709
+ * @since 2.1
710
+ * @uses get_settings_key()
711
+ *
712
+ * @param string $key The name of the setting to retrieve/delete.
713
+ * @param mixed $default What should be returned if the setting does not exist. Optional.
714
+ * @param string|null $module The module to which the setting belongs. Defaults to the current module's settings key. Optional.
715
+ * @return mixed The value of the setting, or the $default variable.
716
+ */
717
+ function flush_setting($key, $default=null, $module=null) {
718
+ $setting = $this->get_setting($key, $default, $module); //We need to retrieve the setting before deleting it
719
+ $this->delete_setting($key, $module);
720
+ return $setting;
721
+ }
722
+
723
+ /**
724
+ * Deletes a module setting.
725
+ *
726
+ * @since 2.1
727
+ * @uses get_settings_key()
728
+ *
729
+ * @param string $key The name of the setting to delete.
730
+ * @param string|null $module The module to which the setting belongs. Defaults to the current module's settings key. Optional.
731
+ */
732
+ function delete_setting($key, $module=null) {
733
+ if (!$module) $module = $this->get_settings_key();
734
+ unset($this->plugin->dbdata['settings'][$module][$key]);
735
+ }
736
+
737
  /**
738
  * Updates the value of more than one setting at a time.
739
  *
773
  * @uses admin_page_end()
774
  */
775
  function admin_page() {
776
+ if (!apply_filters('su_custom_admin_page-'.$this->get_module_key(), false)) {
777
+ $this->admin_page_start();
778
+ $this->admin_page_contents();
779
+ $this->admin_page_end();
780
+ }
781
  }
782
 
783
  /**
814
  }
815
 
816
  /**
817
+ * Outputs an administration page subheader (an <h4> tag).
818
  *
819
  * @since 0.1
820
  *
821
  * @param string $title The text to output.
822
  */
823
  function admin_subheader($title) {
824
+ echo "<h4 class='su-subheader'>$title</h4>\n";
825
  }
826
 
827
  /**
865
 
866
  if ($c > 1) {
867
  $id = preg_replace('/[^a-z0-9]/', '', strtolower($title));
868
+ echo "<fieldset id='su-$id'>\n<h3>$title</h3>\n<div class='su-tab-contents'>\n";
869
  }
870
 
871
  if ($table) echo "<table class='form-table'>\n";
892
  if ($table) echo "</table>";
893
 
894
  if ($c > 1)
895
+ echo "</div>\n</fieldset>\n";
896
  }
897
 
898
  if ($c > 1) {
927
  * Adds the module's custom screen meta, if present.
928
  *
929
  * @since 0.9
930
+ * @uses get_admin_dropdowns()
931
  */
932
  function screen_meta_filter($screen_meta) {
933
 
940
  $content = "<div class='su-help'>\n";
941
 
942
  $header = sprintf(_c('%s %s|Dropdown Title', 'seo-ultimate'), $this->get_module_title(), $label);
943
+ $header = sustr::remove_double_words($header);
944
 
945
  $text = wptexturize(Markdown($text));
946
  $text = str_replace('<a ', '<a target="_blank" ', $text);
996
  * @param mixed $header The text of the subheader that should go right before the form. Optional.
997
  * @param boolean $table Whether or not to start a form table.
998
  */
999
+ function admin_form_start($header = false, $table = true, $form = true) {
1000
+ $hook = $this->plugin->key_to_hook($this->get_module_or_parent_key());
1001
  if ($header) $this->admin_subheader($header);
1002
 
1003
+ if ($form) {
1004
  if ($this->is_action('update')) $this->print_message('success', __('Settings updated.', 'seo-ultimate'));
1005
  echo "<form id='su-admin-form' method='post' action='?page=$hook'>\n";
1006
  settings_fields($hook);
1020
  * @param string|false $button The label of the submit button.
1021
  * @param boolean $table Whether or not a form table should be ended.
1022
  */
1023
+ function admin_form_end($button = null, $table = true) {
1024
+ if ($button === null) $button = __('Save Changes'); //This string is used in normal WP, so we don't need a textdomain
1025
  if ($table) echo "</table>\n";
1026
 
1027
+ if ($button !== false) {
1028
  ?>
1029
  <p class="submit">
1030
  <input type="submit" class="button-primary" value="<?php echo $button ?>" />
1059
  *
1060
  * @param $headers Array of (CSS class => Internationalized column title)
1061
  */
1062
+ function admin_wftable_start($headers = false) {
1063
+ echo "\n<table class='widefat' cellspacing='0'>\n";
1064
+ if ($headers)
1065
+ $this->table_column_headers($headers);
1066
+ else {
1067
+ echo "\t<thead><tr>\n";
1068
+ print_column_headers($this->plugin_page_hook);
1069
+ echo "\t</tr></thead>\n";
1070
+ echo "\t<tfoot><tr>\n";
1071
+ print_column_headers($this->plugin_page_hook);
1072
+ echo "\t</tr></tfoot>\n";
1073
+ }
1074
+ echo "\t<tbody>\n";
1075
+ }
1076
+
1077
+ /**
1078
+ * Outputs a <tr> of <th scope="col"></th> tags based on an array of column headers.
1079
+ *
1080
+ * @since 2.1
1081
+ *
1082
+ * @param $headers Array of (CSS class => Internationalized column title)
1083
+ */
1084
+ function table_column_headers($headers) {
1085
+ echo "\t<thead><tr>\n";
1086
+ $mk = $this->get_module_key();
1087
  foreach ($headers as $class => $header) {
1088
+ $class = is_numeric($class) ? '' : " class='su-$mk-$class'";
1089
  echo "\t\t<th scope='col'$class>$header</th>\n";
1090
  }
1091
+ echo "\t</tr></thead>\n";
1092
+ }
1093
+
1094
+ /**
1095
+ * Outputs <td> tags based on an array of cell data.
1096
+ *
1097
+ * @since 2.1
1098
+ *
1099
+ * @param $headers Array of (CSS class => Cell data)
1100
+ */
1101
+ function table_cells($cells) {
1102
 
1103
+ if (count($this->get_admin_table_columns())) {
1104
+ $columns = get_column_headers($this->plugin_page_hook);
1105
+ $hidden = get_hidden_columns($this->plugin_page_hook);
1106
+ foreach ( $columns as $column_name => $column_display_name ) {
1107
+ $class = "class=\"$column_name column-$column_name\"";
1108
+ $style = in_array($column_name, $hidden) ? ' style="display:none;"' : '';
1109
+ echo "\t\t<td $class$style>".$cells[$column_name]."</td>\n";
1110
+ }
1111
+ } elseif (is_array($cells) && count($cells)) {
1112
+ $mk = $this->get_module_key();
1113
+ foreach ($cells as $class => $content) {
1114
+ $class = is_numeric($class) ? '' : " class='su-$mk-$class'";
1115
+ echo "\t\t<td$class>$content</td>\n";
1116
+ }
1117
+ }
1118
  }
1119
 
1120
+ /**
1121
+ * Ends a "widefat" WordPress table.
1122
+ *
1123
+ * @since 1.8
1124
+ */
1125
  function admin_wftable_end() {
1126
  echo "\t</tbody>\n</table>\n";
1127
  }
1290
  register_setting($this->get_module_key(), $name);
1291
  $name = su_esc_attr($name);
1292
 
1293
+ $first = true;
1294
  foreach ($values as $value => $desc) {
1295
 
1296
  $value = su_esc_attr($value);
1297
  $id = "{$name}_{$value}";
1298
 
1299
+ $current = (strcmp($this->get_setting($name), $value) == 0);
1300
+ $class = $first ? 'first' : ''; $first = false;
1301
+ if ($current) $class .= ' current-setting';
1302
+ $class = trim($class);
1303
+ if ($class) $class = " class='$class'";
1304
+ echo "<label for='$id'$class><input name='$name' id='$id' type='radio' value='$value'";
1305
+ if ($current) echo " checked='checked'";
1306
+ echo " /> $desc";
1307
+ if (!sustr::has($desc, '</label>')) echo '</label><br />';
1308
+ echo "\n";
1309
  }
1310
  }
1311
 
1454
  return (
1455
  (
1456
  ( strcasecmp($_GET['page'], $this->plugin->key_to_hook($this->get_module_key())) == 0 ) //Is $this module being shown?
1457
+ || ( strlen($this->get_parent_module()) && strcasecmp($_GET['page'], $this->plugin->key_to_hook($this->get_parent_module())) == 0) //Is the parent module being shown?
1458
  )
1459
  && ($_GET['action'] == $action || $_POST['action'] == $action) //Is this $action being executed?
1460
  && $this->nonce_validates($action, $object) //Is the nonce valid?
1519
  $action = urlencode($action);
1520
  if ($object) $objectqs = '&object='.urlencode($object); else $objectqs = '';
1521
 
1522
+ $hook = $this->plugin->key_to_hook($this->get_module_or_parent_key());
1523
 
1524
  //We don't need to escape ampersands since wp_nonce_url will do that for us
1525
  return wp_nonce_url("?page=$hook&action=$action$objectqs",
1575
  $this->messages = array();
1576
  }
1577
 
1578
+ /**
1579
+ * Prints a mini-style message.
1580
+ *
1581
+ * @since 2.1
1582
+ */
1583
+ function print_mini_message($type, $message) {
1584
+ $type = su_esc_attr($type);
1585
+ echo "<div class='su-status su-$type'>$message</div>";
1586
+ }
1587
+
1588
  /********** ADMIN POST META BOX FUNCTIONS **********/
1589
 
1590
  /**
1646
  $title = str_replace(' ', '&nbsp;', $title);
1647
 
1648
  $html .= "<tr class='textbox'>\n<th scope='row'><label for='$id'>$title</label></th>\n"
1649
+ ."<td><input name='$id' id='$id' type='text' value='$value' class='regular-text' tabindex='2' /></td>\n</tr>\n";
1650
  }
1651
 
1652
  return $html;
1653
  }
1654
+
1655
  /**
1656
  * Generates the HTML for a single post meta textbox.
1657
  *
1687
  $checked = ($this->get_postmeta($name) == 1);
1688
  $name = "_su_".su_esc_attr($name);
1689
 
1690
+ $html .= "<label for='$name'><input name='$name' id='$name' type='checkbox' tabindex='2' value='1'";
1691
  if ($checked) $html .= " checked='checked'";
1692
  $html .= " /> $desc</label><br />\n";
1693
  }
modules/competition-queries/competition-queries.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ function su_competition_queries_show_step2(type, showminimal) {
2
+ document.getElementById('methodtype').innerHTML=type;
3
+
4
+ if (showminimal)
5
+ document.getElementById('minimal-checkbox').style.visibility='visible';
6
+ else
7
+ document.getElementById('minimal-checkbox').style.visibility='hidden';
8
+ }
modules/competition-queries/competition-queries.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Competition Researcher Module
4
  *
5
- * @version 1.0.2
6
  * @since 1.2
7
  */
8
 
@@ -77,19 +76,5 @@ class SU_CompetitionQueries extends SU_Module {
77
  }
78
  }
79
 
80
- } elseif (strcmp($_GET['js'], 'admin') == 0) {
81
- header('Content-type: text/javascript');
82
- ?>
83
-
84
- function su_competition_queries_show_step2(type, showminimal) {
85
- document.getElementById('methodtype').innerHTML=type;
86
-
87
- if (showminimal)
88
- document.getElementById('minimal-checkbox').style.visibility='visible';
89
- else
90
- document.getElementById('minimal-checkbox').style.visibility='hidden';
91
- }
92
-
93
- <?php
94
  }
95
  ?>
2
  /**
3
  * Competition Researcher Module
4
  *
 
5
  * @since 1.2
6
  */
7
 
76
  }
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  }
80
  ?>
modules/competition-queries/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/files/files.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * File Editor Module
4
  *
5
- * @version 1.0.3
6
  * @since 0.8
7
  */
8
 
@@ -134,37 +133,6 @@ class SU_Files extends SU_Module {
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
 
170
  }
2
  /**
3
  * File Editor Module
4
  *
 
5
  * @since 0.8
6
  */
7
 
133
  ));
134
  }
135
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  }
137
 
138
  }
modules/files/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/import-aiosp/import-aiosp.css ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #su-import-aiosp tr.su-admin-form-checkbox td,
2
+ #su-import-aiosp tr.su-admin-form-textblock td {
3
+ border-top: 3px solid #ccc;
4
+ padding-top: 1em;
5
+ }
6
+
7
+ #su-import-aiosp table.form-table {
8
+ border-bottom: 3px solid #ccc;
9
+ }
10
+
11
+ #su-import-aiosp td table tr.su-admin-form-checkbox td,
12
+ #su-import-aiosp td table tr.su-admin-form-textblock td {
13
+ border-top: 0 none;
14
+ padding-top: 0;
15
+ padding-bottom: 0;
16
+ }
modules/import-aiosp/import-aiosp.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * AISOP Import Module
4
  *
5
- * @version 1.0
6
  * @since 1.6
7
  */
8
 
@@ -148,27 +147,5 @@ class SU_ImportAIOSP extends SU_ImportModule {
148
  }
149
  }
150
 
151
- } elseif (strcmp($_GET['css'], 'admin') == 0) {
152
- header('Content-type: text/css');
153
- ?>
154
-
155
- #su-import-aiosp tr.su-admin-form-checkbox td,
156
- #su-import-aiosp tr.su-admin-form-textblock td {
157
- border-top: 3px solid #ccc;
158
- padding-top: 1em;
159
- }
160
-
161
- #su-import-aiosp table.form-table {
162
- border-bottom: 3px solid #ccc;
163
- }
164
-
165
- #su-import-aiosp td table tr.su-admin-form-checkbox td,
166
- #su-import-aiosp td table tr.su-admin-form-textblock td {
167
- border-top: 0 none;
168
- padding-top: 0;
169
- padding-bottom: 0;
170
- }
171
-
172
- <?php
173
  }
174
  ?>
2
  /**
3
  * AISOP Import Module
4
  *
 
5
  * @since 1.6
6
  */
7
 
147
  }
148
  }
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
151
  ?>
modules/import-aiosp/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/linkbox/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/linkbox/linkbox.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Linkbox Inserter Module
4
  *
5
- * @version 1.0.4
6
  * @since 0.6
7
  */
8
 
2
  /**
3
  * Linkbox Inserter Module
4
  *
 
5
  * @since 0.6
6
  */
7
 
modules/meta/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/meta/meta-settings.php CHANGED
@@ -2,14 +2,13 @@
2
  /**
3
  * Meta Editor Settings Module
4
  *
5
- * @version 1.0
6
  * @since 1.5
7
  */
8
 
9
  if (class_exists('SU_Module')) {
10
 
11
  class SU_MetaSettings extends SU_Module {
12
-
13
  function get_parent_module() { return 'meta'; }
14
  function is_independent_module() { return false; }
15
 
2
  /**
3
  * Meta Editor Settings Module
4
  *
 
5
  * @since 1.5
6
  */
7
 
8
  if (class_exists('SU_Module')) {
9
 
10
  class SU_MetaSettings extends SU_Module {
11
+
12
  function get_parent_module() { return 'meta'; }
13
  function is_independent_module() { return false; }
14
 
modules/meta/meta.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Meta Editor Module
4
  *
5
- * @version 1.0.7
6
  * @since 0.3
7
  */
8
 
@@ -13,8 +12,6 @@ class SU_Meta extends SU_Module {
13
  function get_module_title() { return __('Meta Editor', 'seo-ultimate'); }
14
 
15
  function init() {
16
- $this->admin_page_tabs_init();
17
-
18
  add_filter('su_meta_robots', array(&$this, 'meta_robots'));
19
  add_action('su_head', array(&$this, 'head_tag_output'));
20
  add_filter('su_postmeta_help', array(&$this, 'postmeta_help'), 20);
@@ -98,7 +95,7 @@ class SU_Meta extends SU_Module {
98
 
99
  $fields['20|description|keywords'] =
100
  "<tr class='textarea'>\n<th scope='row'><label for='$id'>".__("Description:", 'seo-ultimate')."</label></th>\n"
101
- . "<td><textarea name='$id' id='$id' type='text' class='regular-text' cols='60' rows='3'"
102
  . " onkeyup=\"javascript:document.getElementById('su_meta_description_charcount').innerHTML = document.getElementById('_su_description').value.length\">$value</textarea>"
103
  . "<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>")
104
  . "</td>\n</tr>\n"
2
  /**
3
  * Meta Editor Module
4
  *
 
5
  * @since 0.3
6
  */
7
 
12
  function get_module_title() { return __('Meta Editor', 'seo-ultimate'); }
13
 
14
  function init() {
 
 
15
  add_filter('su_meta_robots', array(&$this, 'meta_robots'));
16
  add_action('su_head', array(&$this, 'head_tag_output'));
17
  add_filter('su_postmeta_help', array(&$this, 'postmeta_help'), 20);
95
 
96
  $fields['20|description|keywords'] =
97
  "<tr class='textarea'>\n<th scope='row'><label for='$id'>".__("Description:", 'seo-ultimate')."</label></th>\n"
98
+ . "<td><textarea name='$id' id='$id' type='text' class='regular-text' cols='60' rows='3' tabindex='2'"
99
  . " onkeyup=\"javascript:document.getElementById('su_meta_description_charcount').innerHTML = document.getElementById('_su_description').value.length\">$value</textarea>"
100
  . "<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>")
101
  . "</td>\n</tr>\n"
modules/modules.css CHANGED
@@ -4,7 +4,12 @@ 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;
@@ -25,8 +30,10 @@ div.su-module table.widefat td {
25
  padding-right: 2em;
26
  }
27
 
28
- div.su-module table.widefat tr.new-hit td {
29
- background-color: #DFFFE3;
 
 
30
  }
31
 
32
  div.su-module .form-table .regular-text {
@@ -102,7 +109,7 @@ div.su-module .su-tabs ul.ui-tabs-nav li a {
102
  display: block;
103
  float: left;
104
  line-height: 28px;
105
- padding: 1px 13px 0;
106
  position: relative;
107
  text-decoration: none;
108
  }
@@ -118,7 +125,15 @@ div.su-module .su-tabs ul.ui-tabs-nav li.ui-tabs-selected a {
118
  border-bottom-color: #f9f9f9;
119
  color: #333333;
120
  font-weight: normal;
121
- padding: 0 12px;
 
 
 
 
 
 
 
 
122
  }
123
 
124
  /* IMPORT MODULES */
4
  padding-bottom: 1em;
5
  }
6
 
7
+ div.su-module h2 {
8
+ margin-bottom: 0.5em;
9
+ }
10
+
11
+ div.su-module h4.su-subheader {
12
+ font-size: 1.17em;
13
  margin-top: 3em;
14
  padding-top: 1em;
15
  border-top: 3px solid #ccc;
30
  padding-right: 2em;
31
  }
32
 
33
+ div.su-module table.widefat td ul {
34
+ list-style-type: disc;
35
+ margin-left: 1em;
36
+ padding-left: 1em;
37
  }
38
 
39
  div.su-module .form-table .regular-text {
109
  display: block;
110
  float: left;
111
  line-height: 28px;
112
+ padding: 1px 10px 0;
113
  position: relative;
114
  text-decoration: none;
115
  }
125
  border-bottom-color: #f9f9f9;
126
  color: #333333;
127
  font-weight: normal;
128
+ padding: 0 9px;
129
+ }
130
+
131
+ div.su-module .su-tabs fieldset {
132
+ clear: left;
133
+ }
134
+
135
+ div.su-module .su-tabs .su-tab-contents {
136
+ margin-top: 1em;
137
  }
138
 
139
  /* IMPORT MODULES */
modules/modules.js CHANGED
@@ -10,4 +10,15 @@ function su_textbox_value_changed(e, d, l) {
10
  document.getElementById(l).className='hidden';
11
  else
12
  document.getElementById(l).className='';
 
 
 
 
 
 
 
 
 
 
 
13
  }
10
  document.getElementById(l).className='hidden';
11
  else
12
  document.getElementById(l).className='';
13
+ }
14
+
15
+ function su_toggle_blind(id) {
16
+ if (document.getElementById(id)) {
17
+ if (document.getElementById(id).style.display=='none')
18
+ Effect.BlindDown(id);
19
+ else
20
+ Effect.BlindUp(id);
21
+ }
22
+
23
+ return false;
24
  }
modules/modules/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/modules/modules.css ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #su-modules td.module-status {
2
+ padding-right: 2em;
3
+ }
4
+
5
+ #su-modules td.module-status input {
6
+ display: none;
7
+ }
8
+
9
+ #su-modules td.module-status a {
10
+ float: left;
11
+ display: block;
12
+ border: 1px solid white;
13
+ padding: 0.3em 0.5em;
14
+ color: #999;
15
+ margin-right: 0.2em;
16
+ }
17
+
18
+ #su-modules td.module-status a:hover {
19
+ border-color: #ccc #666 #666 #ccc;
20
+ }
21
+
22
+ #su-modules td.module-status a.current {
23
+ border-color: #666 #ccc #ccc #666;
24
+ }
25
+
26
+ #su-modules td.module-status .status-10 a.current { color: green; }
27
+ #su-modules td.module-status .status-5 a.current { color: black; }
28
+ #su-modules td.module-status .status-0 a.current { color: darkorange; }
29
+ #su-modules td.module-status .status-n10 a.current{ color: red; }
modules/modules/modules.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ function set_module_status(key, input_value, a_obj) {
2
+ var td_id = "module-status-"+key;
3
+ var input_id = "su-"+key+"-module-status";
4
+
5
+ jQuery("td#"+td_id+" a").removeClass("current");
6
+ document.getElementById(input_id).value = input_value;
7
+ a_obj.className += " current";
8
+ }
modules/modules/modules.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Module Manager Module
4
  *
5
- * @version 1.2.1
6
  * @since 0.7
7
  */
8
 
@@ -135,58 +134,9 @@ STR;
135
 
136
  echo "\t</tbody>\n</table>\n";
137
 
138
- $this->admin_form_end(false, false);
139
  }
140
  }
141
 
142
- } elseif ($_GET['css'] == 'admin') {
143
- header('Content-type: text/css');
144
- ?>
145
-
146
- #su-modules td.module-status {
147
- padding-right: 2em;
148
- }
149
-
150
- #su-modules td.module-status input {
151
- display: none;
152
- }
153
-
154
- #su-modules td.module-status a {
155
- float: left;
156
- display: block;
157
- border: 1px solid white;
158
- padding: 0.3em 0.5em;
159
- color: #999;
160
- margin-right: 0.2em;
161
- }
162
-
163
- #su-modules td.module-status a:hover {
164
- border-color: #ccc #666 #666 #ccc;
165
- }
166
-
167
- #su-modules td.module-status a.current {
168
- border-color: #666 #ccc #ccc #666;
169
- }
170
-
171
- #su-modules td.module-status .status-10 a.current { color: green; }
172
- #su-modules td.module-status .status-5 a.current { color: black; }
173
- #su-modules td.module-status .status-0 a.current { color: darkorange; }
174
- #su-modules td.module-status .status-n10 a.current{ color: red; }
175
-
176
- <?php
177
- } elseif ($_GET['js'] == 'admin') {
178
- header('Content-type: text/javascript');
179
- ?>
180
-
181
- function set_module_status(key, input_value, a_obj) {
182
- var td_id = "module-status-"+key;
183
- var input_id = "su-"+key+"-module-status";
184
-
185
- jQuery("td#"+td_id+" a").removeClass("current");
186
- document.getElementById(input_id).value = input_value;
187
- a_obj.className += " current";
188
- }
189
-
190
- <?php
191
  }
192
  ?>
2
  /**
3
  * Module Manager Module
4
  *
 
5
  * @since 0.7
6
  */
7
 
134
 
135
  echo "\t</tbody>\n</table>\n";
136
 
137
+ $this->admin_form_end(null, false);
138
  }
139
  }
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  }
142
  ?>
modules/more-links/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/more-links/more-links.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * More Link Customizer Module
4
  *
5
- * @version 1.0.1
6
  * @since 1.3
7
  */
8
 
2
  /**
3
  * More Link Customizer Module
4
  *
 
5
  * @since 1.3
6
  */
7
 
modules/noindex/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/noindex/noindex.php CHANGED
@@ -2,14 +2,13 @@
2
  /**
3
  * Noindex Manager Module
4
  *
5
- * @version 1.1.2
6
  * @since 0.1
7
  */
8
 
9
  if (class_exists('SU_Module')) {
10
 
11
  class SU_Noindex extends SU_Module {
12
-
13
  function get_module_title() { return __('Noindex Manager', 'seo-ultimate'); }
14
 
15
  function init() {
2
  /**
3
  * Noindex Manager Module
4
  *
 
5
  * @since 0.1
6
  */
7
 
8
  if (class_exists('SU_Module')) {
9
 
10
  class SU_Noindex extends SU_Module {
11
+
12
  function get_module_title() { return __('Noindex Manager', 'seo-ultimate'); }
13
 
14
  function init() {
modules/sds-blog/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/sds-blog/sds-blog.css ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #su-sds-blog .rss-widget {
2
+ background-color: white;
3
+ border: 1px solid black;
4
+ padding: 2em;
5
+ margin: 2em 0;
6
+ border-radius: 10px;
7
+ -moz-border-radius: 10px;
8
+ -webkit-border-radius: 10px;
9
+ }
10
+
11
+ #su-sds-blog a.rsswidget {
12
+ font-size: 13px;
13
+ font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif;
14
+ line-height: 1.7em;
15
+ }
16
+
17
+ #su-sds-blog li a:visited {
18
+ color: purple;
19
+ }
20
+
21
+ #su-sds-blog span.rss-date {
22
+ margin-left: 3px;
23
+ }
24
+
25
+ #su-sds-blog li {
26
+ padding-bottom: 1em;
27
+ }
28
+
29
+ #su-sds-blog img#sds-logo {
30
+ float: right;
31
+ border: 1px solid black;
32
+ padding: 1em;
33
+ background-color: white;
34
+ margin-left: 2em;
35
+ border-radius: 10px;
36
+ -moz-border-radius: 10px;
37
+ -webkit-border-radius: 10px;
38
+ }
modules/sds-blog/sds-blog.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * SEO Design Solutions Whitepapers Module
4
  *
5
- * @version 1.0.6
6
  * @since 0.1
7
  */
8
 
@@ -23,52 +22,62 @@ class SU_SdsBlog extends SU_Module {
23
  $this->cron('load_blog_rss', 'hourly');
24
  }
25
 
 
 
 
 
26
  function get_default_settings() {
27
  //Don't notify about new items when the plugin is just installed
28
  return array('lastread' => time());
29
  }
30
 
31
  function filter_export_array($settings) {
32
- unset($settings[$this->get_module_key()]['rssitems']);
33
  return $settings;
34
  }
35
 
36
  function load_blog_rss() {
37
  $rss = suwp::load_rss('http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', SU_USER_AGENT);
38
- if ($rss) $this->update_setting('rssitems', $rss->items);
 
 
 
 
39
  }
40
 
41
  function admin_page_contents() {
42
- global $seo_ultimate;
43
- echo "<a href='http://www.seodesignsolutions.com'><img src='{$seo_ultimate->plugin_dir_url}plugin/images/sds-logo.png' alt='".__("SEO Design Solutions", 'seo-ultimate')."' id='sds-logo' /></a>";
44
- echo "<p>".__("Search engine optimization articles from the company behind the SEO Ultimate plugin.", 'seo-ultimate')."</p>\n";
45
  echo "<div class='rss-widget'>\n";
46
 
47
  add_filter('http_headers_useragent', 'su_get_user_agent');
 
48
  wp_widget_rss_output( 'http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', array('show_summary' => 1, 'show_date' => 1) );
 
49
  remove_filter('http_headers_useragent', 'su_get_user_agent');
50
 
51
  echo "</div>\n";
52
  $this->update_setting('lastread', time());
53
  }
54
 
 
 
 
 
 
 
 
 
 
55
  function get_unread_count() {
56
 
57
- $rss = $this->get_setting('rssitems');
58
-
59
- if ($rss) {
60
  $lastread = $this->get_setting('lastread');
61
-
62
- $new = 0;
63
- foreach ($rss as $item) {
64
- if ($this->get_feed_item_date($item) > $lastread) $new++;
65
- }
66
-
67
  return $new;
68
-
69
- } else {
70
- return 0;
71
  }
 
 
72
  }
73
 
74
  function get_feed_item_date($item) {
@@ -90,55 +99,7 @@ class SU_SdsBlog extends SU_Module {
90
  //Return a UNIX timestamp.
91
  if ($date) return $date; else return 0;
92
  }
93
-
94
- function admin_help() {
95
- return "<p>".__("The articles below are loaded from the SEO Design Solutions website. Click on an article&#8217s title to read it.", 'seo-ultimate')."</p>";
96
- }
97
-
98
  }
99
 
100
- } elseif ($_GET['css'] == 'admin') {
101
- header('Content-type: text/css');
102
- ?>
103
-
104
- #su-sds-blog .rss-widget {
105
- background-color: white;
106
- border: 1px solid black;
107
- padding: 2em;
108
- margin: 2em 0;
109
- border-radius: 10px;
110
- -moz-border-radius: 10px;
111
- -webkit-border-radius: 10px;
112
- }
113
-
114
- #su-sds-blog a.rsswidget {
115
- font-size: 13px;
116
- font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif;
117
- line-height: 1.7em;
118
- }
119
-
120
- #su-sds-blog li a:visited {
121
- color: purple;
122
- }
123
-
124
- #su-sds-blog span.rss-date {
125
- margin-left: 3px;
126
- }
127
-
128
- #su-sds-blog li {
129
- padding-bottom: 1em;
130
- }
131
-
132
- #su-sds-blog img#sds-logo {
133
- float: right;
134
- border: 1px solid black;
135
- padding: 1em;
136
- background-color: white;
137
- border-radius: 10px;
138
- -moz-border-radius: 10px;
139
- -webkit-border-radius: 10px;
140
- }
141
-
142
- <?php
143
  }
144
  ?>
2
  /**
3
  * SEO Design Solutions Whitepapers Module
4
  *
 
5
  * @since 0.1
6
  */
7
 
22
  $this->cron('load_blog_rss', 'hourly');
23
  }
24
 
25
+ function upgrade() {
26
+ $this->delete_setting('rssitems');
27
+ }
28
+
29
  function get_default_settings() {
30
  //Don't notify about new items when the plugin is just installed
31
  return array('lastread' => time());
32
  }
33
 
34
  function filter_export_array($settings) {
35
+ unset($settings[$this->get_module_key()]['rss_item_times']);
36
  return $settings;
37
  }
38
 
39
  function load_blog_rss() {
40
  $rss = suwp::load_rss('http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', SU_USER_AGENT);
41
+ if ($rss && $rss->items) {
42
+ $times = array();
43
+ foreach ($rss->items as $item) $times[] = $this->get_feed_item_date($item);
44
+ $this->update_setting('rss_item_times', $times);
45
+ }
46
  }
47
 
48
  function admin_page_contents() {
49
+ echo "<a href='http://www.seodesignsolutions.com'><img src='{$this->plugin->plugin_dir_url}plugin/images/sds-logo.png' alt='".__("SEO Design Solutions", 'seo-ultimate')."' id='sds-logo' /></a>";
50
+ echo "<p>".__("The search engine optimization articles below are loaded from the website of SEO Design Solutions, the company behind the SEO Ultimate plugin. Click on an article&#8217;s title to read it.", 'seo-ultimate')."</p>\n";
 
51
  echo "<div class='rss-widget'>\n";
52
 
53
  add_filter('http_headers_useragent', 'su_get_user_agent');
54
+ add_filter('esc_html', array(&$this, 'truncate_at_ellipsis'));
55
  wp_widget_rss_output( 'http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', array('show_summary' => 1, 'show_date' => 1) );
56
+ remove_filter('esc_html', array(&$this, 'truncate_at_ellipsis'));
57
  remove_filter('http_headers_useragent', 'su_get_user_agent');
58
 
59
  echo "</div>\n";
60
  $this->update_setting('lastread', time());
61
  }
62
 
63
+ function truncate_at_ellipsis($content) {
64
+ $end = '[...]';
65
+ if (sustr::has($content, $end)) {
66
+ $content = sustr::truncate_at($content, $end);
67
+ $content = sustr::rtrim_substr($content, $end);
68
+ }
69
+ return sustr::endwith($content, '[&hellip;]');
70
+ }
71
+
72
  function get_unread_count() {
73
 
74
+ if (count($times = $this->get_setting('rss_item_times', array()))) {
 
 
75
  $lastread = $this->get_setting('lastread');
76
+ $new = 0; foreach ($times as $time) if ($time > $lastread) $new++;
 
 
 
 
 
77
  return $new;
 
 
 
78
  }
79
+
80
+ return 0;
81
  }
82
 
83
  function get_feed_item_date($item) {
99
  //Return a UNIX timestamp.
100
  if ($date) return $date; else return 0;
101
  }
 
 
 
 
 
102
  }
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
  ?>
modules/settings/global-settings.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Global Settings Module
4
+ *
5
+ * @since 2.1
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_GlobalSettings extends SU_Module {
11
+
12
+ var $wp_meta_called = false;
13
+
14
+ function get_parent_module() { return 'settings'; }
15
+ function get_child_order() { return 10; }
16
+ function is_independent_module() { return false; }
17
+
18
+ function get_module_title() { return __('Global Settings', 'seo-ultimate'); }
19
+
20
+ function get_default_settings() {
21
+ return array(
22
+ 'attribution_link' => false
23
+ , 'plugin_notices' => true
24
+ );
25
+ }
26
+
27
+ function init() {
28
+ //Hook to add attribution link
29
+ if ($this->get_setting('attribution_link')) {
30
+ add_action('wp_meta', array(&$this, 'meta_link'));
31
+ add_action('wp_footer', array(&$this, 'footer_link'));
32
+ }
33
+ }
34
+
35
+ function admin_page_contents() {
36
+
37
+ //Plugin Settings
38
+ $this->admin_form_start();
39
+ $this->checkboxes(array(
40
+ 'attribution_link' => __("Enable nofollow&#8217;d attribution link", 'seo-ultimate')
41
+ , 'attribution_link_css' => __("Enable attribution link CSS styling", 'seo-ultimate')
42
+ , 'plugin_notices' => __("Notify me about unnecessary active plugins", 'seo-ultimate')
43
+ , 'mark_code' => __("Insert comments around HTML code insertions", 'seo-ultimate')
44
+ ));
45
+ $this->admin_form_end();
46
+ }
47
+
48
+ function meta_link() {
49
+ echo "<li><a href='http://www.seodesignsolutions.com/' title='Search engine optimization technology by SEO Design Solutions' rel='nofollow'>SEO</a></li>\n";
50
+ $this->wp_meta_called = true;
51
+ }
52
+
53
+ function footer_link() {
54
+ if (!$this->wp_meta_called) {
55
+ if ($this->get_setting('attribution_link_css')) {
56
+ $pstyle = " style='text-align: center; font-size: smaller;'";
57
+ $astyle = " style='color: inherit;'";
58
+ } else $pstyle = $astyle = '';
59
+
60
+ echo "\n<p id='suattr'$pstyle><a href='http://www.seodesignsolutions.com/' rel='nofollow'$astyle>Optimized by SEO Ultimate</a></p>\n";
61
+ }
62
+ }
63
+ }
64
+
65
+ }
66
+ ?>
modules/settings/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/settings/settings-data.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #su-settings table#manage-settings {
2
+ border-collapse: collapse;
3
+ margin-top: 2em;
4
+ }
5
+
6
+ #su-settings table#manage-settings td {
7
+ width: 100%;
8
+ }
9
+
10
+ #su-settings table#manage-settings th {
11
+ font-weight: bold;
12
+ padding-right: 2em;
13
+ }
14
+
15
+ #su-settings table#manage-settings td,
16
+ #su-settings table#manage-settings th {
17
+ padding-top: 2em;
18
+ padding-bottom: 2em;
19
+ border-top: 1px solid #ccc;
20
+ }
modules/settings/settings-data.php ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings Data Manager Module
4
+ *
5
+ * @since 2.1
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_SettingsData extends SU_Module {
11
+
12
+ function get_parent_module() { return 'settings'; }
13
+ function get_child_order() { return 20; }
14
+ function is_independent_module() { return false; }
15
+
16
+ function get_module_title() { return __('Settings Data Manager', 'seo-ultimate'); }
17
+ function get_module_subtitle() { return __('Manage Settings Data', 'seo-ultimate'); }
18
+
19
+ function get_admin_page_tabs() {
20
+ return array(
21
+ __('Import', 'seo-ultimate') => 'import_tab'
22
+ , __('Export', 'seo-ultimate') => 'export_tab'
23
+ , __('Reset', 'seo-ultimate') => 'reset_tab'
24
+ );
25
+ }
26
+
27
+ function portable_options() {
28
+ return array('settings', 'modules');
29
+ }
30
+
31
+ function init() {
32
+
33
+ if ($this->is_action('su-export')) {
34
+ header('Content-Type: application/octet-stream');
35
+ header('Content-Disposition: attachment; filename="SEO Ultimate Settings ('.date('Y-m-d').').dat"');
36
+
37
+ $options = $this->portable_options();
38
+ $export = array();
39
+ foreach ($options as $option) {
40
+ $data = $this->plugin->dbdata[$option];
41
+ $data = apply_filters("su_{$option}_export_array", $data);
42
+ $export[$option] = $data;
43
+ }
44
+ $export = base64_encode(serialize($export));
45
+
46
+ echo $export;
47
+ die();
48
+
49
+ } elseif ($this->is_action('su-import')) {
50
+
51
+ if (strlen($_FILES['settingsfile']['name'])) {
52
+
53
+ $file = $_FILES['settingsfile']['tmp_name'];
54
+ if (is_uploaded_file($file)) {
55
+ $import = base64_decode(file_get_contents($file));
56
+ if (is_serialized($import)) {
57
+ $import = unserialize($import);
58
+
59
+ $options = $this->portable_options();
60
+ foreach ($options as $option) {
61
+ $this->plugin->dbdata[$option] = array_merge($this->plugin->dbdata[$option], $import[$option]);
62
+ }
63
+
64
+ $this->queue_message('success', __("Settings successfully imported.", 'seo-ultimate'));
65
+ } else
66
+ $this->queue_message('error', __("The uploaded file is not in the proper format. Settings could not be imported.", 'seo-ultimate'));
67
+ } else
68
+ $this->queue_message('error', __("The settings file could not be uploaded successfully.", 'seo-ultimate'));
69
+
70
+ } else
71
+ $this->queue_message('warning', __("Settings could not be imported because no settings file was selected. Please click the &#8220;Browse&#8221; button and select a file to import.", 'seo-ultimate'));
72
+
73
+ } elseif ($this->is_action('su-reset')) {
74
+
75
+ $this->plugin->dbdata['settings'] = array();
76
+ unset($this->plugin->dbdata['modules']);
77
+ $this->load_default_settings();
78
+
79
+ $this->queue_message('success', __("All settings have been erased and defaults have been restored.", 'seo-ultimate'));
80
+ }
81
+ }
82
+
83
+ function import_tab() {
84
+ $this->admin_subheader(__('Import SEO Ultimate Settings File', 'seo-ultimate'));
85
+ $hook = $this->plugin->key_to_hook($this->get_module_or_parent_key());
86
+ echo "\n<p>";
87
+ _e("You can use this form to upload and import an SEO Ultimate settings file stored on your computer. (Settings files can be created using the Export tool.)", 'seo-ultimate');
88
+ echo "</p>\n";
89
+ echo "<form enctype='multipart/form-data' method='post' action='?page=$hook&amp;action=import#su-import'>\n";
90
+ echo "\t<input name='settingsfile' type='file' /> ";
91
+ $confirm = __("Are you sure you want to import this settings file? This will overwrite your current settings and cannot be undone.", 'seo-ultimate');
92
+ echo "<input type='submit' class='button-primary' value='".__("Import", 'seo-ultimate')."' onclick=\"javascript:return confirm('$confirm')\" />\n";
93
+ wp_nonce_field($this->get_nonce_handle('su-import'));
94
+ echo "</form>\n";
95
+
96
+ //Import from other plugins
97
+ $importmodules = array();
98
+ foreach ($this->plugin->modules as $key => $x_module) {
99
+ $module =& $this->plugin->modules[$key];
100
+ if (is_a($module, 'SU_ImportModule')) {
101
+ $importmodules[$key] =& $module;
102
+ }
103
+ }
104
+
105
+ if (count($importmodules)) {
106
+ $this->admin_subheader(__("Import from Other Plugins", 'seo-ultimate'));
107
+ echo "\n<p>";
108
+ _e("You can import settings and data from these plugins. Clicking a plugin&#8217;s name will take you to the importer page, where you can customize parameters and start the import.", 'seo-ultimate');
109
+ echo "</p>\n";
110
+ echo "<table class='widefat'>\n";
111
+
112
+ $class = '';
113
+ foreach ($importmodules as $key => $x_module) {
114
+ $module =& $importmodules[$key];
115
+ $title = $module->get_op_title();
116
+ $desc = $module->get_import_desc();
117
+ $url = $module->get_admin_url();
118
+ $class = ($class) ? '' : 'alternate';
119
+ echo "\t<tr class='$class'><td><a href='$url'>$title</a></td><td>$desc</td></tr>\n";
120
+ }
121
+
122
+ echo "</table>\n";
123
+ }
124
+ }
125
+
126
+ function export_tab() {
127
+ echo "\n<p>";
128
+ _e("You can use the export tool to download an SEO Ultimate settings file to your computer.", 'seo-ultimate');
129
+ echo "</p>\n<p>";
130
+ _e("A settings file includes the data of every checkbox and textbox of every installed module. It does NOT include site-specific data like logged 404s or post/page title/meta data (this data would be included in a standard database backup, however).", 'seo-ultimate');
131
+ echo "</p>\n<p>";
132
+ $url = $this->get_nonce_url('su-export');
133
+ echo "<a href='$url' class='button-primary'>".__("Download Settings File", 'seo-ultimate')."</a>";
134
+ echo "</p>\n";
135
+ }
136
+
137
+ function reset_tab() {
138
+ echo "\n<p>";
139
+ _e("You can erase all your SEO Ultimate settings and restore them to &#8220;factory defaults&#8221; by clicking the button below.", 'seo-ultimate');
140
+ echo "</p>\n<p>";
141
+ $url = $this->get_nonce_url('su-reset');
142
+ $confirm = __("Are you sure you want to erase all module settings? This cannot be undone.", 'seo-ultimate');
143
+ echo "<a href='$url#su-reset' class='button-primary' onclick=\"javascript:return confirm('$confirm')\">".__("Restore Default Settings", 'seo-ultimate')."</a>";
144
+ echo "</p>\n";
145
+ }
146
+
147
+ /*
148
+ function admin_page_contents() {
149
+
150
+ echo "<p>";
151
+ _e("Here you can export, import, and reset the settings of the plugin and all its modules.", 'seo-ultimate');
152
+ echo "</p><p>";
153
+ _e("A settings file includes the data of every checkbox and textbox of every installed module, as well as the &#8220;Plugin Settings&#8221; section above. It does NOT include site-specific data like logged 404s or post/page title/meta data (this data would be included in a standard database backup, however).", 'seo-ultimate');
154
+ echo "</p>";
155
+
156
+ //Begin table
157
+ echo "<table id='manage-settings'>\n";
158
+
159
+ //Export
160
+ echo "<tr><th scope='row'>";
161
+ _e("Export:", 'seo-ultimate');
162
+ echo "</th><td>";
163
+ $url = $this->get_nonce_url('su-export');
164
+ echo "<a href='$url' class='button-secondary'>".__("Download Settings File", 'seo-ultimate')."</a>";
165
+ echo "</td></tr>";
166
+
167
+ //Import
168
+ echo "<tr><th scope='row'>";
169
+ _e("Import:", 'seo-ultimate');
170
+ echo "</th><td>";
171
+ $hook = $this->plugin->key_to_hook($this->get_module_key());
172
+ echo "<form enctype='multipart/form-data' method='post' action='?page=$hook&amp;action=import'>\n";
173
+ echo "\t<input name='settingsfile' type='file' /> ";
174
+ $confirm = __("Are you sure you want to import this settings file? This will overwrite your current settings and cannot be undone.", 'seo-ultimate');
175
+ echo "<input type='submit' class='button-secondary' value='".__("Import This Settings File", 'seo-ultimate')."' onclick=\"javascript:return confirm('$confirm')\" />\n";
176
+ wp_nonce_field($this->get_nonce_handle('su-import'));
177
+ echo "</form>\n";
178
+ echo "</td></tr>";
179
+
180
+ //Reset
181
+ echo "<tr><th scope='row'>";
182
+ _e("Reset:", 'seo-ultimate');
183
+ echo "</th><td>";
184
+ $url = $this->get_nonce_url('su-reset');
185
+ $confirm = __("Are you sure you want to erase all module settings? This cannot be undone.", 'seo-ultimate');
186
+ echo "<a href='$url' class='button-secondary' onclick=\"javascript:return confirm('$confirm')\">".__("Restore Default Settings", 'seo-ultimate')."</a>";
187
+ echo "</td></tr>";
188
+
189
+ //End table
190
+ echo "</table>";
191
+
192
+ //Import from other plugins
193
+ $importmodules = array();
194
+ foreach ($this->plugin->modules as $key => $x_module) {
195
+ $module =& $this->plugin->modules[$key];
196
+ if (is_a($module, 'SU_ImportModule')) {
197
+ $importmodules[$key] =& $module;
198
+ }
199
+ }
200
+
201
+ if (count($importmodules)) {
202
+ $this->admin_subheader(__("Import from Other Plugins", 'seo-ultimate'));
203
+ echo "\n<p>";
204
+ _e("You can import settings and data from these plugins. Clicking a plugin&#8217;s name will take you to the importer page, where you can customize parameters and start the import.", 'seo-ultimate');
205
+ echo "</p>\n";
206
+ echo "<table class='widefat'>\n";
207
+
208
+ $class = '';
209
+ foreach ($importmodules as $key => $x_module) {
210
+ $module =& $importmodules[$key];
211
+ $title = $module->get_op_title();
212
+ $desc = $module->get_import_desc();
213
+ $url = $module->get_admin_url();
214
+ $class = ($class) ? '' : 'alternate';
215
+ echo "\t<tr class='$class'><td><a href='$url'>$title</a></td><td>$desc</td></tr>\n";
216
+ }
217
+
218
+ echo "</table>\n";
219
+ }
220
+ }*/
221
+ }
222
+
223
+ }
224
+
225
+ ?>
modules/settings/settings.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * SEO Ultimate Plugin Settings Module
4
  *
5
- * @version 2.3.3
6
  * @since 0.2
7
  */
8
 
@@ -10,220 +9,12 @@ if (class_exists('SU_Module')) {
10
 
11
  class SU_Settings extends SU_Module {
12
 
13
- var $wp_meta_called = false;
14
-
15
  function get_module_title() { return __('Plugin Settings', 'seo-ultimate'); }
16
  function get_page_title() { return __('SEO Ultimate Plugin Settings', 'seo-ultimate'); }
17
  function get_menu_title() { return __('SEO Ultimate', 'seo-ultimate'); }
18
- function get_menu_parent(){ return 'options-general.php'; }
19
-
20
- function get_default_settings() {
21
- return array(
22
- 'attribution_link' => false
23
- , 'plugin_notices' => true
24
- , 'log_hits' => true
25
- , 'delete_old_hits_value' => 30
26
- );
27
- }
28
-
29
- function portable_options() {
30
- return array('settings', 'modules');
31
- }
32
-
33
- function init() {
34
-
35
- if ($this->is_action('su-export')) {
36
- header('Content-Type: application/octet-stream');
37
- header('Content-Disposition: attachment; filename="SEO Ultimate Settings ('.date('Y-m-d').').dat"');
38
-
39
- $options = $this->portable_options();
40
- $export = array();
41
- foreach ($options as $option) {
42
- $data = $this->plugin->dbdata[$option];
43
- $data = apply_filters("su_{$option}_export_array", $data);
44
- $export[$option] = $data;
45
- }
46
- $export = base64_encode(serialize($export));
47
-
48
- echo $export;
49
- die();
50
-
51
- } elseif ($this->is_action('su-import')) {
52
-
53
- if (strlen($_FILES['settingsfile']['name'])) {
54
-
55
- $file = $_FILES['settingsfile']['tmp_name'];
56
- if (is_uploaded_file($file)) {
57
- $import = base64_decode(file_get_contents($file));
58
- if (is_serialized($import)) {
59
- $import = unserialize($import);
60
-
61
- $options = $this->portable_options();
62
- foreach ($options as $option) {
63
- $this->plugin->dbdata[$option] = array_merge($this->plugin->dbdata[$option], $import[$option]);
64
- }
65
-
66
- $this->queue_message('success', __("Settings successfully imported.", 'seo-ultimate'));
67
- } else
68
- $this->queue_message('error', __("The uploaded file is not in the proper format. Settings could not be imported.", 'seo-ultimate'));
69
- } else
70
- $this->queue_message('error', __("The settings file could not be uploaded successfully.", 'seo-ultimate'));
71
-
72
- } else
73
- $this->queue_message('warning', __("Settings could not be imported because no settings file was selected. Please click the &#8220;Browse&#8221; button and select a file to import.", 'seo-ultimate'));
74
-
75
- } elseif ($this->is_action('su-reset')) {
76
-
77
- $this->plugin->dbdata['settings'] = array();
78
- unset($this->plugin->dbdata['modules']);
79
- $this->load_default_settings();
80
-
81
- $this->queue_message('success', __("All settings have been erased and defaults have been restored.", 'seo-ultimate'));
82
- }
83
-
84
-
85
- //Hook to add attribution link
86
- if ($this->get_setting('attribution_link')) {
87
- add_action('wp_meta', array(&$this, 'meta_link'));
88
- add_action('wp_footer', array(&$this, 'footer_link'));
89
- }
90
- }
91
-
92
- function admin_page_contents() {
93
-
94
- //Plugin Settings
95
- $this->admin_form_start(__("Plugin Settings", 'seo-ultimate'));
96
- $this->checkboxes(array(
97
- 'attribution_link' => __("Enable nofollow&#8217;d attribution link", 'seo-ultimate')
98
- , 'attribution_link_css' => __("Enable attribution link CSS styling", 'seo-ultimate')
99
- , 'plugin_notices' => __("Notify me about unnecessary active plugins", 'seo-ultimate')
100
- //, 'debug_mode' => __("Enable debug-mode logging", 'seo-ultimate')
101
- , 'mark_code' => __("Insert comments around HTML code insertions", 'seo-ultimate')
102
- , 'log_hits' => __("Allow modules to save visitor information to the database", 'seo-ultimate')
103
- , 'delete_old_hits' => __("Delete logged visitor information after %d days", 'seo-ultimate')
104
- ));
105
- $this->admin_form_end();
106
-
107
- //Manage Settings
108
- $this->admin_subheader(__("Manage Settings Data", 'seo-ultimate'));
109
- $this->print_messages();
110
-
111
- echo "<p>";
112
- _e("This section allows you to export, import, and reset the settings of the plugin and all its modules.", 'seo-ultimate');
113
- echo "</p><p>";
114
- _e("A settings file includes the data of every checkbox and textbox of every installed module, as well as the &#8220;Plugin Settings&#8221; section above. ".
115
- "It does NOT include site-specific data like logged 404s or post/page title/meta data (this data would be included in a standard database backup, however).", 'seo-ultimate');
116
- echo "</p>";
117
-
118
- //Begin table
119
- echo "<table id='manage-settings'>\n";
120
-
121
- //Export
122
- echo "<tr><th scope='row'>";
123
- _e("Export:", 'seo-ultimate');
124
- echo "</th><td>";
125
- $url = $this->get_nonce_url('su-export');
126
- echo "<a href='$url' class='button-secondary'>".__("Download Settings File", 'seo-ultimate')."</a>";
127
- echo "</td></tr>";
128
-
129
- //Import
130
- echo "<tr><th scope='row'>";
131
- _e("Import:", 'seo-ultimate');
132
- echo "</th><td>";
133
- $hook = $this->plugin->key_to_hook($this->get_module_key());
134
- echo "<form enctype='multipart/form-data' method='post' action='?page=$hook&amp;action=import'>\n";
135
- echo "\t<input name='settingsfile' type='file' /> ";
136
- $confirm = __("Are you sure you want to import this settings file? This will overwrite your current settings and cannot be undone.", 'seo-ultimate');
137
- echo "<input type='submit' class='button-secondary' value='".__("Import This Settings File", 'seo-ultimate')."' onclick=\"javascript:return confirm('$confirm')\" />\n";
138
- wp_nonce_field($this->get_nonce_handle('su-import'));
139
- echo "</form>\n";
140
- echo "</td></tr>";
141
-
142
- //Reset
143
- echo "<tr><th scope='row'>";
144
- _e("Reset:", 'seo-ultimate');
145
- echo "</th><td>";
146
- $url = $this->get_nonce_url('su-reset');
147
- $confirm = __("Are you sure you want to erase all module settings? This cannot be undone.", 'seo-ultimate');
148
- echo "<a href='$url' class='button-secondary' onclick=\"javascript:return confirm('$confirm')\">".__("Restore Default Settings", 'seo-ultimate')."</a>";
149
- echo "</td></tr>";
150
-
151
- //End table
152
- echo "</table>";
153
-
154
- //Import from other plugins
155
- $importmodules = array();
156
- foreach ($this->plugin->modules as $key => $x_module) {
157
- $module =& $this->plugin->modules[$key];
158
- if (is_a($module, 'SU_ImportModule')) {
159
- $importmodules[$key] =& $module;
160
- }
161
- }
162
-
163
- if (count($importmodules)) {
164
- $this->admin_subheader(__("Import from Other Plugins", 'seo-ultimate'));
165
- echo "\n<p>";
166
- _e("You can import settings and data from these plugins. Clicking a plugin&#8217;s name will take you to the importer page, where you can customize parameters and start the import.", 'seo-ultimate');
167
- echo "</p>\n";
168
- echo "<table class='widefat'>\n";
169
-
170
- $class = '';
171
- foreach ($importmodules as $key => $x_module) {
172
- $module =& $importmodules[$key];
173
- $title = $module->get_op_title();
174
- $desc = $module->get_import_desc();
175
- $url = $module->get_admin_url();
176
- $class = ($class) ? '' : 'alternate';
177
- echo "\t<tr class='$class'><td><a href='$url'>$title</a></td><td>$desc</td></tr>\n";
178
- }
179
-
180
- echo "</table>\n";
181
- }
182
- }
183
-
184
- function meta_link() {
185
- echo "<li><a href='http://www.seodesignsolutions.com/' title='Search engine optimization technology by SEO Design Solutions' rel='nofollow'>SEO</a></li>\n";
186
- $this->wp_meta_called = true;
187
- }
188
-
189
- function footer_link() {
190
- if (!$this->wp_meta_called) {
191
- if ($this->get_setting('attribution_link_css')) {
192
- $pstyle = " style='text-align: center; font-size: smaller;'";
193
- $astyle = " style='color: inherit;'";
194
- } else $pstyle = $astyle = '';
195
-
196
- echo "\n<p id='suattr'$pstyle>Search engine optimization by <a href='http://www.seodesignsolutions.com/' rel='nofollow'$astyle>SEO Design Solutions</a></a></p>\n";
197
- }
198
- }
199
-
200
- }
201
-
202
- } elseif ($_GET['css'] == 'admin') {
203
- header('Content-type: text/css');
204
- ?>
205
-
206
- #su-settings table#manage-settings {
207
- border-collapse: collapse;
208
- margin-top: 2em;
209
  }
210
 
211
- #su-settings table#manage-settings td {
212
- width: 100%;
213
- }
214
-
215
- #su-settings table#manage-settings th {
216
- font-weight: bold;
217
- padding-right: 2em;
218
- }
219
-
220
- #su-settings table#manage-settings td,
221
- #su-settings table#manage-settings th {
222
- padding-top: 2em;
223
- padding-bottom: 2em;
224
- border-top: 1px solid #ccc;
225
- }
226
-
227
- <?php
228
  }
229
  ?>
2
  /**
3
  * SEO Ultimate Plugin Settings Module
4
  *
 
5
  * @since 0.2
6
  */
7
 
9
 
10
  class SU_Settings extends SU_Module {
11
 
 
 
12
  function get_module_title() { return __('Plugin Settings', 'seo-ultimate'); }
13
  function get_page_title() { return __('SEO Ultimate Plugin Settings', 'seo-ultimate'); }
14
  function get_menu_title() { return __('SEO Ultimate', 'seo-ultimate'); }
15
+ function get_menu_parent(){ return 'options-general.php'; }
16
+ function admin_page_contents() { $this->children_admin_page_tabs(); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  }
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  }
20
  ?>
modules/settings/uninstall.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Uninstaller Module
4
+ *
5
+ * @since 2.1
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ class SU_Uninstall extends SU_Module {
11
+
12
+ function get_parent_module() { return 'settings'; }
13
+ function get_child_order() { return 40; }
14
+ function is_independent_module() { return false; }
15
+ function get_settings_key() { return $this->get_module_key(); }
16
+
17
+ function get_module_title() { return __('Uninstaller', 'seo-ultimate'); }
18
+ function get_module_subtitle() { return __('Uninstall', 'seo-ultimate'); }
19
+
20
+ function init() {
21
+ if ($this->is_action('su-uninstall'))
22
+ add_filter('su_custom_admin_page-settings', array(&$this, 'do_uninstall'));
23
+ }
24
+
25
+ function admin_page_contents() {
26
+ echo "\n<p>";
27
+ _e("Uninstalling SEO Ultimate will delete your settings and the plugin&#8217;s files.", 'seo-ultimate');
28
+ echo "</p>\n";
29
+ $url = $this->get_nonce_url('su-uninstall');
30
+ $confirm = __("Are you sure you want to uninstall SEO Ultimate? This will permanently erase your SEO Ultimate settings and cannot be undone.", 'seo-ultimate');
31
+ echo "<a href='$url' class='button-primary' onclick=\"javascript:return confirm('$confirm')\">".__("Uninstall Now", 'seo-ultimate')."</a>";
32
+ }
33
+
34
+ function enable_post_uninstall_page() {
35
+ add_submenu_page('su-hidden-modules', __('Uninstall SEO Ultimate', 'seo-ultimate'), 'Uninstall',
36
+ 'manage_options', 'seo-ultimate', array(&$this->parent_module, 'admin_page_contents'));
37
+ }
38
+
39
+ function do_uninstall() {
40
+ echo "<script type='text/javascript'>jQuery('#adminmenu .current').hide(); jQuery('#toplevel_page_seo').hide();</script>";
41
+ echo "<div class=\"wrap\">\n";
42
+ echo "\n<h2>".__("Uninstall SEO Ultimate", 'seo-ultimate')."</h2>\n";
43
+
44
+ //Delete settings and do miscellaneous clean up
45
+ $this->plugin->uninstall();
46
+ $this->print_mini_message('success', __("Deleted settings.", 'seo-ultimate'));
47
+
48
+ //Deactivate the plugin
49
+ deactivate_plugins(array($this->plugin->plugin_basename), true);
50
+
51
+ //Attempt to delete the plugin's files and output result
52
+ if (is_wp_error($error = delete_plugins(array($this->plugin->plugin_basename))))
53
+ $this->print_mini_message('error', __("An error occurred while deleting files.", 'seo-ultimate').'<br />'.$error->get_error_message());
54
+ else {
55
+ $this->print_mini_message('success', __("Deleted files.", 'seo-ultimate'));
56
+ $this->print_mini_message('success', __("Uninstallation complete. Thanks for trying SEO Ultimate.", 'seo-ultimate'));
57
+ }
58
+
59
+ echo "\n</div>\n";
60
+
61
+ return true;
62
+ }
63
+ }
64
+
65
+ }
66
+ ?>
modules/site-keyword-queries/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/site-keyword-queries/site-keyword-queries.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Internal Relevance Researcher Module
4
  *
5
- * @version 1.0.1
6
  * @since 1.4
7
  */
8
 
2
  /**
3
  * Internal Relevance Researcher Module
4
  *
 
5
  * @since 1.4
6
  */
7
 
modules/slugs/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/slugs/slugs.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Slug Optimizer Module
4
  *
5
- * @version 1.0.3
6
  * @since 0.9
7
  */
8
 
2
  /**
3
  * Slug Optimizer Module
4
  *
 
5
  * @since 0.9
6
  */
7
 
modules/titles/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ header('Status: 403 Forbidden');
3
+ header('HTTP/1.1 403 Forbidden');
4
+ ?>
modules/titles/titles-formats.php CHANGED
@@ -1,4 +1,10 @@
1
  <?php
 
 
 
 
 
 
2
  class SU_TitlesFormats extends SU_Module {
3
 
4
  function get_parent_module() { return 'titles'; }
1
  <?php
2
+ /**
3
+ * Title Rewriter Formats Module
4
+ *
5
+ * @since 1.5
6
+ */
7
+
8
  class SU_TitlesFormats extends SU_Module {
9
 
10
  function get_parent_module() { return 'titles'; }
modules/titles/titles-posts.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Post Title Editor Module
4
  *
5
- * @version 1.0
6
  * @since 1.5
7
  */
8
 
2
  /**
3
  * Post Title Editor Module
4
  *
 
5
  * @since 1.5
6
  */
7
 
modules/titles/titles-taxonomies.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Taxonomy Title Editor Module
4
  *
5
- * @version 1.1
6
  * @since 1.9
7
  */
8
 
2
  /**
3
  * Taxonomy Title Editor Module
4
  *
 
5
  * @since 1.9
6
  */
7
 
modules/titles/titles.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ #su-titles table.widefat {
2
+ width: auto;
3
+ }
4
+
5
+ #su-titles table.widefat td input.regular-text {
6
+ width: 400px;
7
+ }
modules/titles/titles.php CHANGED
@@ -2,7 +2,6 @@
2
  /**
3
  * Title Rewriter Module
4
  *
5
- * @version 2.0.2
6
  * @since 0.1
7
  */
8
 
@@ -16,7 +15,6 @@ class SU_Titles extends SU_Module {
16
  add_action('template_redirect', array(&$this, 'before_header'), 0);
17
  add_action('wp_head', array(&$this, 'after_header'), 1000);
18
  add_filter('su_postmeta_help', array(&$this, 'postmeta_help'), 10);
19
- $this->admin_page_tabs_init();
20
  }
21
 
22
  function get_default_settings() {
@@ -61,11 +59,6 @@ class SU_Titles extends SU_Module {
61
  echo "</table>";
62
  }
63
 
64
- function postmeta_fields($fields) {
65
- $fields['10|title'] = $this->get_postmeta_textbox('title', __('Title Tag:', 'seo-ultimate'));
66
- return $fields;
67
- }
68
-
69
  function get_title_format() {
70
  if ($key = $this->get_current_page_type())
71
  return $this->get_setting("title_$key");
@@ -420,36 +413,17 @@ STR;
420
  return $tabs;
421
  }
422
 
 
 
 
 
 
423
  function postmeta_help($help) {
424
  $help[] = __("<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; tag. The title appears in visitors' title bars and in search engine result titles. ".
425
  "If this box is left blank, then the <a href='admin.php?page=su-titles' target='_blank'>default post/page titles</a> are used.", 'seo-ultimate');
426
  return $help;
427
  }
428
-
429
- //Imports title tag data from other plugins
430
- function import_op_titles($value) {
431
- if (!strlen($value))
432
- return $this->import_postmeta(array(
433
- SU_AIOSP_PATH => array('_aioseop_title', 'title')
434
- ));
435
-
436
- return $value;
437
- }
438
-
439
- }
440
-
441
- } elseif ($_GET['css'] == 'admin') {
442
- header('Content-type: text/css');
443
- ?>
444
-
445
- #su-titles table.widefat {
446
- width: auto;
447
  }
448
 
449
- #su-titles table.widefat td input.regular-text {
450
- width: 400px;
451
- }
452
-
453
- <?php
454
  }
455
  ?>
2
  /**
3
  * Title Rewriter Module
4
  *
 
5
  * @since 0.1
6
  */
7
 
15
  add_action('template_redirect', array(&$this, 'before_header'), 0);
16
  add_action('wp_head', array(&$this, 'after_header'), 1000);
17
  add_filter('su_postmeta_help', array(&$this, 'postmeta_help'), 10);
 
18
  }
19
 
20
  function get_default_settings() {
59
  echo "</table>";
60
  }
61
 
 
 
 
 
 
62
  function get_title_format() {
63
  if ($key = $this->get_current_page_type())
64
  return $this->get_setting("title_$key");
413
  return $tabs;
414
  }
415
 
416
+ function postmeta_fields($fields) {
417
+ $fields['10|title'] = $this->get_postmeta_textbox('title', __('Title Tag:', 'seo-ultimate'));
418
+ return $fields;
419
+ }
420
+
421
  function postmeta_help($help) {
422
  $help[] = __("<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; tag. The title appears in visitors' title bars and in search engine result titles. ".
423
  "If this box is left blank, then the <a href='admin.php?page=su-titles' target='_blank'>default post/page titles</a> are used.", 'seo-ultimate');
424
  return $help;
425
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  }
427
 
 
 
 
 
 
428
  }
429
  ?>
plugin/class.seo-ultimate.php CHANGED
@@ -80,6 +80,14 @@ class SEO_Ultimate {
80
  */
81
  var $plugin_dir_url;
82
 
 
 
 
 
 
 
 
 
83
  /**
84
  * The array to be inserted into the hits table.
85
  *
@@ -133,8 +141,8 @@ class SEO_Ultimate {
133
  $this->upgrade_to_08();
134
 
135
  //Save
136
- add_action('shutdown', array(&$this, 'save_dbdata'));
137
  add_action('shutdown', array(&$this, 'save_hit'));
 
138
 
139
  /********** CLASS CONSTRUCTION **********/
140
 
@@ -181,9 +189,6 @@ class SEO_Ultimate {
181
  //If we're deactivating the plugin, then call the deactivation function
182
  register_deactivation_hook($this->plugin_file_path, array(&$this, 'deactivate'));
183
 
184
- //If we're uninstalling the plugin, then call the uninstallation function
185
- register_uninstall_hook($this->plugin_file_path, 'su_uninstall');
186
-
187
 
188
  /********** ACTION & FILTER HOOKS **********/
189
 
@@ -193,45 +198,56 @@ class SEO_Ultimate {
193
  //Hook to output all <head> code
194
  add_action('wp_head', array(&$this, 'template_head'), 1);
195
 
196
- //Hook to include JavaScript and CSS
197
- add_action('admin_head', array(&$this, 'admin_includes'));
198
-
199
- //Hook to add plugin notice actions
200
- add_action('admin_head', array(&$this, 'plugin_page_notices'));
201
-
202
- //Hook to remove other plugins' notices from our admin pages
203
- add_action('admin_head', array(&$this, 'remove_admin_notices'));
204
-
205
- if (!get_option('blog_public')) {
206
- //Add admin-wide notice
207
- add_action('admin_notices', array(&$this, 'private_blog_admin_notice'));
208
-
209
- //Remove duplicate Robots Meta notice
210
- suwp::remove_instance_action('admin_footer', 'RobotsMeta_Admin', 'blog_public_warning');
211
- }
212
-
213
- //When loading the admin menu, call on our menu constructor function.
214
- //For future-proofing purposes, we specifically state the default priority of 10,
215
- //since some modules set a priority of 9 with the specific intention of running
216
- //before this main plugin's hook.
217
- add_action('admin_menu', array(&$this, 'add_menus'), 10);
218
-
219
- //Hook to customize contextual help
220
- add_filter('contextual_help', array(&$this, 'admin_help'), 10, 2);
221
-
222
- //Postmeta box hooks
223
- add_action('admin_menu', array(&$this, 'add_postmeta_box'));
224
- add_action('save_post', array(&$this, 'save_postmeta_box'), 10, 2);
225
-
226
- //Display info on new versions
227
- add_action('in_plugin_update_message-'.plugin_basename($this->plugin_file_path), array(&$this, 'plugin_update_info'), 10, 2);
228
-
229
  //Log this visitor!
230
  if ($this->get_setting('log_hits', true, 'settings')) {
231
  add_filter('redirect_canonical', array(&$this, 'log_redirect_canonical'));
232
  add_filter('wp_redirect', array(&$this, 'log_redirect'), 10, 2);
233
  add_filter('status_header', array(&$this, 'log_hit'), 10, 2);
234
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
235
  }
236
 
237
  /**
@@ -255,9 +271,6 @@ class SEO_Ultimate {
255
  */
256
  function install() {
257
 
258
- //Add the database table
259
- $this->db_setup();
260
-
261
  //Load settings file if present
262
  if (!isset($this->dbdata['settings']) && is_readable($settingsfile = $this->plugin_dir_path.'settings.txt')) {
263
  $import = base64_decode(file_get_contents($settingsfile));
@@ -273,9 +286,7 @@ class SEO_Ultimate {
273
  * @param string $oldversion The version that was last installed.
274
  */
275
  function upgrade($oldversion) {
276
-
277
- //Upgrade database schemas if needed
278
- $this->db_setup();
279
  }
280
 
281
  /**
@@ -348,9 +359,6 @@ class SEO_Ultimate {
348
 
349
  //Stop the database data from being re-saved
350
  remove_action('shutdown', array(&$this, 'save_dbdata'));
351
-
352
- //Delete the hits table
353
- mysql_query("DROP TABLE IF EXISTS ".$this->get_table_name('hits'));
354
  }
355
 
356
 
@@ -370,11 +378,11 @@ class SEO_Ultimate {
370
  function load_plugin_data($plugin_path) {
371
 
372
  //Load plugin path/URL information
373
- $filename = 'seo-ultimate.php';
374
- $this->plugin_dir_path = trailingslashit(dirname(trailingslashit(WP_PLUGIN_DIR).plugin_basename($plugin_path)));
375
- $this->plugin_file_path = $this->plugin_dir_path.$filename;
376
- $this->plugin_dir_url = trailingslashit(plugins_url(dirname(plugin_basename($plugin_path))));
377
- $this->plugin_file_url = $this->plugin_dir_url.$filename;
378
  }
379
 
380
  /**
@@ -457,7 +465,9 @@ class SEO_Ultimate {
457
  $this->modules[$module]->module_key = $module;
458
 
459
  //Tell the module what its URL is
460
- $this->modules[$module]->module_dir_url = $mdirurl = $this->plugin_dir_url."modules/$folder/";
 
 
461
  $this->modules[$module]->module_url = $mdirurl . $file;
462
 
463
  /*
@@ -508,9 +518,9 @@ class SEO_Ultimate {
508
  $this->remove_cron_jobs();
509
 
510
  //Tell the modules what their plugin page hooks are
511
- foreach ($this->modules as $key => $module)
512
  $this->modules[$key]->plugin_page_hook =
513
- $this->modules[$key]->get_menu_parent_hook().'_page_'.$this->key_to_hook($key);
514
 
515
  if (!$this->module_exists($this->default_menu_module)) {
516
  foreach ($this->modules as $key => $module) {
@@ -545,55 +555,14 @@ class SEO_Ultimate {
545
 
546
  //Only run init tasks after all other init functions are completed for all modules
547
  foreach ($this->modules as $key => $module) {
 
 
 
 
548
  $this->modules[$key]->init();
549
  }
550
  }
551
 
552
-
553
- /********** DATABASE FUNCTIONS **********/
554
-
555
- /**
556
- * Will create or update the database table.
557
- *
558
- * @since 0.1
559
- * @uses get_table_name()
560
- */
561
- function db_setup() {
562
-
563
- $sql = "CREATE TABLE " . $this->get_table_name('hits') . " (
564
- id BIGINT NOT NULL AUTO_INCREMENT,
565
- time INT NOT NULL ,
566
- ip_address VARCHAR(255) NOT NULL,
567
- user_agent VARCHAR(255) NOT NULL,
568
- url TEXT NOT NULL,
569
- redirect_url TEXT NOT NULL,
570
- redirect_trigger VARCHAR(255) NOT NULL,
571
- referer TEXT NOT NULL,
572
- status_code SMALLINT(3) NOT NULL,
573
- is_new BOOL NOT NULL,
574
- PRIMARY KEY (id)
575
- );";
576
-
577
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
578
- dbDelta($sql);
579
- }
580
-
581
- /**
582
- * Returns a full, prefixed MySQL table name.
583
- *
584
- * @since 0.1
585
- *
586
- * @param string $shortname The non-prefixed table name.
587
- * @return string The full, prefixed table name.
588
- */
589
- function get_table_name($shortname) {
590
- global $wpdb;
591
- if ($shortname == 'hits')
592
- return $wpdb->prefix . "sds_hits";
593
- else
594
- return '';
595
- }
596
-
597
  /**
598
  * Gets the value of a module setting.
599
  *
@@ -650,9 +619,9 @@ class SEO_Ultimate {
650
  * @uses $hit
651
  */
652
  function save_hit() {
653
- global $wpdb;
654
- if (!empty($this->hit) && $this->get_setting('log_hits', true, 'settings') && apply_filters('su_save_hit', false, $this->hit))
655
- $wpdb->insert($this->get_table_name('hits'), $this->hit);
656
  }
657
 
658
  /**
@@ -671,15 +640,10 @@ class SEO_Ultimate {
671
 
672
  //Only log hits from non-logged-in users
673
  if (!is_user_logged_in()) {
674
- global $wpdb;
675
 
676
  //Get the current URL
677
  $url = suurl::current();
678
 
679
- //Have we seen this URL before?
680
- $table = $this->get_table_name('hits');
681
- $is_new = (count($wpdb->get_results($wpdb->prepare("SELECT url FROM $table WHERE url = %s AND is_new = 0", $url))) == 0);
682
-
683
  //Put it all into an array
684
  $data = array(
685
  'time' => time()
@@ -690,7 +654,6 @@ class SEO_Ultimate {
690
  , 'redirect_trigger' => $this->hit_redirect_trigger
691
  , 'referer' => $_SERVER['HTTP_REFERER']
692
  , 'status_code' => $status_code
693
- , 'is_new' => $is_new
694
  );
695
 
696
  //We don't want to overwrite a redirect URL if it's already been logged
@@ -779,7 +742,7 @@ class SEO_Ultimate {
779
  //Show a module on the menu only if it provides a menu title and it doesn't have a parent module
780
  if ($module->get_menu_title() && !$module->get_parent_module()) {
781
 
782
- //If the module is hidden, put the module under a non-existant menu parent
783
  //(this will let the module's admin page be loaded, but it won't show up on the menu)
784
  if ($this->dbdata['modules'][$key] > SU_MODULE_HIDDEN || !count($this->dbdata['modules']))
785
  $parent = $module->get_menu_parent();
@@ -931,31 +894,89 @@ class SEO_Ultimate {
931
  function admin_includes() {
932
 
933
  //Global CSS
934
- echo "\n<link rel='stylesheet' type='text/css' href='".$this->plugin_dir_url."plugin/global.css?v=".SU_VERSION."' />\n";
935
 
936
  //Figure out what plugin admin page we're on
937
  global $plugin_page;
938
  $pp = $this->hook_to_key($plugin_page);
939
 
940
- foreach ($this->modules as $key => $module) {
 
941
 
942
- //Does the current admin page belong to this module?
943
- if (strcmp($key, $pp) == 0) {
944
-
945
- //We're viewing a module page, so print links to the CSS/JavaScript files loaded for all modules
946
- echo "\n<link rel='stylesheet' type='text/css' href='".$this->plugin_dir_url."modules/modules.css?v=".SU_VERSION."' />\n";
947
- echo "\n<script type='text/javascript' src='".$this->plugin_dir_url."modules/modules.js?v=".SU_VERSION."'></script>\n";
948
 
949
- //Print links to the module's CSS and JavaScript.
950
- echo "\n<link rel='stylesheet' type='text/css' href='".$module->module_url."?css=admin&amp;v=".SU_VERSION."' />\n";
951
- echo "\n<script type='text/javascript' src='".$module->module_url."?js=admin&amp;v=".SU_VERSION."'></script>\n";
 
952
 
953
- //The module has been found; mission accomplished.
954
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
955
  }
956
  }
957
  }
958
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
959
  /**
960
  * Replaces WordPress's default contextual help with postmeta help when appropriate.
961
  *
@@ -1059,14 +1080,113 @@ class SEO_Ultimate {
1059
  * @param obejct $r The response object from the WordPress Plugin Directory.
1060
  */
1061
  function plugin_update_info($plugin_data, $r) {
1062
- if ($r && $r->new_version && !is_plugin_active('changelogger/changelogger.php')) {
1063
- $info = suwp::load_webpage("http://www.seodesignsolutions.com/apis/su/update-info/?ov=".urlencode(SU_VERSION)."&nv=".urlencode($r->new_version), SU_USER_AGENT);
1064
- if ($info) {
1065
- $info = strip_tags($info, "<br><a><b><i><span>");
1066
- $info = str_replace('backup your database', '<a href="'.suwp::get_backup_url().'">backup your database</a>', $info);
1067
  echo "<span class='su-plugin-update-info'><br />$info</span>";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1068
  }
1069
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1070
  }
1071
 
1072
  /**
80
  */
81
  var $plugin_dir_url;
82
 
83
+ /**
84
+ * The plugin file relative to the /wp-content/plugins/ directory.
85
+ * Should be "seo-ultimate/seo-ultimate.php"
86
+ *
87
+ * @since 2.1
88
+ */
89
+ var $plugin_basename = '';
90
+
91
  /**
92
  * The array to be inserted into the hits table.
93
  *
141
  $this->upgrade_to_08();
142
 
143
  //Save
 
144
  add_action('shutdown', array(&$this, 'save_hit'));
145
+ add_action('shutdown', array(&$this, 'save_dbdata'));
146
 
147
  /********** CLASS CONSTRUCTION **********/
148
 
189
  //If we're deactivating the plugin, then call the deactivation function
190
  register_deactivation_hook($this->plugin_file_path, array(&$this, 'deactivate'));
191
 
 
 
 
192
 
193
  /********** ACTION & FILTER HOOKS **********/
194
 
198
  //Hook to output all <head> code
199
  add_action('wp_head', array(&$this, 'template_head'), 1);
200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  //Log this visitor!
202
  if ($this->get_setting('log_hits', true, 'settings')) {
203
  add_filter('redirect_canonical', array(&$this, 'log_redirect_canonical'));
204
  add_filter('wp_redirect', array(&$this, 'log_redirect'), 10, 2);
205
  add_filter('status_header', array(&$this, 'log_hit'), 10, 2);
206
  }
207
+
208
+ //Admin-only hooks
209
+ if (is_admin()) {
210
+
211
+ //Hook to include JavaScript and CSS
212
+ add_action('admin_enqueue_scripts', array(&$this, 'admin_includes'));
213
+
214
+ //Hook to add plugin notice actions
215
+ add_action('admin_head', array(&$this, 'plugin_page_notices'));
216
+
217
+ //Hook to remove other plugins' notices from our admin pages
218
+ add_action('admin_head', array(&$this, 'remove_admin_notices'));
219
+
220
+ if (!get_option('blog_public')) {
221
+ //Add admin-wide notice
222
+ add_action('admin_notices', array(&$this, 'private_blog_admin_notice'));
223
+
224
+ //Remove duplicate Robots Meta notice
225
+ suwp::remove_instance_action('admin_footer', 'RobotsMeta_Admin', 'blog_public_warning');
226
+ }
227
+
228
+ //When loading the admin menu, call on our menu constructor function.
229
+ //For future-proofing purposes, we specifically state the default priority of 10,
230
+ //since some modules set a priority of 9 with the specific intention of running
231
+ //before this main plugin's hook.
232
+ add_action('admin_menu', array(&$this, 'add_menus'), 10);
233
+
234
+ //Hook to customize contextual help
235
+ add_filter('contextual_help', array(&$this, 'admin_help'), 10, 2);
236
+
237
+ //Postmeta box hooks
238
+ add_action('admin_menu', array(&$this, 'add_postmeta_box'));
239
+ add_action('save_post', array(&$this, 'save_postmeta_box'), 10, 2);
240
+
241
+ //Display info on new versions
242
+ add_action("in_plugin_update_message-{$this->plugin_basename}", array(&$this, 'plugin_update_info'), 10, 2);
243
+ add_filter('transient_update_plugins', array(&$this, 'add_plugin_upgrade_notice'));
244
+
245
+ //Add plugin action links
246
+ add_filter("plugin_action_links_{$this->plugin_basename}", array(&$this, 'plugin_action_links'));
247
+
248
+ //Add module links to plugin listing
249
+ add_filter('plugin_row_meta', array(&$this, 'plugin_row_meta_filter'), 10, 2);
250
+ }
251
  }
252
 
253
  /**
271
  */
272
  function install() {
273
 
 
 
 
274
  //Load settings file if present
275
  if (!isset($this->dbdata['settings']) && is_readable($settingsfile = $this->plugin_dir_path.'settings.txt')) {
276
  $import = base64_decode(file_get_contents($settingsfile));
286
  * @param string $oldversion The version that was last installed.
287
  */
288
  function upgrade($oldversion) {
289
+ define('SU_UPGRADE', true);
 
 
290
  }
291
 
292
  /**
359
 
360
  //Stop the database data from being re-saved
361
  remove_action('shutdown', array(&$this, 'save_dbdata'));
 
 
 
362
  }
363
 
364
 
378
  function load_plugin_data($plugin_path) {
379
 
380
  //Load plugin path/URL information
381
+ $this->plugin_basename = plugin_basename($plugin_path);
382
+ $this->plugin_dir_path = trailingslashit(dirname(trailingslashit(WP_PLUGIN_DIR).$this->plugin_basename));
383
+ $this->plugin_file_path = trailingslashit(WP_PLUGIN_DIR).$this->plugin_basename;
384
+ $this->plugin_dir_url = trailingslashit(plugins_url(dirname($this->plugin_basename)));
385
+ $this->plugin_file_url = trailingslashit(plugins_url($this->plugin_basename));
386
  }
387
 
388
  /**
465
  $this->modules[$module]->module_key = $module;
466
 
467
  //Tell the module what its URL is
468
+ $this->modules[$module]->module_dir_rel_url = $mdirrelurl = "modules/$folder/";
469
+ $this->modules[$module]->module_rel_url = $mdirrelurl . $file;
470
+ $this->modules[$module]->module_dir_url = $mdirurl = $this->plugin_dir_url . $mdirrelurl;
471
  $this->modules[$module]->module_url = $mdirurl . $file;
472
 
473
  /*
518
  $this->remove_cron_jobs();
519
 
520
  //Tell the modules what their plugin page hooks are
521
+ foreach ($this->modules as $key => $module)
522
  $this->modules[$key]->plugin_page_hook =
523
+ $this->modules[$key]->get_menu_parent_hook().'_page_'.$this->key_to_hook($this->modules[$key]->get_module_or_parent_key());
524
 
525
  if (!$this->module_exists($this->default_menu_module)) {
526
  foreach ($this->modules as $key => $module) {
555
 
556
  //Only run init tasks after all other init functions are completed for all modules
557
  foreach ($this->modules as $key => $module) {
558
+ if (count($this->modules[$key]->get_children_admin_page_tabs()))
559
+ $this->modules[$key]->admin_page_tabs_init();
560
+ if (defined('SU_UPGRADE'))
561
+ $this->modules[$key]->upgrade();
562
  $this->modules[$key]->init();
563
  }
564
  }
565
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
566
  /**
567
  * Gets the value of a module setting.
568
  *
619
  * @uses $hit
620
  */
621
  function save_hit() {
622
+
623
+ if (!empty($this->hit) && $this->get_setting('log_hits', true, 'settings'))
624
+ do_action('su_save_hit', $this->hit);
625
  }
626
 
627
  /**
640
 
641
  //Only log hits from non-logged-in users
642
  if (!is_user_logged_in()) {
 
643
 
644
  //Get the current URL
645
  $url = suurl::current();
646
 
 
 
 
 
647
  //Put it all into an array
648
  $data = array(
649
  'time' => time()
654
  , 'redirect_trigger' => $this->hit_redirect_trigger
655
  , 'referer' => $_SERVER['HTTP_REFERER']
656
  , 'status_code' => $status_code
 
657
  );
658
 
659
  //We don't want to overwrite a redirect URL if it's already been logged
742
  //Show a module on the menu only if it provides a menu title and it doesn't have a parent module
743
  if ($module->get_menu_title() && !$module->get_parent_module()) {
744
 
745
+ //If the module is hidden, put the module under a non-existent menu parent
746
  //(this will let the module's admin page be loaded, but it won't show up on the menu)
747
  if ($this->dbdata['modules'][$key] > SU_MODULE_HIDDEN || !count($this->dbdata['modules']))
748
  $parent = $module->get_menu_parent();
894
  function admin_includes() {
895
 
896
  //Global CSS
897
+ $this->queue_css('plugin', 'global');
898
 
899
  //Figure out what plugin admin page we're on
900
  global $plugin_page;
901
  $pp = $this->hook_to_key($plugin_page);
902
 
903
+ if (strlen($pp)) {
904
+ $outputted_module_files = false;
905
 
906
+ foreach ($this->modules as $key => $module) {
 
 
 
 
 
907
 
908
+ //Does the current admin page belong to this module?
909
+ if (strcmp($key, $pp) == 0)
910
+ //Output AJAX page var fix
911
+ echo "\n<script type='text/javascript'>pagenow = '".su_esc_attr($module->plugin_page_hook)."';</script>\n";
912
 
913
+ //Does the current admin page belong to this module or its parent?
914
+ if (strcmp($key, $pp) == 0 || strcmp($module->get_parent_module(), $pp) == 0) {
915
+
916
+ //We're viewing a module page, so print links to the CSS/JavaScript files loaded for all modules
917
+ if (!$outputted_module_files) {
918
+ $this->queue_css('modules', 'modules');
919
+ $this->queue_js ('modules', 'modules');
920
+ $outputted_module_files = true;
921
+ }
922
+
923
+ //Print links to the module's CSS and JavaScript.
924
+ $this->queue_css($module->module_dir_rel_url, $module->get_module_key());
925
+ $this->queue_js ($module->module_dir_rel_url, $module->get_module_key());
926
+
927
+ //Queue up the module's columns, if any
928
+ if (count($columns = $module->get_admin_table_columns()))
929
+ register_column_headers($module->plugin_page_hook, $columns);
930
+ }
931
  }
932
  }
933
  }
934
 
935
+ /**
936
+ * Output an HTML <link> to a CSS file if the CSS file exists.
937
+ * Includes a version-based query string parameter to prevent caching old versions.
938
+ *
939
+ * @since 2.1
940
+ * @uses $plugin_dir_path
941
+ * @uses $plugin_dir_url
942
+ * @uses SU_VERSION
943
+ *
944
+ * @param string $relurl The URL to the CSS file, relative to the plugin directory.
945
+ */
946
+ function queue_css($reldir, $filename) {
947
+ $this->queue_file($reldir, $filename, '.css', 'wp_enqueue_style');
948
+ }
949
+
950
+ /**
951
+ * Output an HTML <script> tag if the corresponding JavaScript file exists.
952
+ * Includes a version-based query string parameter to prevent caching old versions.
953
+ *
954
+ * @since 2.1
955
+ * @uses $plugin_dir_path
956
+ * @uses $plugin_dir_url
957
+ * @uses SU_VERSION
958
+ *
959
+ * @param string $relurl The URL to the JavaScript file, relative to the plugin directory.
960
+ */
961
+ function queue_js($reldir, $filename) {
962
+ $this->queue_file($reldir, $filename, '.js', 'wp_enqueue_script');
963
+ }
964
+
965
+ /**
966
+ * Queues a CSS/JS file with WordPress if the file exists.
967
+ *
968
+ * @since 2.1
969
+ */
970
+ function queue_file($reldir, $filename, $ext, $func) {
971
+ if (!function_exists($func)) return;
972
+ $reldir = untrailingslashit($reldir);
973
+ $dirid = str_replace('/', '-', $reldir);
974
+ $relurl = $reldir . '/';
975
+ $file = sustr::endwith($filename, $ext);
976
+ if (file_exists($this->plugin_dir_path.$relurl.$file))
977
+ $func("su-$dirid-$filename", $this->plugin_dir_url.$relurl.$file, array(), SU_VERSION);
978
+ }
979
+
980
  /**
981
  * Replaces WordPress's default contextual help with postmeta help when appropriate.
982
  *
1080
  * @param obejct $r The response object from the WordPress Plugin Directory.
1081
  */
1082
  function plugin_update_info($plugin_data, $r) {
1083
+ //If a new version is available...
1084
+ if ($r && $r->new_version && !is_plugin_active('changelogger/changelogger.php'))
1085
+ //If info on the new version is available...
1086
+ if ($info = $this->get_plugin_update_info($r->new_version))
1087
+ //Output the new-version info
1088
  echo "<span class='su-plugin-update-info'><br />$info</span>";
1089
+ }
1090
+
1091
+ /**
1092
+ * Loads new-version info and returns it as a string.
1093
+ *
1094
+ * @since 2.1
1095
+ *
1096
+ * @return string
1097
+ */
1098
+ function get_plugin_update_info($nv) {
1099
+
1100
+ $info = suwp::load_webpage("http://www.seodesignsolutions.com/apis/su/update-info/?ov=".urlencode(SU_VERSION)."&nv=".urlencode($nv), SU_USER_AGENT);
1101
+ if ($info) {
1102
+ $info = strip_tags($info, "<br><a><b><i><span>");
1103
+ $info = str_replace('backup your database', '<a href="'.suwp::get_backup_url().'">backup your database</a>', $info);
1104
+ return $info;
1105
+ }
1106
+
1107
+ return '';
1108
+ }
1109
+
1110
+ /**
1111
+ * Provides WordPress with SEO Ultimate's custom update info notices.
1112
+ *
1113
+ * @since 2.1
1114
+ */
1115
+ function add_plugin_upgrade_notice($current) {
1116
+ if (isset($current->response[$this->plugin_basename]))
1117
+ if (!strlen($current->response[$this->plugin_basename]->upgrade_notice))
1118
+ $current->response[$this->plugin_basename]->upgrade_notice = $this->get_plugin_update_info($current->response[$this->plugin_basename]->new_version);
1119
+ return $current;
1120
+ }
1121
+
1122
+ /**
1123
+ * Filters the list of plugin action links for SEO Ultimate and adds links to certain modules if those modules are enabled.
1124
+ *
1125
+ * @since 2.1
1126
+ *
1127
+ * @param array $actions The array of <a> links.
1128
+ * @return array The $actions array with additional links.
1129
+ */
1130
+ function plugin_action_links($actions) {
1131
+ $su_actions = array(
1132
+ 'uninstall' => __("Uninstall", 'seo-ultimate')
1133
+ );
1134
+
1135
+ foreach ($su_actions as $module => $anchor) {
1136
+ if ($this->module_exists($module)) {
1137
+ $url = $this->modules[$module]->get_admin_url();
1138
+ $actions[] = "<a href='$url'>$anchor</a>";
1139
  }
1140
  }
1141
+
1142
+ return $actions;
1143
+ }
1144
+
1145
+ /**
1146
+ * Outputs a list of active modules on SEO Ultimate's plugin page listing.
1147
+ *
1148
+ * @since 2.1
1149
+ */
1150
+ function plugin_row_meta_filter($plugin_meta, $plugin_file) {
1151
+ if ($plugin_file == $this->plugin_basename)
1152
+ echo $this->get_module_links_list('<p id="su-active-modules-list">'.__('Active Modules: ', 'seo-ultimate'), ' | ', '</p>');
1153
+
1154
+ return $plugin_meta;
1155
+ }
1156
+
1157
+ /**
1158
+ * Returns a list of links to active, independent modules.
1159
+ *
1160
+ * @since 2.1
1161
+ */
1162
+ function get_module_links_list($before = '', $between = ' | ', $after = '') {
1163
+
1164
+ $list = '';
1165
+
1166
+ if (count($this->modules)) {
1167
+
1168
+ $modules = array();
1169
+ foreach ($this->modules as $key => $x_module) {
1170
+ $module =& $this->modules[$key];
1171
+ if (strcasecmp(get_parent_class($module), 'SU_Module') == 0 && $module->is_independent_module()) {
1172
+ $modules[$module->get_module_title()] = $module->get_admin_url();
1173
+ }
1174
+ }
1175
+
1176
+ ksort($modules);
1177
+
1178
+ $list = $before;
1179
+ $first = true;
1180
+ foreach ($modules as $title => $url) {
1181
+ $url = su_esc_attr($url);
1182
+ $title = str_replace(' ', '&nbsp;', su_esc_html($title));
1183
+ if ($first) $first = false; else $list .= $between;
1184
+ $list .= "<a href='$url'>$title</a>";
1185
+ }
1186
+ $list .= $after;
1187
+ }
1188
+
1189
+ return $list;
1190
  }
1191
 
1192
  /**
plugin/class.su-hitset.php DELETED
@@ -1,112 +0,0 @@
1
- <?php
2
- /**
3
- * A class that stores the results of a query to to the hits table.
4
- *
5
- * @version 1.1.2
6
- */
7
- class SU_HitSet {
8
-
9
- var $result;
10
- var $where;
11
- var $module_key;
12
-
13
- function SU_HitSet($mk, $where = false) {
14
- $this->module_key = $mk;
15
- if ($where) $where = " WHERE $where";
16
- $this->where = $where;
17
- $this->query_db();
18
- }
19
-
20
- function query_db() {
21
- global $wpdb;
22
- $table = SEO_Ultimate::get_table_name('hits');
23
- $this->result = $wpdb->get_results("SELECT * FROM {$table}{$this->where} ORDER BY id DESC", ARRAY_A);
24
- }
25
-
26
- function have_hits() {
27
- return (is_array($this->result) && count($this->result) > 0);
28
- }
29
-
30
- function hits_count() {
31
- return count($this->result);
32
- }
33
-
34
- function admin_table($actions_callback = false, $highlight_new = true) {
35
-
36
- if (!$this->result || !$this->where) return;
37
-
38
- //Initialize variables
39
- global $wpdb;
40
-
41
- $table = SEO_Ultimate::get_table_name('hits');
42
-
43
- $allfields = array(
44
- 'time' => __("Date", 'seo-ultimate')
45
- , 'ip_address' => __("IP Address", 'seo-ultimate')
46
- , 'user_agent' => __("User Agent", 'seo-ultimate')
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();
54
-
55
- foreach ($allfields as $col => $title) {
56
- if (strpos($this->where, " $col=") === false) $fields[$col] = $title;
57
- }
58
-
59
- $fields = apply_filters("su_{$this->module_key}_hits_table_columns", $fields);
60
-
61
- echo "<table class='widefat' cellspacing='0'>\n\t<thead><tr>\n";
62
-
63
- foreach ($fields as $title) {
64
- $class = str_replace(' ', '-', strtolower($title));
65
- echo "\t\t<th scope='col' class='hit-$class'>$title</th>\n";
66
- }
67
-
68
- echo "\t</tr></thead>\n\t<tbody>\n";
69
-
70
- foreach ($this->result as $row) {
71
-
72
- if ($highlight_new && $row['is_new']) $class = ' class="new-hit"'; else $class='';
73
- echo "\t\t<tr$class>\n";
74
-
75
- foreach ($fields as $col => $title) {
76
- $cell = htmlspecialchars($row[$col]);
77
-
78
- switch ($col) {
79
- case 'time':
80
- $date = date_i18n(get_option('date_format'), $cell);
81
- $time = date_i18n(get_option('time_format'), $cell);
82
- $cell = sprintf(__('%1$s<br />%2$s', 'seo-ultimate'), $date, $time);
83
- break;
84
- case 'user_agent':
85
- $text = sustr::truncate($cell, 50);
86
- $ua = su_esc_attr($cell);
87
- $cell = "<abbr title='$ua'>$text</abbr>";
88
- break;
89
- case 'url':
90
- if (is_array($actions_callback)) {
91
- $actions = call_user_func($actions_callback, $row);
92
- $actions = apply_filters("su_{$this->module_key}_hits_table_actions", $actions, $row);
93
- $cell = SU_Module::hover_row($cell, $actions);
94
- }
95
- break;
96
- }
97
-
98
- $cell = apply_filters("su_{$this->module_key}_hits_table_{$col}_cell", $cell, $row);
99
-
100
- $class = str_replace(' ', '-', strtolower($title));
101
- echo "\t\t\t<td class='hit-$class'>$cell</td>\n";
102
- }
103
- echo "\t\t</tr>\n";
104
-
105
- $wpdb->update($table, array('is_new' => 0), array('id' => $row['id']));
106
- }
107
-
108
- echo "\t</tbody>\n</table>\n";
109
- }
110
-
111
- }
112
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
plugin/su-functions.php CHANGED
@@ -102,10 +102,19 @@ function su_esc_attr($str) {
102
  return $str;
103
  }
104
 
 
 
 
 
 
 
 
 
 
105
  /**
106
  * Escapes HTML. Double-encodes existing entities (ideal for editable HTML).
107
  *
108
- * @sincec 1.5
109
  *
110
  * @param string $str The string that potentially contains HTML.
111
  * @return string The filtered string.
@@ -114,21 +123,4 @@ function su_esc_editable_html($str) {
114
  return wp_specialchars($str, ENT_QUOTES, false, true);
115
  }
116
 
117
-
118
- /********** CLASS FUNCTION ALIASES **********/
119
-
120
- /**
121
- * Launches the uninstallation process.
122
- * WordPress will call this when the plugin is uninstalled, as instructed by the register_uninstall_hook() call in {@link SEO_Ultimate::__construct()}.
123
- *
124
- * @since 0.1
125
- * @uses $seo_ultimate
126
- * @uses SEO_Ultimate::uninstall()
127
- */
128
- function su_uninstall() {
129
- global $seo_ultimate;
130
- if (!$seo_ultimate) $seo_ultimate =& new SEO_Ultimate(__FILE__);
131
- $seo_ultimate->uninstall();
132
- }
133
-
134
  ?>
102
  return $str;
103
  }
104
 
105
+ /**
106
+ * Escapes HTML.
107
+ *
108
+ * @since 2.1
109
+ */
110
+ function su_esc_html($str) {
111
+ return wp_specialchars($str); //Yes, this is deprecated... will switch to esc_html later...
112
+ }
113
+
114
  /**
115
  * Escapes HTML. Double-encodes existing entities (ideal for editable HTML).
116
  *
117
+ * @since 1.5
118
  *
119
  * @param string $str The string that potentially contains HTML.
120
  * @return string The filtered string.
123
  return wp_specialchars($str, ENT_QUOTES, false, true);
124
  }
125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  ?>
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
  === SEO Ultimate ===
2
  Contributors: SEO Design Solutions
3
- Tags: seo, google, yahoo, bing, search engines, admin, post, page, modules, title, meta, noindex, canonical, 404, robots.txt, htaccess, slugs, url, anchor, more, link, excerpt, permalink, links, autolinks, categories
4
  Requires at least: 2.8
5
  Tested up to: 2.9
6
- Stable tag: 2.0
7
 
8
  This all-in-one SEO plugin gives you control over titles, noindex, meta data, slugs, canonical tags, "more" links, 404 error tracking, and more.
9
 
@@ -11,9 +11,9 @@ This all-in-one SEO plugin gives you control over titles, noindex, meta data, sl
11
 
12
  = Recent Releases =
13
 
 
14
  * Version 2.0 adds title tag editing for post tags
15
  * Version 1.9 adds title tag editing for categories
16
- * Version 1.8 adds basic auto-linking functionality
17
 
18
  = Features =
19
 
@@ -38,10 +38,11 @@ SEO Ultimate is an all-in-one [SEO](http://www.seodesignsolutions.com/) plugin w
38
  * **Canonicalizer**
39
  * Point search engines to preferred content access points with `<link rel="canonical" />` tags.
40
  * Go beyond the basic canonical tag functionality of WordPress 2.9+ with SEO Ultimate's support for category/tag/date/author archives.
41
- * Redirect requests for non-existant pagination with a simple checkbox.
42
 
43
  * **404 Monitor**
44
  * Improve the visiting experience of users and spiders by keeping tabs on "page not found" errors. (Use a redirection plugin to point dead-end URLs to your content.)
 
45
 
46
  * **Linkbox Inserter**
47
  * Encourage natural linkbuilding activity by adding textboxes to the end of your posts/pages that contain automatically-generated link HTML.
@@ -123,7 +124,7 @@ To install the plugin manually:
123
 
124
  = Overview =
125
 
126
- * **What it does:** 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.
127
 
128
  * **Why it helps:** The 404 Monitor helps you spot 404 errors; then you can take steps to correct them to reduce link-juice loss from broken links.
129
 
@@ -131,22 +132,21 @@ To install the plugin manually:
131
 
132
  If there are no 404 errors in the log, this is good and means there's no action required on your part.
133
 
134
- = Options =
135
 
136
- On the 404 Monitor page, hover over a table row to access these options:
137
 
138
- * The "View" link will open the URL in a new window. This is useful for testing whether or not a redirect is working.
139
- * The "Google Cache" link will open Google'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.
140
- * Once you've taken care of a 404 error, you can click the "Delete Log Entry" link to remove it from the list. The URL will reappear on the list if it triggers a 404 error in the future.
141
 
142
  = Troubleshooting =
143
 
144
  404 Monitor doesn't appear to work? Take these notes into consideration:
145
 
146
- * Visitor logging must be enabled under `Settings > SEO Ultimate`. (It's enabled by default.)
147
  * In order for the 404 Monitor to track 404 errors, you must have "Pretty Permalinks" enabled under `Settings > Permalinks`.
148
  * Some parts of your website may not be under WordPress's control; the 404 Monitor can't track 404 errors on non-WordPress website areas.
149
- * The 404 Monitor doesn't record 404 errors generated by logged-in users.
150
 
151
 
152
 
@@ -177,7 +177,7 @@ On the 404 Monitor page, hover over a table row to access these options:
177
  * The incoming links profile of competing websites.
178
  * The external websites that your competitors are linking to.
179
 
180
- * **Why it helps:** The Competition Researcher gives you quick access to specially-constructed search queries. You can study the search results to glean information about the general competition for specific keywords or information about specific competitors' websites. A knowledge of the competition is an essential component of any SEO strategy.
181
 
182
  * **How to use it:** Choose a tool based on the information you'd like to obtain, enter the keywords or competitors' domain names that you'd like to research, select options if desired, and then click Submit. The results will open in a new window.
183
 
@@ -336,7 +336,7 @@ The Module Manager lets you customize the visibility and accessibility of each m
336
 
337
  * **Why it helps:** On the typical WordPress setup, the "more link" always has the same anchor text (e.g. "Read more of this entry"). Since internal anchor text conveys web page topicality to search engines, the "read more" phrase isn't a desirable anchor phrase. More Link Customizer lets you replace the boilerplate text with a new anchor that, by default, integrates your post titles (which will ideally be keyword-oriented).
338
 
339
- * **How to use it:** On this page you can set the anchor text you'd like to use by default. The `{post}` variable will be replaced with the post's title. HTML and encoded entities are supported. If instead you decide that you'd like to use the default anchor text specified by your currently-active theme, just erase the contents of the textbox. The anchor text can be overriden on a per-post basis via the "More Link Text" box in the "SEO Settings" section of the WordPress post editor.
340
 
341
  = FAQ =
342
 
@@ -506,17 +506,15 @@ Here's information on each of the settings and its supported variables:
506
 
507
  The Settings module lets you manage settings related to the SEO Ultimate plugin as a whole.
508
 
509
- = Settings =
510
 
511
  Here's information on some of the settings:
512
 
513
- * **Enable attribution link** -- If enabled, the plugin will display an attribution link on your site. We ask that you please leave this enabled.
514
-
515
- * **Insert comments around HTML code insertions** -- If enabled, SEO Ultimate will use HTML comments to identify all code it inserts into your `<head>` tag. This is useful if you&#8217;re trying to figure out whether or not SEO Ultimate is inserting a certain piece of header code.
516
 
517
- * **Allow modules to save visitor information to the database** -- This allows enabled modules to record information about the people or robots that visit your website. This information is stored in your WordPress database. This setting must be enabled in order for modules like the 404 Monitor to function.
518
 
519
- * **Delete logged visitor information after ___ days** -- If enabled, SEO Ultimate will delete visitor information once it has been stored for more than a specified number of days. (The default value is 30.) Enable this setting if the visitor-logging functionality is making your database size unmanageable. Please note that as soon as you enable this and click the Save button, your old visitor information will be irreversably purged accordingly.
520
 
521
  = FAQ =
522
 
@@ -536,16 +534,12 @@ Here's information on some of the settings:
536
  SEO Ultimate's documentation is built into the plugin itself. Whenever you're viewing an SEO Ultimate page in your WordPress admin, you can click the "Help" tab in the upper-right-hand corner to view documentation for the area you're viewing.
537
 
538
  * **How do I uninstall SEO Ultimate?**
539
- 1. Go to the `Plugins` admin page.
540
- 2. Deactivate the plugin if it's activated.
541
- 3. Click the plugin's "Delete" link.
542
- 4. Click the "Yes, Delete these files" button. SEO Ultimate's files and database entries will be deleted.
543
 
544
  * **Will all my settings be deleted if I delete SEO Ultimate in the Plugins manager?**
545
- Yes. WordPress plugins are supposed to delete their settings during the uninstallation process.
546
-
547
- * **How do I remove the attribution link?**
548
- 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`.
549
 
550
  * **Where is the Plugin Settings page?**
551
  The plugin settings page is located under `Settings > SEO Ultimate`.
@@ -570,17 +564,45 @@ Frequently asked questions, documentation, and troubleshooting tips for SEO Ulti
570
 
571
  == Screenshots ==
572
 
573
- 1. The Title Rewriter module
574
- 2. The Noindex Manager module
575
- 3. The Meta Editor module
576
- 4. The "SEO Settings" post/page meta box
577
- 5. The Linkbox Inserter module
578
- 6. The File Editor module
579
-
 
 
 
 
 
 
 
 
580
 
581
 
582
  == Changelog ==
583
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
584
  = Version 2.0 (April 29, 2010) =
585
  * Feature: Title Rewriter can now edit the title tags of post tag archives
586
 
@@ -608,7 +630,7 @@ Frequently asked questions, documentation, and troubleshooting tips for SEO Ulti
608
  = Version 1.7.1 (February 27, 2010) =
609
  * Bugfix: Fixed conflict with Flexibility theme
610
  * Bugfix: Comment administration no longer alters SEO Ultimate menu bubble counters
611
- * Bugfix: SEO Ultimate menu icon is no longer accidentially added to other plugins' menus
612
  * Bugfix: Disabling visitor logging now disables all related code as well
613
  * Bugfix: Module Manager: Fixed invalid HTML IDs
614
  * Bugfix: Module Manager: Module titles are now consistent between enabled and disabled states
1
  === SEO Ultimate ===
2
  Contributors: SEO Design Solutions
3
+ Tags: seo, google, yahoo, bing, search engines, admin, post, page, modules, title, meta, noindex, canonical, 404, robots.txt, htaccess, slugs, url, anchor, more, link, excerpt, permalink, links, autolinks, categories, uninstallable
4
  Requires at least: 2.8
5
  Tested up to: 2.9
6
+ Stable tag: 2.1
7
 
8
  This all-in-one SEO plugin gives you control over titles, noindex, meta data, slugs, canonical tags, "more" links, 404 error tracking, and more.
9
 
11
 
12
  = Recent Releases =
13
 
14
+ * Version 2.1 adds many 404 Monitor improvements
15
  * Version 2.0 adds title tag editing for post tags
16
  * Version 1.9 adds title tag editing for categories
 
17
 
18
  = Features =
19
 
38
  * **Canonicalizer**
39
  * Point search engines to preferred content access points with `<link rel="canonical" />` tags.
40
  * Go beyond the basic canonical tag functionality of WordPress 2.9+ with SEO Ultimate's support for category/tag/date/author archives.
41
+ * Redirect requests for non-existent pagination with a simple checkbox.
42
 
43
  * **404 Monitor**
44
  * Improve the visiting experience of users and spiders by keeping tabs on "page not found" errors. (Use a redirection plugin to point dead-end URLs to your content.)
45
+ * Find out what URLs are referring visitors to 404 errors.
46
 
47
  * **Linkbox Inserter**
48
  * Encourage natural linkbuilding activity by adding textboxes to the end of your posts/pages that contain automatically-generated link HTML.
124
 
125
  = Overview =
126
 
127
+ * **What it does:** The 404 Monitor keeps track of non-existent 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.
128
 
129
  * **Why it helps:** The 404 Monitor helps you spot 404 errors; then you can take steps to correct them to reduce link-juice loss from broken links.
130
 
132
 
133
  If there are no 404 errors in the log, this is good and means there's no action required on your part.
134
 
135
+ = Actions Help =
136
 
137
+ You can perform the following actions on each entry in the log:
138
 
139
+ * The "View" button will open the URL in a new window. This is useful for testing whether or not a redirect is working.
140
+ * The "Google Cache" button will open Google'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.
141
+ * Once you've taken care of a 404 error, you can click the "Remove" button to remove it from the list. The URL will reappear on the list if it triggers a 404 error in the future.
142
 
143
  = Troubleshooting =
144
 
145
  404 Monitor doesn't appear to work? Take these notes into consideration:
146
 
147
+ * The 404 Monitor doesn't record 404 errors generated by logged-in users.
148
  * In order for the 404 Monitor to track 404 errors, you must have "Pretty Permalinks" enabled under `Settings > Permalinks`.
149
  * Some parts of your website may not be under WordPress's control; the 404 Monitor can't track 404 errors on non-WordPress website areas.
 
150
 
151
 
152
 
177
  * The incoming links profile of competing websites.
178
  * The external websites that your competitors are linking to.
179
 
180
+ * **Why it helps:** The Competition Researcher gives you quick access to specially-constructed search queries. You can study the search results to glean information about the general competition for specific keywords or information about specific competitors' websites. Knowledge of the competition is an essential component of any SEO strategy.
181
 
182
  * **How to use it:** Choose a tool based on the information you'd like to obtain, enter the keywords or competitors' domain names that you'd like to research, select options if desired, and then click Submit. The results will open in a new window.
183
 
336
 
337
  * **Why it helps:** On the typical WordPress setup, the "more link" always has the same anchor text (e.g. "Read more of this entry"). Since internal anchor text conveys web page topicality to search engines, the "read more" phrase isn't a desirable anchor phrase. More Link Customizer lets you replace the boilerplate text with a new anchor that, by default, integrates your post titles (which will ideally be keyword-oriented).
338
 
339
+ * **How to use it:** On this page you can set the anchor text you'd like to use by default. The `{post}` variable will be replaced with the post's title. HTML and encoded entities are supported. If instead you decide that you'd like to use the default anchor text specified by your currently-active theme, just erase the contents of the textbox. The anchor text can be overridden on a per-post basis via the "More Link Text" box in the "SEO Settings" section of the WordPress post editor.
340
 
341
  = FAQ =
342
 
506
 
507
  The Settings module lets you manage settings related to the SEO Ultimate plugin as a whole.
508
 
509
+ = Global Settings Help =
510
 
511
  Here's information on some of the settings:
512
 
513
+ * **Enable nofollow'd attribution link** -- If enabled, the plugin will display an attribution link on your site.
 
 
514
 
515
+ * **Notify me about unnecessary active plugins** -- If enabled, SEO Ultimate will add notices to your "Plugins" administration page if you have any other plugins installed whose functionality SEO Ultimate replaces.
516
 
517
+ * **Insert comments around HTML code insertions** -- If enabled, SEO Ultimate will use HTML comments to identify all code it inserts into your `<head>` tag. This is useful if you&#8217;re trying to figure out whether or not SEO Ultimate is inserting a certain piece of header code.
518
 
519
  = FAQ =
520
 
534
  SEO Ultimate's documentation is built into the plugin itself. Whenever you're viewing an SEO Ultimate page in your WordPress admin, you can click the "Help" tab in the upper-right-hand corner to view documentation for the area you're viewing.
535
 
536
  * **How do I uninstall SEO Ultimate?**
537
+ 1. Go to the `Settings > SEO Ultimate` admin page.
538
+ 2. Click the "Uninstall" tab.
539
+ 3. Click the "Uninstall" button and click "Yes" to confirm. SEO Ultimate's files and database entries will be deleted.
 
540
 
541
  * **Will all my settings be deleted if I delete SEO Ultimate in the Plugins manager?**
542
+ No. Your settings will be retained unless you uninstall SEO Ultimate under `Settings > SEO Ultimate > Uninstall`.
 
 
 
543
 
544
  * **Where is the Plugin Settings page?**
545
  The plugin settings page is located under `Settings > SEO Ultimate`.
564
 
565
  == Screenshots ==
566
 
567
+ 1. The Module Manager lets you enable/disable SEO Ultimate features
568
+ 2. The 404 Monitor log with "Screen Options" dropdown visible
569
+ 3. The Canonicalizer module helps avoid duplicate content issues
570
+ 4. The Competition Researcher module
571
+ 5. The Deeplink Juggernaut module
572
+ 6. The File Editor module lets you edit your robots.txt and .htaccess files
573
+ 7. The Internal Relevance Researcher module
574
+ 8. The Linkbox Inserter module encourages natural linkbuilding activity
575
+ 9. The Meta Editor module
576
+ 10. The Noindex Manager module
577
+ 11. The "Default Formats" tab of the Title Rewriter module
578
+ 12. The "Pages" tab of the Title Rewriter module lets you edit Pages' <title> tags
579
+ 13. The "Categories" tab of the Title Rewriter module lets you edit categories' <title> tags
580
+ 14. The "SEO Settings" box, which is visible on post & page editors
581
+ 15. The SEO Ultimate menu
582
 
583
 
584
  == Changelog ==
585
 
586
+ = Version 2.1 (May 18, 2010) =
587
+ * Improvement: Major 404 Monitor upgrade, featuring a new space-saving interface redesign
588
+ * Improvement: 404 Monitor now stores its 404 log in wp_options instead of its own database table
589
+ * Improvement: 404 Monitor now ignores apple-touch-icon.png 404s
590
+ * Improvement: Plugin now silently ignores a missing readme.txt instead of giving error
591
+ * Improvement: CSS and JavaScript now exist in separate, static files instead of being outputted by PHP files
592
+ * Improvement: SEO Ultimate settings now remain when plugin files are deleted; settings can now be deleted through new "Uninstall" function under `Settings > SEO Ultimate > Uninstall`
593
+ * Improvement: Database usage for the Whitepapers module reduced more than 90%
594
+ * Improvement: Users can now tab from a post's HTML editor directly into the "SEO Settings" fields
595
+ * Improvement: Removed blank admin CSS/JS file references
596
+ * Improvement: Added list of active modules to SEO Ultimate's plugin page listing
597
+ * Improvement: Added an "Uninstall" link to SEO Ultimate's plugin page listing
598
+ * Improvement: Update info notices now also visible under `Tools > Upgrade`
599
+ * Improvement: Added some missing documentation
600
+ * Improvement: Added/updated screenshots
601
+ * Improvement: Removed unused code
602
+ * Improvement: Added blank index.php files to module directories to prevent indexing/snooping of directory listings
603
+ * Feature: You can now hide 404 Monitor columns with the new "Screen Options" dropdown
604
+ * Bugfix: Removed duplicate excerpt ellipses from Whitepapers module
605
+
606
  = Version 2.0 (April 29, 2010) =
607
  * Feature: Title Rewriter can now edit the title tags of post tag archives
608
 
630
  = Version 1.7.1 (February 27, 2010) =
631
  * Bugfix: Fixed conflict with Flexibility theme
632
  * Bugfix: Comment administration no longer alters SEO Ultimate menu bubble counters
633
+ * Bugfix: SEO Ultimate menu icon is no longer accidentally added to other plugins' menus
634
  * Bugfix: Disabling visitor logging now disables all related code as well
635
  * Bugfix: Module Manager: Fixed invalid HTML IDs
636
  * Bugfix: Module Manager: Module titles are now consistent between enabled and disabled states
screenshot-1.png CHANGED
Binary file
screenshot-10.png ADDED
Binary file
screenshot-11.png ADDED
Binary file
screenshot-12.png ADDED
Binary file
screenshot-13.png ADDED
Binary file
screenshot-14.png ADDED
Binary file
screenshot-15.png ADDED
Binary file
screenshot-2.png CHANGED
Binary file
screenshot-3.png CHANGED
Binary file
screenshot-4.png CHANGED
Binary file
screenshot-5.png CHANGED
Binary file
screenshot-6.png CHANGED
Binary file
screenshot-7.png ADDED
Binary file
screenshot-8.png ADDED
Binary file
screenshot-9.png ADDED
Binary file
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 gives you control over titles, noindex, meta data, slugs, canonical tags, "more" links, 404 error tracking, and more.
6
- Version: 2.0
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 2.0
16
  * @link http://www.seodesignsolutions.com/wordpress-seo/ SEO Ultimate Homepage
17
  */
18
 
@@ -38,10 +38,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
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", "2.0");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
- define("SU_USER_AGENT", "SeoUltimate/2.0");
45
 
46
  /********** INCLUDES **********/
47
 
@@ -55,7 +55,6 @@ if (!class_exists('Markdown'))
55
  include 'plugin/su-constants.php';
56
  include 'plugin/su-functions.php';
57
  include 'plugin/class.seo-ultimate.php';
58
- include 'plugin/class.su-hitset.php';
59
 
60
  //Module files
61
  include 'modules/class.su-module.php';
3
  Plugin Name: SEO Ultimate
4
  Plugin URI: http://www.seodesignsolutions.com/wordpress-seo/
5
  Description: This all-in-one SEO plugin gives you control over titles, noindex, meta data, slugs, canonical tags, "more" links, 404 error tracking, and more.
6
+ Version: 2.1
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 2.1
16
  * @link http://www.seodesignsolutions.com/wordpress-seo/ SEO Ultimate Homepage
17
  */
18
 
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", "2.1");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
+ define("SU_USER_AGENT", "SeoUltimate/2.1");
45
 
46
  /********** INCLUDES **********/
47
 
55
  include 'plugin/su-constants.php';
56
  include 'plugin/su-functions.php';
57
  include 'plugin/class.seo-ultimate.php';
 
58
 
59
  //Module files
60
  include 'modules/class.su-module.php';
seo-ultimate.pot CHANGED
@@ -1,4 +1,4 @@
1
- # Translation of the WordPress plugin SEO Ultimate 1.9 by SEO Design Solutions.
2
  # Copyright (C) 2010 SEO Design Solutions
3
  # This file is distributed under the same license as the SEO Ultimate package.
4
  # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
@@ -6,9 +6,9 @@
6
  #, fuzzy
7
  msgid ""
8
  msgstr ""
9
- "Project-Id-Version: SEO Ultimate 1.9\n"
10
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
11
- "POT-Creation-Date: 2010-04-03 13:03+0000\n"
12
  "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,420 +17,432 @@ msgstr ""
17
  "Content-Transfer-Encoding: 8bit\n"
18
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
 
20
- #: includes/jlfunctions/str.php:74 plugin/su-functions.php:77
21
  #, php-format
22
  msgid "%s and %s"
23
  msgstr ""
24
 
25
- #: includes/jlfunctions/str.php:77 plugin/su-functions.php:80
26
  msgid ", "
27
  msgstr ""
28
 
29
- #: includes/jlfunctions/str.php:78 plugin/su-functions.php:81
30
  #, php-format
31
  msgid "%s, and %s"
32
  msgstr ""
33
 
34
- #: modules/404s/404s.php:29
35
- msgid "404 Monitor"
36
  msgstr ""
37
 
38
- #: modules/404s/404s.php:48
39
- #, php-format
40
- msgid ""
41
- "Please note that new 404 errors will not be recorded, since visitor logging "
42
- "is disabled in the %s."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  msgstr ""
44
 
45
- #: modules/404s/404s.php:49
46
- msgid "Plugin Settings module"
 
 
47
  msgstr ""
48
 
49
- #: modules/404s/404s.php:56
50
  msgid "The log entry was successfully deleted."
51
  msgstr ""
52
 
53
- #: modules/404s/404s.php:58
54
  msgid "This log entry has already been deleted."
55
  msgstr ""
56
 
57
- #: modules/404s/404s.php:67
58
  msgid "The log was successfully cleared."
59
  msgstr ""
60
 
61
- #: modules/404s/404s.php:75
62
  msgid "No 404 errors in the log."
63
  msgstr ""
64
 
65
- #: modules/404s/404s.php:86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  msgid "Are you sure you want to delete all 404 log entries?"
67
  msgstr ""
68
 
69
- #: modules/404s/404s.php:88
70
  msgid "Clear Log"
71
  msgstr ""
72
 
73
- #: modules/404s/404s.php:101
74
- msgid "Open"
75
  msgstr ""
76
 
77
- #: modules/404s/404s.php:102
78
- msgid "Google Cache"
79
  msgstr ""
80
 
81
- #: modules/404s/404s.php:103
82
- msgid "Delete Log Entry"
83
  msgstr ""
84
 
85
- #: modules/autolinks/autolinks.php:13
 
 
 
 
86
  msgid "Deeplink Juggernaut"
87
  msgstr ""
88
 
89
- #: modules/autolinks/autolinks.php:14
90
  msgid "Deeplink Juggernaut (Beta)"
91
  msgstr ""
92
 
93
- #: modules/autolinks/autolinks.php:47
94
  msgid ""
95
  "The Deeplink Juggernaut can automatically link post/page anchor text to "
96
  "given URLs. This is a preview beta version. More functionality will be added "
97
  "in future releases of SEO Ultimate."
98
  msgstr ""
99
 
100
- #: modules/autolinks/autolinks.php:68
101
  msgid "Anchor Text"
102
  msgstr ""
103
 
104
- #: modules/autolinks/autolinks.php:69
105
  msgid "URL"
106
  msgstr ""
107
 
108
- #: modules/canonical/canonical.php:13
109
  msgid "Canonicalizer"
110
  msgstr ""
111
 
112
- #: modules/canonical/canonical.php:34
113
  msgid "Generate <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags."
114
  msgstr ""
115
 
116
- #: modules/canonical/canonical.php:35
117
  msgid "Redirect requests for nonexistent pagination."
118
  msgstr ""
119
 
120
- #: modules/class.su-importmodule.php:37
121
  msgid "Import Now"
122
  msgstr ""
123
 
124
- #: modules/class.su-importmodule.php:40
125
  #, php-format
126
  msgid ""
127
  "The import cannot be undone. It is your responsibility to <a href=\"%s\" "
128
  "target=\"_blank\">backup your database</a> before proceeding!"
129
  msgstr ""
130
 
131
- #: modules/class.su-importmodule.php:50
132
  msgid "Import complete."
133
  msgstr ""
134
 
135
- #: modules/class.su-importmodule.php:57
136
  msgid "Return to import page"
137
  msgstr ""
138
 
139
- #: modules/class.su-importmodule.php:60
140
  msgid "Return to settings page"
141
  msgstr ""
142
 
143
- #: modules/class.su-importmodule.php:63
144
  msgid "Return to SEO page"
145
  msgstr ""
146
 
147
- #: modules/class.su-module.php:320
148
  msgid ""
149
  "(Note: This translated documentation was designed for an older version of "
150
  "SEO Ultimate and may be outdated.)"
151
  msgstr ""
152
 
153
- #: modules/class.su-module.php:851
154
  #, php-format
155
  msgid "%s %s|Dropdown Title"
156
  msgstr ""
157
 
158
- #: modules/class.su-module.php:879
159
  #, php-format
160
  msgid "%1$s | %2$s %3$s by %4$s"
161
  msgstr ""
162
 
163
- #: modules/class.su-module.php:913
164
  msgid "Settings updated."
165
  msgstr ""
166
 
167
- #: modules/class.su-module.php:933
168
  msgid "Save Changes"
169
  msgstr ""
170
 
171
- #: modules/class.su-module.php:1201
172
  msgid ""
173
  "Are you sure you want to replace the textbox contents with this default "
174
  "value?"
175
  msgstr ""
176
 
177
- #: modules/class.su-module.php:1216
178
  msgid "Reset"
179
  msgstr ""
180
 
181
- #: modules/competition-queries/competition-queries.php:13
182
  msgid "Competition Researcher"
183
  msgstr ""
184
 
185
- #: modules/competition-queries/competition-queries.php:14
186
  msgid "Comp. Researcher"
187
  msgstr ""
188
 
189
- #: modules/competition-queries/competition-queries.php:18
190
  msgid ""
191
  "The Competition Researcher provides you with easy access to various search "
192
  "engine tools which you can use to research multiple search queries or URLs."
193
  msgstr ""
194
 
195
- #: modules/competition-queries/competition-queries.php:22
196
  msgid "Step 1: Choose Your Research Tool"
197
  msgstr ""
198
 
199
- #: modules/competition-queries/competition-queries.php:26
200
  msgid "Keywords"
201
  msgstr ""
202
 
203
- #: modules/competition-queries/competition-queries.php:26
204
  msgid "Normal Search"
205
  msgstr ""
206
 
207
- #: modules/competition-queries/competition-queries.php:26
208
  msgid "Find out how many pages contain the words in each query"
209
  msgstr ""
210
 
211
- #: modules/competition-queries/competition-queries.php:27
212
  msgid "Phrase Match"
213
  msgstr ""
214
 
215
- #: modules/competition-queries/competition-queries.php:27
216
  msgid ""
217
  "Find out how many &#8220;actual&#8221; pages are competing for each query"
218
  msgstr ""
219
 
220
- #: modules/competition-queries/competition-queries.php:28
221
  msgid "Allinanchor"
222
  msgstr ""
223
 
224
- #: modules/competition-queries/competition-queries.php:28
225
  msgid "Find out which sites have the most links for each query"
226
  msgstr ""
227
 
228
- #: modules/competition-queries/competition-queries.php:29
229
  msgid "Allintitle"
230
  msgstr ""
231
 
232
- #: modules/competition-queries/competition-queries.php:29
233
  msgid ""
234
  "Find out which sites have the highest relevance in the title for each query"
235
  msgstr ""
236
 
237
- #: modules/competition-queries/competition-queries.php:30
238
  msgid "Allintext"
239
  msgstr ""
240
 
241
- #: modules/competition-queries/competition-queries.php:30
242
  msgid "Find out which sites have the most relevant content/text on their pages"
243
  msgstr ""
244
 
245
- #: modules/competition-queries/competition-queries.php:31
246
  msgid "Allinurl"
247
  msgstr ""
248
 
249
- #: modules/competition-queries/competition-queries.php:31
250
  msgid ""
251
  "Find out which sites have the most relevant naming conventions for each "
252
  "keyword"
253
  msgstr ""
254
 
255
- #: modules/competition-queries/competition-queries.php:33
256
  msgid "URLs"
257
  msgstr ""
258
 
259
- #: modules/competition-queries/competition-queries.php:33
260
  msgid "Site"
261
  msgstr ""
262
 
263
- #: modules/competition-queries/competition-queries.php:33
264
  msgid "Find out how many pages are indexed for each domain"
265
  msgstr ""
266
 
267
- #: modules/competition-queries/competition-queries.php:34
268
- #: modules/competition-queries/competition-queries.php:39
269
  msgid "Inbound Links"
270
  msgstr ""
271
 
272
- #: modules/competition-queries/competition-queries.php:34
273
  msgid "Find out how many sites link to the domains"
274
  msgstr ""
275
 
276
- #: modules/competition-queries/competition-queries.php:35
277
- #: modules/competition-queries/competition-queries.php:39
278
  msgid "Outbound Links"
279
  msgstr ""
280
 
281
- #: modules/competition-queries/competition-queries.php:35
282
  msgid "Find out how many sites the domains link to"
283
  msgstr ""
284
 
285
- #: modules/competition-queries/competition-queries.php:57
286
  msgid "Step 2: Enter the <span id='methodtype'>Keywords</span> To Research"
287
  msgstr ""
288
 
289
- #: modules/competition-queries/competition-queries.php:59
290
  msgid "(Type in one per line)"
291
  msgstr ""
292
 
293
- #: modules/competition-queries/competition-queries.php:61
294
  msgid "Step 3: Set Options and Submit"
295
  msgstr ""
296
 
297
- #: modules/competition-queries/competition-queries.php:63
298
- #: modules/site-keyword-queries/site-keyword-queries.php:29
299
  msgid "Show 100 results per page"
300
  msgstr ""
301
 
302
- #: modules/competition-queries/competition-queries.php:65
303
- #: modules/site-keyword-queries/site-keyword-queries.php:31
304
  msgid "Use Google's minimal mode"
305
  msgstr ""
306
 
307
- #: modules/competition-queries/competition-queries.php:71
308
- #: modules/site-keyword-queries/site-keyword-queries.php:34
309
  msgid "Submit"
310
  msgstr ""
311
 
312
- #: modules/files/files.php:15
313
  msgid "File Editor"
314
  msgstr ""
315
 
316
- #: modules/files/files.php:53
317
  msgid ""
318
  "A .htaccess file exists, but it&#8217;s not writable. You can edit it here "
319
  "once the file permissions are corrected."
320
  msgstr ""
321
 
322
- #: modules/files/files.php:59
323
  msgid ""
324
  "WordPress won&#8217;t be able to display your robots.txt file because the "
325
  "default <a href=\"options-permalink.php\" target=\"_blank\">permalink "
326
  "structure</a> is in use."
327
  msgstr ""
328
 
329
- #: modules/files/files.php:66
330
  #, php-format
331
  msgid "robots.txt [<a href=\"%s\" target=\"_blank\">Open</a>]"
332
  msgstr ""
333
 
334
- #: modules/files/files.php:70
335
  msgid "Enable this custom robots.txt file and disable the default file"
336
  msgstr ""
337
 
338
- #: modules/files/files.php:71
339
  msgid "Let other plugins add rules to my custom robots.txt file"
340
  msgstr ""
341
 
342
- #: modules/files/files.php:72
343
  msgid "robots.txt Settings"
344
  msgstr ""
345
 
346
- #: modules/files/files.php:75
347
  msgid ""
348
  "Please realize that incorrectly editing your robots.txt file could block "
349
  "search engines from your site."
350
  msgstr ""
351
 
352
- #: modules/files/files.php:79
353
  msgid ".htaccess"
354
  msgstr ""
355
 
356
- #: modules/files/files.php:82
357
  msgid ""
358
  "Also, incorrectly editing your .htaccess file could disable your entire "
359
  "website. Edit with caution!"
360
  msgstr ""
361
 
362
- #: modules/files/files.php:132
363
  #, php-format
364
  msgid ""
365
  "Please note that your privacy settings won&#8217;t have any effect on your "
366
  "robots.txt file, since you&#8217;re using <a href=\"%s\">a custom one</a>."
367
  msgstr ""
368
 
369
- #: modules/files/files.php:140
370
- msgid "Overview"
371
- msgstr ""
372
-
373
- #: modules/files/files.php:141
374
- msgid "FAQ"
375
- msgstr ""
376
-
377
- #: modules/files/files.php:146
378
- msgid ""
379
- "The File Editor module lets you edit system files that are of SEO value. "
380
- "Edit the files as desired, then click Save Changes. If you create a custom "
381
- "robots.txt file, be sure to enable it with the checkbox."
382
- msgstr ""
383
-
384
- #: modules/files/files.php:150
385
- msgid ""
386
- "\r\n"
387
- "<h6>Why do I get a &#8220;500 Server Error&#8221; after using the File "
388
- "Editor?</h6>\r\n"
389
- "\r\n"
390
- "<p>You may have inserted code into your .htaccess file that your web server "
391
- "can't understand. As the File Editor warns, incorrectly editing your ."
392
- "htaccess file can disable your entire website in this way. To restore your "
393
- "site, you'll need to use an FTP client (or your web host's File Manager) to "
394
- "edit or rename your .htaccess file. If you need help, please contact your "
395
- "web host.</p>\r\n"
396
- "\r\n"
397
- "<h6>Will my robots.txt edits remain if I disable the File Editor?</h6>\r\n"
398
- "\r\n"
399
- "<p>No. On a WordPress blog, the robots.txt file is dynamically generated "
400
- "just like your posts and Pages. If you disable the File Editor module or the "
401
- "entire SEO Ultimate plugin, the File Editor won't be able to insert your "
402
- "custom code into the robots.txt file anymore.</p>\r\n"
403
- "\r\n"
404
- "<h6>Will my .htaccess edits remain if I disable the File Editor?</h6>\r\n"
405
- "\r\n"
406
- "<p>Yes. The .htaccess file is static. Your edits will remain even if you "
407
- "disable SEO Ultimate or its File Editor module.</p>\r\n"
408
- "\r\n"
409
- "<h6>Where did my .htaccess edits go?</h6>\r\n"
410
- "\r\n"
411
- "<p>The .htaccess file is static, so SEO Ultimate doesn't have total control "
412
- "over it. It's possible that WordPress, another plugin, or other software may "
413
- "overwrite your .htaccess file. If you have a backup of your blog's files, "
414
- "you can try recovering your edits from there.</p>\r\n"
415
- msgstr ""
416
-
417
- #: modules/import-aiosp/import-aiosp.php:13
418
  msgid "Import from All in One SEO Pack"
419
  msgstr ""
420
 
421
- #: modules/import-aiosp/import-aiosp.php:14
422
  msgid "AIOSP Import"
423
  msgstr ""
424
 
425
- #: modules/import-aiosp/import-aiosp.php:16
426
  msgid "All in One SEO Pack"
427
  msgstr ""
428
 
429
- #: modules/import-aiosp/import-aiosp.php:17
430
  msgid "Import post data (custom title tags and meta tags)."
431
  msgstr ""
432
 
433
- #: modules/import-aiosp/import-aiosp.php:29
434
  msgid ""
435
  "Here you can move post fields from the All in One SEO Pack (AIOSP) plugin to "
436
  "SEO Ultimate. AIOSP&#8217;s data remains in your WordPress database after "
@@ -439,18 +451,18 @@ msgid ""
439
  "to be currently installed or activated for the import to take place."
440
  msgstr ""
441
 
442
- #: modules/import-aiosp/import-aiosp.php:31
443
  msgid ""
444
  "The import tool can only move over data from AIOSP version 1.6 or above. If "
445
  "you use an older version of AIOSP, you should update to the latest version "
446
  "first and run AIOSP&#8217;s upgrade process."
447
  msgstr ""
448
 
449
- #: modules/import-aiosp/import-aiosp.php:36
450
  msgid "Import Post Fields"
451
  msgstr ""
452
 
453
- #: modules/import-aiosp/import-aiosp.php:37
454
  msgid ""
455
  "Post fields store the SEO data for your posts/pages (i.e. your custom title "
456
  "tags, meta descriptions, and meta keywords). If you provided custom titles/"
@@ -458,66 +470,66 @@ msgid ""
458
  "data over to SEO Ultimate."
459
  msgstr ""
460
 
461
- #: modules/import-aiosp/import-aiosp.php:40
462
  msgid "Conflict Resolution Mode"
463
  msgstr ""
464
 
465
- #: modules/import-aiosp/import-aiosp.php:41
466
  msgid ""
467
  "What should the import tool do if it tries to move over a post&#8217;s AIOSP "
468
  "data, but different data already exists in the corresponding SEO Ultimate "
469
  "fields?"
470
  msgstr ""
471
 
472
- #: modules/import-aiosp/import-aiosp.php:43
473
  msgid "Skip that post and leave all data as-is (default)."
474
  msgstr ""
475
 
476
- #: modules/import-aiosp/import-aiosp.php:44
477
  msgid "Delete the SEO Ultimate data and replace it with the AIOSP data."
478
  msgstr ""
479
 
480
- #: modules/import-aiosp/import-aiosp.php:45
481
  msgid "Keep the SEO Ultimate data and delete the AIOSP data."
482
  msgstr ""
483
 
484
- #: modules/import-aiosp/import-aiosp.php:48
485
  msgid "Deletion Preference"
486
  msgstr ""
487
 
488
- #: modules/import-aiosp/import-aiosp.php:49
489
  msgid ""
490
  "When the migration tool successfully copies a post&#8217;s AIOSP data over "
491
  "to SEO Ultimate, what should it do with the old AIOSP data?"
492
  msgstr ""
493
 
494
- #: modules/import-aiosp/import-aiosp.php:51
495
  msgid "Delete the AIOSP data."
496
  msgstr ""
497
 
498
- #: modules/import-aiosp/import-aiosp.php:52
499
  msgid "Leave behind the duplicate AIOSP data (default)."
500
  msgstr ""
501
 
502
- #: modules/import-aiosp/import-aiosp.php:64
503
  msgid "Deactivated All in One SEO Pack."
504
  msgstr ""
505
 
506
- #: modules/import-aiosp/import-aiosp.php:126
507
  #, php-format
508
  msgid "Imported a total of %d fields for one post/page/revision."
509
  msgid_plural "Imported a total of %1$d fields for %2$d posts/pages/revisions."
510
  msgstr[0] ""
511
  msgstr[1] ""
512
 
513
- #: modules/import-aiosp/import-aiosp.php:132
514
  #, php-format
515
  msgid "Skipped one post with disabled AIOSP data."
516
  msgid_plural "Skipped %d posts with disabled AIOSP data."
517
  msgstr[0] ""
518
  msgstr[1] ""
519
 
520
- #: modules/import-aiosp/import-aiosp.php:138
521
  #, php-format
522
  msgid ""
523
  "Overwrote one SEO Ultimate field with AIOSP data, as instructed by the "
@@ -528,7 +540,7 @@ msgid_plural ""
528
  msgstr[0] ""
529
  msgstr[1] ""
530
 
531
- #: modules/import-aiosp/import-aiosp.php:144
532
  #, php-format
533
  msgid "Deleted one AIOSP field, as instructed by the settings you chose."
534
  msgid_plural ""
@@ -536,141 +548,137 @@ msgid_plural ""
536
  msgstr[0] ""
537
  msgstr[1] ""
538
 
539
- #: modules/linkbox/linkbox.php:13
540
  msgid "Linkbox Inserter"
541
  msgstr ""
542
 
543
- #: modules/linkbox/linkbox.php:19
544
  msgid "Link to this post!"
545
  msgstr ""
546
 
547
- #: modules/linkbox/linkbox.php:46
548
  msgid "At the end of posts"
549
  msgstr ""
550
 
551
- #: modules/linkbox/linkbox.php:47
552
  msgid "At the end of pages"
553
  msgstr ""
554
 
555
- #: modules/linkbox/linkbox.php:48
556
  msgid "When called by the su_linkbox hook"
557
  msgstr ""
558
 
559
- #: modules/linkbox/linkbox.php:49
560
  msgid "Display linkboxes..."
561
  msgstr ""
562
 
563
- #: modules/linkbox/linkbox.php:50
564
  msgid "Linkbox HTML"
565
  msgstr ""
566
 
567
- #: modules/meta/meta-settings.php:16
568
  msgid "Meta Editor Settings"
569
  msgstr ""
570
 
571
- #: modules/meta/meta-settings.php:17
572
- msgid "Settings"
573
- msgstr ""
574
-
575
- #: modules/meta/meta-settings.php:28
576
  msgid "Blog Homepage Meta Description"
577
  msgstr ""
578
 
579
- #: modules/meta/meta-settings.php:29
580
  msgid "Blog Homepage Meta Keywords"
581
  msgstr ""
582
 
583
- #: modules/meta/meta-settings.php:32
584
  msgid "Use this blog&#8217s tagline as the default homepage description."
585
  msgstr ""
586
 
587
- #: modules/meta/meta-settings.php:33
588
  msgid "Default Values"
589
  msgstr ""
590
 
591
- #: modules/meta/meta-settings.php:35
592
  msgid ""
593
  "Don&#8217t use this site&#8217s Open Directory description in search results."
594
  msgstr ""
595
 
596
- #: modules/meta/meta-settings.php:36
597
  msgid ""
598
  "Don&#8217t use this site&#8217s Yahoo! Directory description in search "
599
  "results."
600
  msgstr ""
601
 
602
- #: modules/meta/meta-settings.php:37
603
  msgid "Don&#8217t cache or archive this site."
604
  msgstr ""
605
 
606
- #: modules/meta/meta-settings.php:38
607
  msgid "Spider Instructions"
608
  msgstr ""
609
 
610
- #: modules/meta/meta-settings.php:40
611
  msgid "Google Webmaster Tools:"
612
  msgstr ""
613
 
614
- #: modules/meta/meta-settings.php:41
615
  msgid "Yahoo! Site Explorer:"
616
  msgstr ""
617
 
618
- #: modules/meta/meta-settings.php:42
619
  msgid "Bing Webmaster Center:"
620
  msgstr ""
621
 
622
- #: modules/meta/meta-settings.php:43
623
  msgid "Verification Codes"
624
  msgstr ""
625
 
626
- #: modules/meta/meta-settings.php:44
627
  msgid "Custom &lt;head&gt; HTML"
628
  msgstr ""
629
 
630
- #: modules/meta/meta.php:13
631
  msgid "Meta Editor"
632
  msgstr ""
633
 
634
- #: modules/meta/meta.php:84
635
  msgid "Custom Header Code"
636
  msgstr ""
637
 
638
- #: modules/meta/meta.php:100
639
  msgid "Description:"
640
  msgstr ""
641
 
642
- #: modules/meta/meta.php:103
643
  #, php-format
644
  msgid "You&#8217;ve entered %s characters. Most search engines use up to 160."
645
  msgstr ""
646
 
647
- #: modules/meta/meta.php:105
648
  msgid "Keywords:<br /><em>(separate with commas)</em>"
649
  msgstr ""
650
 
651
- #: modules/meta/meta.php:112
652
  msgid ""
653
  "<strong>Description:</strong> &mdash; The value of the meta description tag. "
654
  "The description will often appear underneath the title in search engine "
655
  "results. "
656
  msgstr ""
657
 
658
- #: modules/meta/meta.php:114
659
  msgid ""
660
  "<strong>Keywords:</strong> &mdash; The value of the meta keywords tag. The "
661
  "keywords list gives search engines a hint as to what this post/page is "
662
  "about. "
663
  msgstr ""
664
 
665
- #: modules/modules/modules.php:13
666
  msgid "Module Manager"
667
  msgstr ""
668
 
669
- #: modules/modules/modules.php:14
670
  msgid "Modules"
671
  msgstr ""
672
 
673
- #: modules/modules/modules.php:34
674
  msgid ""
675
  "SEO Ultimate&#8217;s features are located in groups called &#8220;modules."
676
  "&#8221; By default, most of these modules are listed in the &#8220;"
@@ -679,477 +687,529 @@ msgid ""
679
  "corner of your administration screen."
680
  msgstr ""
681
 
682
- #: modules/modules/modules.php:36
683
  msgid ""
684
  "The Module Manager lets you disable or hide modules you don&#8217;t use. "
685
  "You can also silence modules from displaying bubble alerts on the menu."
686
  msgstr ""
687
 
688
- #: modules/modules/modules.php:42
689
  msgid "Status"
690
  msgstr ""
691
 
692
- #: modules/modules/modules.php:43
693
  msgid "Module"
694
  msgstr ""
695
 
696
- #: modules/modules/modules.php:56
697
  msgid "Enabled"
698
  msgstr ""
699
 
700
- #: modules/modules/modules.php:57
701
  msgid "Silenced"
702
  msgstr ""
703
 
704
- #: modules/modules/modules.php:58
705
  msgid "Hidden"
706
  msgstr ""
707
 
708
- #: modules/modules/modules.php:59
709
  msgid "Disabled"
710
  msgstr ""
711
 
712
- #: modules/more-links/more-links.php:13
713
  msgid "More Link Customizer"
714
  msgstr ""
715
 
716
- #: modules/more-links/more-links.php:28
717
  msgid "Default More Link Text"
718
  msgstr ""
719
 
720
- #: modules/more-links/more-links.php:46
721
  msgid "More Link Text:"
722
  msgstr ""
723
 
724
- #: modules/noindex/noindex.php:13
725
  msgid "Noindex Manager"
726
  msgstr ""
727
 
728
- #: modules/noindex/noindex.php:40
729
  msgid ""
730
  "Note: The current <a href='options-privacy.php'>privacy settings</a> will "
731
  "block indexing of the entire site, regardless of which options are set below."
732
  msgstr ""
733
 
734
- #: modules/noindex/noindex.php:43
735
  msgid "Prevent indexing of..."
736
  msgstr ""
737
 
738
- #: modules/noindex/noindex.php:44
739
  msgid "Administration back-end pages"
740
  msgstr ""
741
 
742
- #: modules/noindex/noindex.php:45
743
  msgid "Author archives"
744
  msgstr ""
745
 
746
- #: modules/noindex/noindex.php:46
747
  msgid "Blog search pages"
748
  msgstr ""
749
 
750
- #: modules/noindex/noindex.php:47
751
  msgid "Category archives"
752
  msgstr ""
753
 
754
- #: modules/noindex/noindex.php:48
755
  msgid "Comment feeds"
756
  msgstr ""
757
 
758
- #: modules/noindex/noindex.php:49
759
  msgid "Comment subpages"
760
  msgstr ""
761
 
762
- #: modules/noindex/noindex.php:50
763
  msgid "Date-based archives"
764
  msgstr ""
765
 
766
- #: modules/noindex/noindex.php:51
767
  msgid "Subpages of the homepage"
768
  msgstr ""
769
 
770
- #: modules/noindex/noindex.php:52
771
  msgid "Tag archives"
772
  msgstr ""
773
 
774
- #: modules/noindex/noindex.php:53
775
  msgid "User login/registration pages"
776
  msgstr ""
777
 
778
- #: modules/sds-blog/sds-blog.php:13
779
  msgid "Whitepapers"
780
  msgstr ""
781
 
782
- #: modules/sds-blog/sds-blog.php:14
783
  msgid "SEO Design Solutions Whitepapers"
784
  msgstr ""
785
 
786
- #. #-#-#-#-# plugin.pot (SEO Ultimate 1.9) #-#-#-#-#
787
  #. Author of the plugin/theme
788
- #: modules/sds-blog/sds-blog.php:43
789
  msgid "SEO Design Solutions"
790
  msgstr ""
791
 
792
- #: modules/sds-blog/sds-blog.php:44
793
  msgid ""
794
- "Search engine optimization articles from the company behind the SEO Ultimate "
795
- "plugin."
 
796
  msgstr ""
797
 
798
- #: modules/sds-blog/sds-blog.php:95
799
- msgid ""
800
- "The articles below are loaded from the SEO Design Solutions website. Click "
801
- "on an article&#8217s title to read it."
802
  msgstr ""
803
 
804
- #: modules/settings/settings.php:15 modules/settings/settings.php:94
805
- msgid "Plugin Settings"
806
  msgstr ""
807
 
808
- #: modules/settings/settings.php:16
809
- msgid "SEO Ultimate Plugin Settings"
810
  msgstr ""
811
 
812
- #. #-#-#-#-# plugin.pot (SEO Ultimate 1.9) #-#-#-#-#
813
- #. Plugin Name of the plugin/theme
814
- #: modules/settings/settings.php:17 plugin/class.seo-ultimate.php:769
815
- msgid "SEO Ultimate"
 
 
 
 
 
 
816
  msgstr ""
817
 
818
- #: modules/settings/settings.php:65
 
 
 
 
 
 
 
 
 
 
 
 
819
  msgid "Settings successfully imported."
820
  msgstr ""
821
 
822
- #: modules/settings/settings.php:67
823
  msgid ""
824
  "The uploaded file is not in the proper format. Settings could not be "
825
  "imported."
826
  msgstr ""
827
 
828
- #: modules/settings/settings.php:69
829
  msgid "The settings file could not be uploaded successfully."
830
  msgstr ""
831
 
832
- #: modules/settings/settings.php:72
833
  msgid ""
834
  "Settings could not be imported because no settings file was selected. Please "
835
  "click the &#8220;Browse&#8221; button and select a file to import."
836
  msgstr ""
837
 
838
- #: modules/settings/settings.php:80
839
  msgid "All settings have been erased and defaults have been restored."
840
  msgstr ""
841
 
842
- #: modules/settings/settings.php:96
843
- msgid "Enable attribution link"
844
  msgstr ""
845
 
846
- #: modules/settings/settings.php:97
847
- msgid "Enable attribution link CSS styling"
 
 
 
848
  msgstr ""
849
 
850
- #: modules/settings/settings.php:98
851
- msgid "Notify me about unnecessary active plugins"
 
 
852
  msgstr ""
853
 
854
- #: modules/settings/settings.php:100
855
- msgid "Insert comments around HTML code insertions"
856
  msgstr ""
857
 
858
- #: modules/settings/settings.php:101
859
- msgid "Allow modules to save visitor information to the database"
 
 
 
860
  msgstr ""
861
 
862
- #: modules/settings/settings.php:102
863
- #, php-format
864
- msgid "Delete logged visitor information after %d days"
 
865
  msgstr ""
866
 
867
- #: modules/settings/settings.php:107
868
- msgid "Manage Settings Data"
 
 
 
 
869
  msgstr ""
870
 
871
- #: modules/settings/settings.php:111
 
 
 
 
872
  msgid ""
873
- "This section allows you to export, import, and reset the settings of the "
874
- "plugin and all its modules."
875
  msgstr ""
876
 
877
- #: modules/settings/settings.php:113
878
  msgid ""
879
- "A settings file includes the data of every checkbox and textbox of every "
880
- "installed module, as well as the &#8220;Plugin Settings&#8221; section "
881
- "above. "
882
  msgstr ""
883
 
884
- #: modules/settings/settings.php:122
885
- msgid "Export:"
886
  msgstr ""
887
 
888
- #: modules/settings/settings.php:125
889
- msgid "Download Settings File"
890
  msgstr ""
891
 
892
- #: modules/settings/settings.php:130
893
- msgid "Import:"
894
  msgstr ""
895
 
896
- #: modules/settings/settings.php:135
897
- msgid ""
898
- "Are you sure you want to import this settings file? This will overwrite your "
899
- "current settings and cannot be undone."
900
  msgstr ""
901
 
902
- #: modules/settings/settings.php:136
903
- msgid "Import This Settings File"
904
  msgstr ""
905
 
906
- #: modules/settings/settings.php:143
907
- msgid "Reset:"
908
  msgstr ""
909
 
910
- #: modules/settings/settings.php:146
911
  msgid ""
912
- "Are you sure you want to erase all module settings? This cannot be undone."
 
913
  msgstr ""
914
 
915
- #: modules/settings/settings.php:147
916
- msgid "Restore Default Settings"
 
 
917
  msgstr ""
918
 
919
- #: modules/settings/settings.php:163
920
- msgid "Import from Other Plugins"
921
  msgstr ""
922
 
923
- #: modules/settings/settings.php:165
924
- msgid ""
925
- "You can import settings and data from these plugins. Clicking a plugin&#8217;"
926
- "s name will take you to the importer page, where you can customize "
927
- "parameters and start the import."
928
  msgstr ""
929
 
930
- #: modules/site-keyword-queries/site-keyword-queries.php:13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
931
  msgid "Internal Relevance Researcher"
932
  msgstr ""
933
 
934
- #: modules/site-keyword-queries/site-keyword-queries.php:14
935
  msgid "Int. Rel. Researcher"
936
  msgstr ""
937
 
938
- #: modules/site-keyword-queries/site-keyword-queries.php:22
939
  msgid "Step 1: Enter Keywords"
940
  msgstr ""
941
 
942
- #: modules/site-keyword-queries/site-keyword-queries.php:24
943
  msgid "(Type one keyword per line)"
944
  msgstr ""
945
 
946
- #: modules/site-keyword-queries/site-keyword-queries.php:26
947
  msgid "Step 2: Set Options and Submit"
948
  msgstr ""
949
 
950
- #: modules/site-keyword-queries/site-keyword-queries.php:28
951
  msgid "Put keywords in quotes"
952
  msgstr ""
953
 
954
- #: modules/slugs/slugs.php:13
955
  msgid "Slug Optimizer"
956
  msgstr ""
957
 
958
- #: modules/slugs/slugs.php:17
959
  msgid "Words to Remove"
960
  msgstr ""
961
 
962
- #: modules/titles/titles-formats.php:8
963
  msgid "Title Rewriter Formats"
964
  msgstr ""
965
 
966
- #: modules/titles/titles-formats.php:9
967
  msgid "Default Formats"
968
  msgstr ""
969
 
970
- #: modules/titles/titles-posts.php:17
971
  msgid "Post Title Editor"
972
  msgstr ""
973
 
974
- #: modules/titles/titles-posts.php:24
975
  msgid "Posts"
976
  msgstr ""
977
 
978
- #: modules/titles/titles-posts.php:25
979
  msgid "Pages"
980
  msgstr ""
981
 
982
- #: modules/titles/titles-posts.php:26
983
  msgid "Attachments"
984
  msgstr ""
985
 
986
- #: modules/titles/titles-taxonomies.php:17
987
  msgid "Taxonomy Title Editor"
988
  msgstr ""
989
 
990
- #: modules/titles/titles-taxonomies.php:24
991
  msgid "Categories"
992
  msgstr ""
993
 
994
- #: modules/titles/titles-taxonomies.php:25
995
  msgid "Post Tags"
996
  msgstr ""
997
 
998
- #: modules/titles/titles.php:13
999
  msgid "Title Rewriter"
1000
  msgstr ""
1001
 
1002
- #: modules/titles/titles.php:26
1003
  msgid "{blog}"
1004
  msgstr ""
1005
 
1006
- #: modules/titles/titles.php:27
1007
  msgid "{post} | {blog}"
1008
  msgstr ""
1009
 
1010
- #: modules/titles/titles.php:28
1011
  msgid "{page} | {blog}"
1012
  msgstr ""
1013
 
1014
- #: modules/titles/titles.php:29
1015
  msgid "{category} | {blog}"
1016
  msgstr ""
1017
 
1018
- #: modules/titles/titles.php:30
1019
  msgid "{tag} | {blog}"
1020
  msgstr ""
1021
 
1022
- #: modules/titles/titles.php:31
1023
  msgid "Archives for {month} {day}, {year} | {blog}"
1024
  msgstr ""
1025
 
1026
- #: modules/titles/titles.php:32
1027
  msgid "Archives for {month} {year} | {blog}"
1028
  msgstr ""
1029
 
1030
- #: modules/titles/titles.php:33
1031
  msgid "Archives for {year} | {blog}"
1032
  msgstr ""
1033
 
1034
- #: modules/titles/titles.php:34
1035
  msgid "Posts by {author} | {blog}"
1036
  msgstr ""
1037
 
1038
- #: modules/titles/titles.php:35
1039
  msgid "Search Results for {query} | {blog}"
1040
  msgstr ""
1041
 
1042
- #: modules/titles/titles.php:36
1043
  msgid "404 Not Found | {blog}"
1044
  msgstr ""
1045
 
1046
- #: modules/titles/titles.php:37
1047
  msgid "{title} - Page {num}"
1048
  msgstr ""
1049
 
1050
- #: modules/titles/titles.php:43
1051
  msgid "Blog Homepage Title"
1052
  msgstr ""
1053
 
1054
- #: modules/titles/titles.php:44
1055
  msgid "Post Title Format"
1056
  msgstr ""
1057
 
1058
- #: modules/titles/titles.php:45
1059
  msgid "Page Title Format"
1060
  msgstr ""
1061
 
1062
- #: modules/titles/titles.php:46
1063
  msgid "Category Title Format"
1064
  msgstr ""
1065
 
1066
- #: modules/titles/titles.php:47
1067
  msgid "Tag Title Format"
1068
  msgstr ""
1069
 
1070
- #: modules/titles/titles.php:48
1071
  msgid "Day Archive Title Format"
1072
  msgstr ""
1073
 
1074
- #: modules/titles/titles.php:49
1075
  msgid "Month Archive Title Format"
1076
  msgstr ""
1077
 
1078
- #: modules/titles/titles.php:50
1079
  msgid "Year Archive Title Format"
1080
  msgstr ""
1081
 
1082
- #: modules/titles/titles.php:51
1083
  msgid "Author Archive Title Format"
1084
  msgstr ""
1085
 
1086
- #: modules/titles/titles.php:52
1087
  msgid "Search Title Format"
1088
  msgstr ""
1089
 
1090
- #: modules/titles/titles.php:53
1091
  msgid "404 Title Format"
1092
  msgstr ""
1093
 
1094
- #: modules/titles/titles.php:54
1095
  msgid "Pagination Title Format"
1096
  msgstr ""
1097
 
1098
- #: modules/titles/titles.php:65
1099
- msgid "Title Tag:"
1100
- msgstr ""
1101
-
1102
- #: modules/titles/titles.php:275
1103
  msgid "Post"
1104
  msgstr ""
1105
 
1106
- #: modules/titles/titles.php:279
1107
  msgid "Page"
1108
  msgstr ""
1109
 
1110
- #: modules/titles/titles.php:351
1111
  msgid "ID"
1112
  msgstr ""
1113
 
1114
- #: modules/titles/titles.php:351
1115
  msgid "Name"
1116
  msgstr ""
1117
 
1118
- #: modules/titles/titles.php:351
1119
  msgid "Title Tag"
1120
  msgstr ""
1121
 
1122
- #: modules/titles/titles.php:424
 
 
 
 
1123
  msgid ""
1124
  "<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; "
1125
  "tag. The title appears in visitors' title bars and in search engine result "
1126
  "titles. "
1127
  msgstr ""
1128
 
1129
- #: plugin/class.seo-ultimate.php:769
1130
  msgid "SEO"
1131
  msgstr ""
1132
 
1133
- #: plugin/class.seo-ultimate.php:988
1134
  msgid "SEO Settings Help"
1135
  msgstr ""
1136
 
1137
- #: plugin/class.seo-ultimate.php:990
1138
  msgid "The SEO Settings box lets you customize these settings:"
1139
  msgstr ""
1140
 
1141
- #: plugin/class.seo-ultimate.php:992
1142
  msgid "(The SEO Settings box is part of the SEO Ultimate plugin.)"
1143
  msgstr ""
1144
 
1145
- #: plugin/class.seo-ultimate.php:1047
1146
  #, php-format
1147
  msgid ""
1148
  "SEO Ultimate includes the functionality of %1$s. You may want to deactivate %"
1149
  "1$s to avoid plugin conflicts."
1150
  msgstr ""
1151
 
1152
- #: plugin/class.seo-ultimate.php:1093
 
 
 
 
1153
  msgid ""
1154
  "<strong>SEO Ultimate Notice:</strong> Your blog is configured to block "
1155
  "search engine spiders. To resolve this, <a href='options-privacy.php' "
@@ -1157,43 +1217,10 @@ msgid ""
1157
  "everyone."
1158
  msgstr ""
1159
 
1160
- #: plugin/class.seo-ultimate.php:1201
1161
  msgid "SEO Settings"
1162
  msgstr ""
1163
 
1164
- #: plugin/class.su-hitset.php:44
1165
- msgid "Date"
1166
- msgstr ""
1167
-
1168
- #: plugin/class.su-hitset.php:45
1169
- msgid "IP Address"
1170
- msgstr ""
1171
-
1172
- #: plugin/class.su-hitset.php:46
1173
- msgid "User Agent"
1174
- msgstr ""
1175
-
1176
- #: plugin/class.su-hitset.php:47
1177
- msgid "URL Requested"
1178
- msgstr ""
1179
-
1180
- #: plugin/class.su-hitset.php:48
1181
- msgid "Redirected To"
1182
- msgstr ""
1183
-
1184
- #: plugin/class.su-hitset.php:49
1185
- msgid "Status Code"
1186
- msgstr ""
1187
-
1188
- #: plugin/class.su-hitset.php:50
1189
- msgid "Referring URL"
1190
- msgstr ""
1191
-
1192
- #: plugin/class.su-hitset.php:82
1193
- #, php-format
1194
- msgid "%1$s<br />%2$s"
1195
- msgstr ""
1196
-
1197
  #. Plugin URI of the plugin/theme
1198
  msgid "http://www.seodesignsolutions.com/wordpress-seo/"
1199
  msgstr ""
1
+ # Translation of the WordPress plugin SEO Ultimate 2.1 by SEO Design Solutions.
2
  # Copyright (C) 2010 SEO Design Solutions
3
  # This file is distributed under the same license as the SEO Ultimate package.
4
  # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
6
  #, fuzzy
7
  msgid ""
8
  msgstr ""
9
+ "Project-Id-Version: SEO Ultimate 2.1\n"
10
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
11
+ "POT-Creation-Date: 2010-05-18 20:19+0000\n"
12
  "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
17
  "Content-Transfer-Encoding: 8bit\n"
18
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
 
20
+ #: includes/jlfunctions/str.php:88 plugin/su-functions.php:77
21
  #, php-format
22
  msgid "%s and %s"
23
  msgstr ""
24
 
25
+ #: includes/jlfunctions/str.php:91 plugin/su-functions.php:80
26
  msgid ", "
27
  msgstr ""
28
 
29
+ #: includes/jlfunctions/str.php:92 plugin/su-functions.php:81
30
  #, php-format
31
  msgid "%s, and %s"
32
  msgstr ""
33
 
34
+ #: modules/404s/fofs-log.php:16
35
+ msgid "404 Monitor Log"
36
  msgstr ""
37
 
38
+ #: modules/404s/fofs-log.php:17
39
+ msgid "Log"
40
+ msgstr ""
41
+
42
+ #: modules/404s/fofs-log.php:115
43
+ msgid "Actions"
44
+ msgstr ""
45
+
46
+ #: modules/404s/fofs-log.php:116
47
+ msgid "Hits"
48
+ msgstr ""
49
+
50
+ #: modules/404s/fofs-log.php:117
51
+ msgid "URL with 404 Error"
52
+ msgstr ""
53
+
54
+ #: modules/404s/fofs-log.php:118
55
+ msgid "Date of Most Recent Hit"
56
+ msgstr ""
57
+
58
+ #: modules/404s/fofs-log.php:119
59
+ msgid "Referers"
60
+ msgstr ""
61
+
62
+ #: modules/404s/fofs-log.php:120 modules/404s/fofs-log.php:223
63
+ msgid "User Agents"
64
  msgstr ""
65
 
66
+ #: modules/404s/fofs-log.php:136
67
+ msgid ""
68
+ "New 404 errors will not be recorded because 404 logging is disabled on the "
69
+ "Settings tab."
70
  msgstr ""
71
 
72
+ #: modules/404s/fofs-log.php:143
73
  msgid "The log entry was successfully deleted."
74
  msgstr ""
75
 
76
+ #: modules/404s/fofs-log.php:145
77
  msgid "This log entry has already been deleted."
78
  msgstr ""
79
 
80
+ #: modules/404s/fofs-log.php:154
81
  msgid "The log was successfully cleared."
82
  msgstr ""
83
 
84
+ #: modules/404s/fofs-log.php:158
85
  msgid "No 404 errors in the log."
86
  msgstr ""
87
 
88
+ #: modules/404s/fofs-log.php:182
89
+ msgid "Open URL in new window (will not be logged)"
90
+ msgstr ""
91
+
92
+ #: modules/404s/fofs-log.php:183
93
+ msgid "Query Google for cached version of URL (opens in new window)"
94
+ msgstr ""
95
+
96
+ #: modules/404s/fofs-log.php:184
97
+ msgid "Remove this URL from the log"
98
+ msgstr ""
99
+
100
+ #: modules/404s/fofs-log.php:187
101
+ #, php-format
102
+ msgid "%s at %s"
103
+ msgstr ""
104
+
105
+ #: modules/404s/fofs-log.php:191
106
+ msgid "View list of referring URLs"
107
+ msgstr ""
108
+
109
+ #: modules/404s/fofs-log.php:192
110
+ msgid "View list of user agents"
111
+ msgstr ""
112
+
113
+ #: modules/404s/fofs-log.php:202
114
+ msgid "Referring URLs"
115
+ msgstr ""
116
+
117
+ #: modules/404s/fofs-log.php:203 modules/404s/fofs-log.php:224
118
+ msgid "Hide list"
119
+ msgstr ""
120
+
121
+ #: modules/404s/fofs-log.php:254
122
  msgid "Are you sure you want to delete all 404 log entries?"
123
  msgstr ""
124
 
125
+ #: modules/404s/fofs-log.php:256
126
  msgid "Clear Log"
127
  msgstr ""
128
 
129
+ #: modules/404s/fofs-settings.php:16
130
+ msgid "404 Monitor Settings"
131
  msgstr ""
132
 
133
+ #: modules/404s/fofs-settings.php:17 modules/meta/meta-settings.php:16
134
+ msgid "Settings"
135
  msgstr ""
136
 
137
+ #: modules/404s/fofs-settings.php:22
138
+ msgid "Continue monitoring for new 404 errors"
139
  msgstr ""
140
 
141
+ #: modules/404s/fofs.php:11
142
+ msgid "404 Monitor"
143
+ msgstr ""
144
+
145
+ #: modules/autolinks/autolinks.php:12
146
  msgid "Deeplink Juggernaut"
147
  msgstr ""
148
 
149
+ #: modules/autolinks/autolinks.php:13
150
  msgid "Deeplink Juggernaut (Beta)"
151
  msgstr ""
152
 
153
+ #: modules/autolinks/autolinks.php:46
154
  msgid ""
155
  "The Deeplink Juggernaut can automatically link post/page anchor text to "
156
  "given URLs. This is a preview beta version. More functionality will be added "
157
  "in future releases of SEO Ultimate."
158
  msgstr ""
159
 
160
+ #: modules/autolinks/autolinks.php:67
161
  msgid "Anchor Text"
162
  msgstr ""
163
 
164
+ #: modules/autolinks/autolinks.php:68
165
  msgid "URL"
166
  msgstr ""
167
 
168
+ #: modules/canonical/canonical.php:12
169
  msgid "Canonicalizer"
170
  msgstr ""
171
 
172
+ #: modules/canonical/canonical.php:33
173
  msgid "Generate <code>&lt;link rel=&quot;canonical&quot; /&gt;</code> tags."
174
  msgstr ""
175
 
176
+ #: modules/canonical/canonical.php:34
177
  msgid "Redirect requests for nonexistent pagination."
178
  msgstr ""
179
 
180
+ #: modules/class.su-importmodule.php:36
181
  msgid "Import Now"
182
  msgstr ""
183
 
184
+ #: modules/class.su-importmodule.php:39
185
  #, php-format
186
  msgid ""
187
  "The import cannot be undone. It is your responsibility to <a href=\"%s\" "
188
  "target=\"_blank\">backup your database</a> before proceeding!"
189
  msgstr ""
190
 
191
+ #: modules/class.su-importmodule.php:49
192
  msgid "Import complete."
193
  msgstr ""
194
 
195
+ #: modules/class.su-importmodule.php:56
196
  msgid "Return to import page"
197
  msgstr ""
198
 
199
+ #: modules/class.su-importmodule.php:59
200
  msgid "Return to settings page"
201
  msgstr ""
202
 
203
+ #: modules/class.su-importmodule.php:62
204
  msgid "Return to SEO page"
205
  msgstr ""
206
 
207
+ #: modules/class.su-module.php:361
208
  msgid ""
209
  "(Note: This translated documentation was designed for an older version of "
210
  "SEO Ultimate and may be outdated.)"
211
  msgstr ""
212
 
213
+ #: modules/class.su-module.php:942
214
  #, php-format
215
  msgid "%s %s|Dropdown Title"
216
  msgstr ""
217
 
218
+ #: modules/class.su-module.php:970
219
  #, php-format
220
  msgid "%1$s | %2$s %3$s by %4$s"
221
  msgstr ""
222
 
223
+ #: modules/class.su-module.php:1004
224
  msgid "Settings updated."
225
  msgstr ""
226
 
227
+ #: modules/class.su-module.php:1024
228
  msgid "Save Changes"
229
  msgstr ""
230
 
231
+ #: modules/class.su-module.php:1345
232
  msgid ""
233
  "Are you sure you want to replace the textbox contents with this default "
234
  "value?"
235
  msgstr ""
236
 
237
+ #: modules/class.su-module.php:1360 modules/settings/settings-data.php:23
238
  msgid "Reset"
239
  msgstr ""
240
 
241
+ #: modules/competition-queries/competition-queries.php:12
242
  msgid "Competition Researcher"
243
  msgstr ""
244
 
245
+ #: modules/competition-queries/competition-queries.php:13
246
  msgid "Comp. Researcher"
247
  msgstr ""
248
 
249
+ #: modules/competition-queries/competition-queries.php:17
250
  msgid ""
251
  "The Competition Researcher provides you with easy access to various search "
252
  "engine tools which you can use to research multiple search queries or URLs."
253
  msgstr ""
254
 
255
+ #: modules/competition-queries/competition-queries.php:21
256
  msgid "Step 1: Choose Your Research Tool"
257
  msgstr ""
258
 
259
+ #: modules/competition-queries/competition-queries.php:25
260
  msgid "Keywords"
261
  msgstr ""
262
 
263
+ #: modules/competition-queries/competition-queries.php:25
264
  msgid "Normal Search"
265
  msgstr ""
266
 
267
+ #: modules/competition-queries/competition-queries.php:25
268
  msgid "Find out how many pages contain the words in each query"
269
  msgstr ""
270
 
271
+ #: modules/competition-queries/competition-queries.php:26
272
  msgid "Phrase Match"
273
  msgstr ""
274
 
275
+ #: modules/competition-queries/competition-queries.php:26
276
  msgid ""
277
  "Find out how many &#8220;actual&#8221; pages are competing for each query"
278
  msgstr ""
279
 
280
+ #: modules/competition-queries/competition-queries.php:27
281
  msgid "Allinanchor"
282
  msgstr ""
283
 
284
+ #: modules/competition-queries/competition-queries.php:27
285
  msgid "Find out which sites have the most links for each query"
286
  msgstr ""
287
 
288
+ #: modules/competition-queries/competition-queries.php:28
289
  msgid "Allintitle"
290
  msgstr ""
291
 
292
+ #: modules/competition-queries/competition-queries.php:28
293
  msgid ""
294
  "Find out which sites have the highest relevance in the title for each query"
295
  msgstr ""
296
 
297
+ #: modules/competition-queries/competition-queries.php:29
298
  msgid "Allintext"
299
  msgstr ""
300
 
301
+ #: modules/competition-queries/competition-queries.php:29
302
  msgid "Find out which sites have the most relevant content/text on their pages"
303
  msgstr ""
304
 
305
+ #: modules/competition-queries/competition-queries.php:30
306
  msgid "Allinurl"
307
  msgstr ""
308
 
309
+ #: modules/competition-queries/competition-queries.php:30
310
  msgid ""
311
  "Find out which sites have the most relevant naming conventions for each "
312
  "keyword"
313
  msgstr ""
314
 
315
+ #: modules/competition-queries/competition-queries.php:32
316
  msgid "URLs"
317
  msgstr ""
318
 
319
+ #: modules/competition-queries/competition-queries.php:32
320
  msgid "Site"
321
  msgstr ""
322
 
323
+ #: modules/competition-queries/competition-queries.php:32
324
  msgid "Find out how many pages are indexed for each domain"
325
  msgstr ""
326
 
327
+ #: modules/competition-queries/competition-queries.php:33
328
+ #: modules/competition-queries/competition-queries.php:38
329
  msgid "Inbound Links"
330
  msgstr ""
331
 
332
+ #: modules/competition-queries/competition-queries.php:33
333
  msgid "Find out how many sites link to the domains"
334
  msgstr ""
335
 
336
+ #: modules/competition-queries/competition-queries.php:34
337
+ #: modules/competition-queries/competition-queries.php:38
338
  msgid "Outbound Links"
339
  msgstr ""
340
 
341
+ #: modules/competition-queries/competition-queries.php:34
342
  msgid "Find out how many sites the domains link to"
343
  msgstr ""
344
 
345
+ #: modules/competition-queries/competition-queries.php:56
346
  msgid "Step 2: Enter the <span id='methodtype'>Keywords</span> To Research"
347
  msgstr ""
348
 
349
+ #: modules/competition-queries/competition-queries.php:58
350
  msgid "(Type in one per line)"
351
  msgstr ""
352
 
353
+ #: modules/competition-queries/competition-queries.php:60
354
  msgid "Step 3: Set Options and Submit"
355
  msgstr ""
356
 
357
+ #: modules/competition-queries/competition-queries.php:62
358
+ #: modules/site-keyword-queries/site-keyword-queries.php:28
359
  msgid "Show 100 results per page"
360
  msgstr ""
361
 
362
+ #: modules/competition-queries/competition-queries.php:64
363
+ #: modules/site-keyword-queries/site-keyword-queries.php:30
364
  msgid "Use Google's minimal mode"
365
  msgstr ""
366
 
367
+ #: modules/competition-queries/competition-queries.php:70
368
+ #: modules/site-keyword-queries/site-keyword-queries.php:33
369
  msgid "Submit"
370
  msgstr ""
371
 
372
+ #: modules/files/files.php:14
373
  msgid "File Editor"
374
  msgstr ""
375
 
376
+ #: modules/files/files.php:52
377
  msgid ""
378
  "A .htaccess file exists, but it&#8217;s not writable. You can edit it here "
379
  "once the file permissions are corrected."
380
  msgstr ""
381
 
382
+ #: modules/files/files.php:58
383
  msgid ""
384
  "WordPress won&#8217;t be able to display your robots.txt file because the "
385
  "default <a href=\"options-permalink.php\" target=\"_blank\">permalink "
386
  "structure</a> is in use."
387
  msgstr ""
388
 
389
+ #: modules/files/files.php:65
390
  #, php-format
391
  msgid "robots.txt [<a href=\"%s\" target=\"_blank\">Open</a>]"
392
  msgstr ""
393
 
394
+ #: modules/files/files.php:69
395
  msgid "Enable this custom robots.txt file and disable the default file"
396
  msgstr ""
397
 
398
+ #: modules/files/files.php:70
399
  msgid "Let other plugins add rules to my custom robots.txt file"
400
  msgstr ""
401
 
402
+ #: modules/files/files.php:71
403
  msgid "robots.txt Settings"
404
  msgstr ""
405
 
406
+ #: modules/files/files.php:74
407
  msgid ""
408
  "Please realize that incorrectly editing your robots.txt file could block "
409
  "search engines from your site."
410
  msgstr ""
411
 
412
+ #: modules/files/files.php:78
413
  msgid ".htaccess"
414
  msgstr ""
415
 
416
+ #: modules/files/files.php:81
417
  msgid ""
418
  "Also, incorrectly editing your .htaccess file could disable your entire "
419
  "website. Edit with caution!"
420
  msgstr ""
421
 
422
+ #: modules/files/files.php:131
423
  #, php-format
424
  msgid ""
425
  "Please note that your privacy settings won&#8217;t have any effect on your "
426
  "robots.txt file, since you&#8217;re using <a href=\"%s\">a custom one</a>."
427
  msgstr ""
428
 
429
+ #: modules/import-aiosp/import-aiosp.php:12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
430
  msgid "Import from All in One SEO Pack"
431
  msgstr ""
432
 
433
+ #: modules/import-aiosp/import-aiosp.php:13
434
  msgid "AIOSP Import"
435
  msgstr ""
436
 
437
+ #: modules/import-aiosp/import-aiosp.php:15
438
  msgid "All in One SEO Pack"
439
  msgstr ""
440
 
441
+ #: modules/import-aiosp/import-aiosp.php:16
442
  msgid "Import post data (custom title tags and meta tags)."
443
  msgstr ""
444
 
445
+ #: modules/import-aiosp/import-aiosp.php:28
446
  msgid ""
447
  "Here you can move post fields from the All in One SEO Pack (AIOSP) plugin to "
448
  "SEO Ultimate. AIOSP&#8217;s data remains in your WordPress database after "
451
  "to be currently installed or activated for the import to take place."
452
  msgstr ""
453
 
454
+ #: modules/import-aiosp/import-aiosp.php:30
455
  msgid ""
456
  "The import tool can only move over data from AIOSP version 1.6 or above. If "
457
  "you use an older version of AIOSP, you should update to the latest version "
458
  "first and run AIOSP&#8217;s upgrade process."
459
  msgstr ""
460
 
461
+ #: modules/import-aiosp/import-aiosp.php:35
462
  msgid "Import Post Fields"
463
  msgstr ""
464
 
465
+ #: modules/import-aiosp/import-aiosp.php:36
466
  msgid ""
467
  "Post fields store the SEO data for your posts/pages (i.e. your custom title "
468
  "tags, meta descriptions, and meta keywords). If you provided custom titles/"
470
  "data over to SEO Ultimate."
471
  msgstr ""
472
 
473
+ #: modules/import-aiosp/import-aiosp.php:39
474
  msgid "Conflict Resolution Mode"
475
  msgstr ""
476
 
477
+ #: modules/import-aiosp/import-aiosp.php:40
478
  msgid ""
479
  "What should the import tool do if it tries to move over a post&#8217;s AIOSP "
480
  "data, but different data already exists in the corresponding SEO Ultimate "
481
  "fields?"
482
  msgstr ""
483
 
484
+ #: modules/import-aiosp/import-aiosp.php:42
485
  msgid "Skip that post and leave all data as-is (default)."
486
  msgstr ""
487
 
488
+ #: modules/import-aiosp/import-aiosp.php:43
489
  msgid "Delete the SEO Ultimate data and replace it with the AIOSP data."
490
  msgstr ""
491
 
492
+ #: modules/import-aiosp/import-aiosp.php:44
493
  msgid "Keep the SEO Ultimate data and delete the AIOSP data."
494
  msgstr ""
495
 
496
+ #: modules/import-aiosp/import-aiosp.php:47
497
  msgid "Deletion Preference"
498
  msgstr ""
499
 
500
+ #: modules/import-aiosp/import-aiosp.php:48
501
  msgid ""
502
  "When the migration tool successfully copies a post&#8217;s AIOSP data over "
503
  "to SEO Ultimate, what should it do with the old AIOSP data?"
504
  msgstr ""
505
 
506
+ #: modules/import-aiosp/import-aiosp.php:50
507
  msgid "Delete the AIOSP data."
508
  msgstr ""
509
 
510
+ #: modules/import-aiosp/import-aiosp.php:51
511
  msgid "Leave behind the duplicate AIOSP data (default)."
512
  msgstr ""
513
 
514
+ #: modules/import-aiosp/import-aiosp.php:63
515
  msgid "Deactivated All in One SEO Pack."
516
  msgstr ""
517
 
518
+ #: modules/import-aiosp/import-aiosp.php:125
519
  #, php-format
520
  msgid "Imported a total of %d fields for one post/page/revision."
521
  msgid_plural "Imported a total of %1$d fields for %2$d posts/pages/revisions."
522
  msgstr[0] ""
523
  msgstr[1] ""
524
 
525
+ #: modules/import-aiosp/import-aiosp.php:131
526
  #, php-format
527
  msgid "Skipped one post with disabled AIOSP data."
528
  msgid_plural "Skipped %d posts with disabled AIOSP data."
529
  msgstr[0] ""
530
  msgstr[1] ""
531
 
532
+ #: modules/import-aiosp/import-aiosp.php:137
533
  #, php-format
534
  msgid ""
535
  "Overwrote one SEO Ultimate field with AIOSP data, as instructed by the "
540
  msgstr[0] ""
541
  msgstr[1] ""
542
 
543
+ #: modules/import-aiosp/import-aiosp.php:143
544
  #, php-format
545
  msgid "Deleted one AIOSP field, as instructed by the settings you chose."
546
  msgid_plural ""
548
  msgstr[0] ""
549
  msgstr[1] ""
550
 
551
+ #: modules/linkbox/linkbox.php:12
552
  msgid "Linkbox Inserter"
553
  msgstr ""
554
 
555
+ #: modules/linkbox/linkbox.php:18
556
  msgid "Link to this post!"
557
  msgstr ""
558
 
559
+ #: modules/linkbox/linkbox.php:45
560
  msgid "At the end of posts"
561
  msgstr ""
562
 
563
+ #: modules/linkbox/linkbox.php:46
564
  msgid "At the end of pages"
565
  msgstr ""
566
 
567
+ #: modules/linkbox/linkbox.php:47
568
  msgid "When called by the su_linkbox hook"
569
  msgstr ""
570
 
571
+ #: modules/linkbox/linkbox.php:48
572
  msgid "Display linkboxes..."
573
  msgstr ""
574
 
575
+ #: modules/linkbox/linkbox.php:49
576
  msgid "Linkbox HTML"
577
  msgstr ""
578
 
579
+ #: modules/meta/meta-settings.php:15
580
  msgid "Meta Editor Settings"
581
  msgstr ""
582
 
583
+ #: modules/meta/meta-settings.php:27
 
 
 
 
584
  msgid "Blog Homepage Meta Description"
585
  msgstr ""
586
 
587
+ #: modules/meta/meta-settings.php:28
588
  msgid "Blog Homepage Meta Keywords"
589
  msgstr ""
590
 
591
+ #: modules/meta/meta-settings.php:31
592
  msgid "Use this blog&#8217s tagline as the default homepage description."
593
  msgstr ""
594
 
595
+ #: modules/meta/meta-settings.php:32
596
  msgid "Default Values"
597
  msgstr ""
598
 
599
+ #: modules/meta/meta-settings.php:34
600
  msgid ""
601
  "Don&#8217t use this site&#8217s Open Directory description in search results."
602
  msgstr ""
603
 
604
+ #: modules/meta/meta-settings.php:35
605
  msgid ""
606
  "Don&#8217t use this site&#8217s Yahoo! Directory description in search "
607
  "results."
608
  msgstr ""
609
 
610
+ #: modules/meta/meta-settings.php:36
611
  msgid "Don&#8217t cache or archive this site."
612
  msgstr ""
613
 
614
+ #: modules/meta/meta-settings.php:37
615
  msgid "Spider Instructions"
616
  msgstr ""
617
 
618
+ #: modules/meta/meta-settings.php:39
619
  msgid "Google Webmaster Tools:"
620
  msgstr ""
621
 
622
+ #: modules/meta/meta-settings.php:40
623
  msgid "Yahoo! Site Explorer:"
624
  msgstr ""
625
 
626
+ #: modules/meta/meta-settings.php:41
627
  msgid "Bing Webmaster Center:"
628
  msgstr ""
629
 
630
+ #: modules/meta/meta-settings.php:42
631
  msgid "Verification Codes"
632
  msgstr ""
633
 
634
+ #: modules/meta/meta-settings.php:43
635
  msgid "Custom &lt;head&gt; HTML"
636
  msgstr ""
637
 
638
+ #: modules/meta/meta.php:12
639
  msgid "Meta Editor"
640
  msgstr ""
641
 
642
+ #: modules/meta/meta.php:81
643
  msgid "Custom Header Code"
644
  msgstr ""
645
 
646
+ #: modules/meta/meta.php:97
647
  msgid "Description:"
648
  msgstr ""
649
 
650
+ #: modules/meta/meta.php:100
651
  #, php-format
652
  msgid "You&#8217;ve entered %s characters. Most search engines use up to 160."
653
  msgstr ""
654
 
655
+ #: modules/meta/meta.php:102
656
  msgid "Keywords:<br /><em>(separate with commas)</em>"
657
  msgstr ""
658
 
659
+ #: modules/meta/meta.php:109
660
  msgid ""
661
  "<strong>Description:</strong> &mdash; The value of the meta description tag. "
662
  "The description will often appear underneath the title in search engine "
663
  "results. "
664
  msgstr ""
665
 
666
+ #: modules/meta/meta.php:111
667
  msgid ""
668
  "<strong>Keywords:</strong> &mdash; The value of the meta keywords tag. The "
669
  "keywords list gives search engines a hint as to what this post/page is "
670
  "about. "
671
  msgstr ""
672
 
673
+ #: modules/modules/modules.php:12
674
  msgid "Module Manager"
675
  msgstr ""
676
 
677
+ #: modules/modules/modules.php:13
678
  msgid "Modules"
679
  msgstr ""
680
 
681
+ #: modules/modules/modules.php:33
682
  msgid ""
683
  "SEO Ultimate&#8217;s features are located in groups called &#8220;modules."
684
  "&#8221; By default, most of these modules are listed in the &#8220;"
687
  "corner of your administration screen."
688
  msgstr ""
689
 
690
+ #: modules/modules/modules.php:35
691
  msgid ""
692
  "The Module Manager lets you disable or hide modules you don&#8217;t use. "
693
  "You can also silence modules from displaying bubble alerts on the menu."
694
  msgstr ""
695
 
696
+ #: modules/modules/modules.php:41
697
  msgid "Status"
698
  msgstr ""
699
 
700
+ #: modules/modules/modules.php:42
701
  msgid "Module"
702
  msgstr ""
703
 
704
+ #: modules/modules/modules.php:55
705
  msgid "Enabled"
706
  msgstr ""
707
 
708
+ #: modules/modules/modules.php:56
709
  msgid "Silenced"
710
  msgstr ""
711
 
712
+ #: modules/modules/modules.php:57
713
  msgid "Hidden"
714
  msgstr ""
715
 
716
+ #: modules/modules/modules.php:58
717
  msgid "Disabled"
718
  msgstr ""
719
 
720
+ #: modules/more-links/more-links.php:12
721
  msgid "More Link Customizer"
722
  msgstr ""
723
 
724
+ #: modules/more-links/more-links.php:27
725
  msgid "Default More Link Text"
726
  msgstr ""
727
 
728
+ #: modules/more-links/more-links.php:45
729
  msgid "More Link Text:"
730
  msgstr ""
731
 
732
+ #: modules/noindex/noindex.php:12
733
  msgid "Noindex Manager"
734
  msgstr ""
735
 
736
+ #: modules/noindex/noindex.php:39
737
  msgid ""
738
  "Note: The current <a href='options-privacy.php'>privacy settings</a> will "
739
  "block indexing of the entire site, regardless of which options are set below."
740
  msgstr ""
741
 
742
+ #: modules/noindex/noindex.php:42
743
  msgid "Prevent indexing of..."
744
  msgstr ""
745
 
746
+ #: modules/noindex/noindex.php:43
747
  msgid "Administration back-end pages"
748
  msgstr ""
749
 
750
+ #: modules/noindex/noindex.php:44
751
  msgid "Author archives"
752
  msgstr ""
753
 
754
+ #: modules/noindex/noindex.php:45
755
  msgid "Blog search pages"
756
  msgstr ""
757
 
758
+ #: modules/noindex/noindex.php:46
759
  msgid "Category archives"
760
  msgstr ""
761
 
762
+ #: modules/noindex/noindex.php:47
763
  msgid "Comment feeds"
764
  msgstr ""
765
 
766
+ #: modules/noindex/noindex.php:48
767
  msgid "Comment subpages"
768
  msgstr ""
769
 
770
+ #: modules/noindex/noindex.php:49
771
  msgid "Date-based archives"
772
  msgstr ""
773
 
774
+ #: modules/noindex/noindex.php:50
775
  msgid "Subpages of the homepage"
776
  msgstr ""
777
 
778
+ #: modules/noindex/noindex.php:51
779
  msgid "Tag archives"
780
  msgstr ""
781
 
782
+ #: modules/noindex/noindex.php:52
783
  msgid "User login/registration pages"
784
  msgstr ""
785
 
786
+ #: modules/sds-blog/sds-blog.php:12
787
  msgid "Whitepapers"
788
  msgstr ""
789
 
790
+ #: modules/sds-blog/sds-blog.php:13
791
  msgid "SEO Design Solutions Whitepapers"
792
  msgstr ""
793
 
794
+ #. #-#-#-#-# plugin.pot (SEO Ultimate 2.1) #-#-#-#-#
795
  #. Author of the plugin/theme
796
+ #: modules/sds-blog/sds-blog.php:49
797
  msgid "SEO Design Solutions"
798
  msgstr ""
799
 
800
+ #: modules/sds-blog/sds-blog.php:50
801
  msgid ""
802
+ "The search engine optimization articles below are loaded from the website of "
803
+ "SEO Design Solutions, the company behind the SEO Ultimate plugin. Click on "
804
+ "an article&#8217;s title to read it."
805
  msgstr ""
806
 
807
+ #: modules/settings/global-settings.php:18
808
+ msgid "Global Settings"
 
 
809
  msgstr ""
810
 
811
+ #: modules/settings/global-settings.php:40
812
+ msgid "Enable nofollow&#8217;d attribution link"
813
  msgstr ""
814
 
815
+ #: modules/settings/global-settings.php:41
816
+ msgid "Enable attribution link CSS styling"
817
  msgstr ""
818
 
819
+ #: modules/settings/global-settings.php:42
820
+ msgid "Notify me about unnecessary active plugins"
821
+ msgstr ""
822
+
823
+ #: modules/settings/global-settings.php:43
824
+ msgid "Insert comments around HTML code insertions"
825
+ msgstr ""
826
+
827
+ #: modules/settings/settings-data.php:16
828
+ msgid "Settings Data Manager"
829
  msgstr ""
830
 
831
+ #: modules/settings/settings-data.php:17
832
+ msgid "Manage Settings Data"
833
+ msgstr ""
834
+
835
+ #: modules/settings/settings-data.php:21 modules/settings/settings-data.php:92
836
+ msgid "Import"
837
+ msgstr ""
838
+
839
+ #: modules/settings/settings-data.php:22
840
+ msgid "Export"
841
+ msgstr ""
842
+
843
+ #: modules/settings/settings-data.php:64
844
  msgid "Settings successfully imported."
845
  msgstr ""
846
 
847
+ #: modules/settings/settings-data.php:66
848
  msgid ""
849
  "The uploaded file is not in the proper format. Settings could not be "
850
  "imported."
851
  msgstr ""
852
 
853
+ #: modules/settings/settings-data.php:68
854
  msgid "The settings file could not be uploaded successfully."
855
  msgstr ""
856
 
857
+ #: modules/settings/settings-data.php:71
858
  msgid ""
859
  "Settings could not be imported because no settings file was selected. Please "
860
  "click the &#8220;Browse&#8221; button and select a file to import."
861
  msgstr ""
862
 
863
+ #: modules/settings/settings-data.php:79
864
  msgid "All settings have been erased and defaults have been restored."
865
  msgstr ""
866
 
867
+ #: modules/settings/settings-data.php:84
868
+ msgid "Import SEO Ultimate Settings File"
869
  msgstr ""
870
 
871
+ #: modules/settings/settings-data.php:87
872
+ msgid ""
873
+ "You can use this form to upload and import an SEO Ultimate settings file "
874
+ "stored on your computer. (Settings files can be created using the Export "
875
+ "tool.)"
876
  msgstr ""
877
 
878
+ #: modules/settings/settings-data.php:91
879
+ msgid ""
880
+ "Are you sure you want to import this settings file? This will overwrite your "
881
+ "current settings and cannot be undone."
882
  msgstr ""
883
 
884
+ #: modules/settings/settings-data.php:106
885
+ msgid "Import from Other Plugins"
886
  msgstr ""
887
 
888
+ #: modules/settings/settings-data.php:108
889
+ msgid ""
890
+ "You can import settings and data from these plugins. Clicking a plugin&#8217;"
891
+ "s name will take you to the importer page, where you can customize "
892
+ "parameters and start the import."
893
  msgstr ""
894
 
895
+ #: modules/settings/settings-data.php:128
896
+ msgid ""
897
+ "You can use the export tool to download an SEO Ultimate settings file to "
898
+ "your computer."
899
  msgstr ""
900
 
901
+ #: modules/settings/settings-data.php:130
902
+ msgid ""
903
+ "A settings file includes the data of every checkbox and textbox of every "
904
+ "installed module. It does NOT include site-specific data like logged 404s or "
905
+ "post/page title/meta data (this data would be included in a standard "
906
+ "database backup, however)."
907
  msgstr ""
908
 
909
+ #: modules/settings/settings-data.php:133
910
+ msgid "Download Settings File"
911
+ msgstr ""
912
+
913
+ #: modules/settings/settings-data.php:139
914
  msgid ""
915
+ "You can erase all your SEO Ultimate settings and restore them to &#8220;"
916
+ "factory defaults&#8221; by clicking the button below."
917
  msgstr ""
918
 
919
+ #: modules/settings/settings-data.php:142
920
  msgid ""
921
+ "Are you sure you want to erase all module settings? This cannot be undone."
 
 
922
  msgstr ""
923
 
924
+ #: modules/settings/settings-data.php:143
925
+ msgid "Restore Default Settings"
926
  msgstr ""
927
 
928
+ #: modules/settings/settings.php:12
929
+ msgid "Plugin Settings"
930
  msgstr ""
931
 
932
+ #: modules/settings/settings.php:13
933
+ msgid "SEO Ultimate Plugin Settings"
934
  msgstr ""
935
 
936
+ #. #-#-#-#-# plugin.pot (SEO Ultimate 2.1) #-#-#-#-#
937
+ #. Plugin Name of the plugin/theme
938
+ #: modules/settings/settings.php:14 plugin/class.seo-ultimate.php:732
939
+ msgid "SEO Ultimate"
940
  msgstr ""
941
 
942
+ #: modules/settings/uninstall.php:17
943
+ msgid "Uninstaller"
944
  msgstr ""
945
 
946
+ #: modules/settings/uninstall.php:18 plugin/class.seo-ultimate.php:1132
947
+ msgid "Uninstall"
948
  msgstr ""
949
 
950
+ #: modules/settings/uninstall.php:27
951
  msgid ""
952
+ "Uninstalling SEO Ultimate will delete your settings and the plugin&#8217;s "
953
+ "files."
954
  msgstr ""
955
 
956
+ #: modules/settings/uninstall.php:30
957
+ msgid ""
958
+ "Are you sure you want to uninstall SEO Ultimate? This will permanently erase "
959
+ "your SEO Ultimate settings and cannot be undone."
960
  msgstr ""
961
 
962
+ #: modules/settings/uninstall.php:31
963
+ msgid "Uninstall Now"
964
  msgstr ""
965
 
966
+ #: modules/settings/uninstall.php:35 modules/settings/uninstall.php:42
967
+ msgid "Uninstall SEO Ultimate"
 
 
 
968
  msgstr ""
969
 
970
+ #: modules/settings/uninstall.php:46
971
+ msgid "Deleted settings."
972
+ msgstr ""
973
+
974
+ #: modules/settings/uninstall.php:53
975
+ msgid "An error occurred while deleting files."
976
+ msgstr ""
977
+
978
+ #: modules/settings/uninstall.php:55
979
+ msgid "Deleted files."
980
+ msgstr ""
981
+
982
+ #: modules/settings/uninstall.php:56
983
+ msgid "Uninstallation complete. Thanks for trying SEO Ultimate."
984
+ msgstr ""
985
+
986
+ #: modules/site-keyword-queries/site-keyword-queries.php:12
987
  msgid "Internal Relevance Researcher"
988
  msgstr ""
989
 
990
+ #: modules/site-keyword-queries/site-keyword-queries.php:13
991
  msgid "Int. Rel. Researcher"
992
  msgstr ""
993
 
994
+ #: modules/site-keyword-queries/site-keyword-queries.php:21
995
  msgid "Step 1: Enter Keywords"
996
  msgstr ""
997
 
998
+ #: modules/site-keyword-queries/site-keyword-queries.php:23
999
  msgid "(Type one keyword per line)"
1000
  msgstr ""
1001
 
1002
+ #: modules/site-keyword-queries/site-keyword-queries.php:25
1003
  msgid "Step 2: Set Options and Submit"
1004
  msgstr ""
1005
 
1006
+ #: modules/site-keyword-queries/site-keyword-queries.php:27
1007
  msgid "Put keywords in quotes"
1008
  msgstr ""
1009
 
1010
+ #: modules/slugs/slugs.php:12
1011
  msgid "Slug Optimizer"
1012
  msgstr ""
1013
 
1014
+ #: modules/slugs/slugs.php:16
1015
  msgid "Words to Remove"
1016
  msgstr ""
1017
 
1018
+ #: modules/titles/titles-formats.php:14
1019
  msgid "Title Rewriter Formats"
1020
  msgstr ""
1021
 
1022
+ #: modules/titles/titles-formats.php:15
1023
  msgid "Default Formats"
1024
  msgstr ""
1025
 
1026
+ #: modules/titles/titles-posts.php:16
1027
  msgid "Post Title Editor"
1028
  msgstr ""
1029
 
1030
+ #: modules/titles/titles-posts.php:23
1031
  msgid "Posts"
1032
  msgstr ""
1033
 
1034
+ #: modules/titles/titles-posts.php:24
1035
  msgid "Pages"
1036
  msgstr ""
1037
 
1038
+ #: modules/titles/titles-posts.php:25
1039
  msgid "Attachments"
1040
  msgstr ""
1041
 
1042
+ #: modules/titles/titles-taxonomies.php:16
1043
  msgid "Taxonomy Title Editor"
1044
  msgstr ""
1045
 
1046
+ #: modules/titles/titles-taxonomies.php:23
1047
  msgid "Categories"
1048
  msgstr ""
1049
 
1050
+ #: modules/titles/titles-taxonomies.php:24
1051
  msgid "Post Tags"
1052
  msgstr ""
1053
 
1054
+ #: modules/titles/titles.php:12
1055
  msgid "Title Rewriter"
1056
  msgstr ""
1057
 
1058
+ #: modules/titles/titles.php:24
1059
  msgid "{blog}"
1060
  msgstr ""
1061
 
1062
+ #: modules/titles/titles.php:25
1063
  msgid "{post} | {blog}"
1064
  msgstr ""
1065
 
1066
+ #: modules/titles/titles.php:26
1067
  msgid "{page} | {blog}"
1068
  msgstr ""
1069
 
1070
+ #: modules/titles/titles.php:27
1071
  msgid "{category} | {blog}"
1072
  msgstr ""
1073
 
1074
+ #: modules/titles/titles.php:28
1075
  msgid "{tag} | {blog}"
1076
  msgstr ""
1077
 
1078
+ #: modules/titles/titles.php:29
1079
  msgid "Archives for {month} {day}, {year} | {blog}"
1080
  msgstr ""
1081
 
1082
+ #: modules/titles/titles.php:30
1083
  msgid "Archives for {month} {year} | {blog}"
1084
  msgstr ""
1085
 
1086
+ #: modules/titles/titles.php:31
1087
  msgid "Archives for {year} | {blog}"
1088
  msgstr ""
1089
 
1090
+ #: modules/titles/titles.php:32
1091
  msgid "Posts by {author} | {blog}"
1092
  msgstr ""
1093
 
1094
+ #: modules/titles/titles.php:33
1095
  msgid "Search Results for {query} | {blog}"
1096
  msgstr ""
1097
 
1098
+ #: modules/titles/titles.php:34
1099
  msgid "404 Not Found | {blog}"
1100
  msgstr ""
1101
 
1102
+ #: modules/titles/titles.php:35
1103
  msgid "{title} - Page {num}"
1104
  msgstr ""
1105
 
1106
+ #: modules/titles/titles.php:41
1107
  msgid "Blog Homepage Title"
1108
  msgstr ""
1109
 
1110
+ #: modules/titles/titles.php:42
1111
  msgid "Post Title Format"
1112
  msgstr ""
1113
 
1114
+ #: modules/titles/titles.php:43
1115
  msgid "Page Title Format"
1116
  msgstr ""
1117
 
1118
+ #: modules/titles/titles.php:44
1119
  msgid "Category Title Format"
1120
  msgstr ""
1121
 
1122
+ #: modules/titles/titles.php:45
1123
  msgid "Tag Title Format"
1124
  msgstr ""
1125
 
1126
+ #: modules/titles/titles.php:46
1127
  msgid "Day Archive Title Format"
1128
  msgstr ""
1129
 
1130
+ #: modules/titles/titles.php:47
1131
  msgid "Month Archive Title Format"
1132
  msgstr ""
1133
 
1134
+ #: modules/titles/titles.php:48
1135
  msgid "Year Archive Title Format"
1136
  msgstr ""
1137
 
1138
+ #: modules/titles/titles.php:49
1139
  msgid "Author Archive Title Format"
1140
  msgstr ""
1141
 
1142
+ #: modules/titles/titles.php:50
1143
  msgid "Search Title Format"
1144
  msgstr ""
1145
 
1146
+ #: modules/titles/titles.php:51
1147
  msgid "404 Title Format"
1148
  msgstr ""
1149
 
1150
+ #: modules/titles/titles.php:52
1151
  msgid "Pagination Title Format"
1152
  msgstr ""
1153
 
1154
+ #: modules/titles/titles.php:268
 
 
 
 
1155
  msgid "Post"
1156
  msgstr ""
1157
 
1158
+ #: modules/titles/titles.php:272
1159
  msgid "Page"
1160
  msgstr ""
1161
 
1162
+ #: modules/titles/titles.php:344
1163
  msgid "ID"
1164
  msgstr ""
1165
 
1166
+ #: modules/titles/titles.php:344
1167
  msgid "Name"
1168
  msgstr ""
1169
 
1170
+ #: modules/titles/titles.php:344
1171
  msgid "Title Tag"
1172
  msgstr ""
1173
 
1174
+ #: modules/titles/titles.php:417
1175
+ msgid "Title Tag:"
1176
+ msgstr ""
1177
+
1178
+ #: modules/titles/titles.php:422
1179
  msgid ""
1180
  "<strong>Title Tag</strong> &mdash; The exact contents of the &lt;title&gt; "
1181
  "tag. The title appears in visitors' title bars and in search engine result "
1182
  "titles. "
1183
  msgstr ""
1184
 
1185
+ #: plugin/class.seo-ultimate.php:732
1186
  msgid "SEO"
1187
  msgstr ""
1188
 
1189
+ #: plugin/class.seo-ultimate.php:1009
1190
  msgid "SEO Settings Help"
1191
  msgstr ""
1192
 
1193
+ #: plugin/class.seo-ultimate.php:1011
1194
  msgid "The SEO Settings box lets you customize these settings:"
1195
  msgstr ""
1196
 
1197
+ #: plugin/class.seo-ultimate.php:1013
1198
  msgid "(The SEO Settings box is part of the SEO Ultimate plugin.)"
1199
  msgstr ""
1200
 
1201
+ #: plugin/class.seo-ultimate.php:1068
1202
  #, php-format
1203
  msgid ""
1204
  "SEO Ultimate includes the functionality of %1$s. You may want to deactivate %"
1205
  "1$s to avoid plugin conflicts."
1206
  msgstr ""
1207
 
1208
+ #: plugin/class.seo-ultimate.php:1152
1209
+ msgid "Active Modules: "
1210
+ msgstr ""
1211
+
1212
+ #: plugin/class.seo-ultimate.php:1213
1213
  msgid ""
1214
  "<strong>SEO Ultimate Notice:</strong> Your blog is configured to block "
1215
  "search engine spiders. To resolve this, <a href='options-privacy.php' "
1217
  "everyone."
1218
  msgstr ""
1219
 
1220
+ #: plugin/class.seo-ultimate.php:1321
1221
  msgid "SEO Settings"
1222
  msgstr ""
1223
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1224
  #. Plugin URI of the plugin/theme
1225
  msgid "http://www.seodesignsolutions.com/wordpress-seo/"
1226
  msgstr ""