SEO Ultimate - Version 2.5

Version Description

Download this release

Release Info

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

Code changes from version 2.4 to 2.5

includes/jlwp/functions.php CHANGED
@@ -70,6 +70,14 @@ class suwp {
70
  return $rss;
71
  }
72
 
 
 
 
 
 
 
 
 
73
  /**
74
  * @return string
75
  */
@@ -95,6 +103,30 @@ class suwp {
95
  return get_edit_tag_link($id, $taxonomy);
96
  }
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  function remove_instance_action($tag, $class, $function, $priority=10) {
99
  return suwp::remove_instance_filter($tag, $class, $function, $priority);
100
  }
70
  return $rss;
71
  }
72
 
73
+ /**
74
+ * @return string
75
+ */
76
+ function add_backup_url($text) {
77
+ $anchor = __('backup your database', 'seo-ultimate');
78
+ return str_replace($anchor, '<a href="'.suwp::get_backup_url().'" target="_blank">'.$anchor.'</a>', $text);
79
+ }
80
+
81
  /**
82
  * @return string
83
  */
103
  return get_edit_tag_link($id, $taxonomy);
104
  }
105
 
106
+ function get_all_the_terms($id = 0) {
107
+
108
+ $id = (int)$id;
109
+
110
+ if ($id) {
111
+ $post = get_post($id);
112
+ if (!$post) return false;
113
+ } else {
114
+ if (!in_the_loop()) return false;
115
+ global $post;
116
+ $id = (int)$post->ID;
117
+ }
118
+
119
+ $taxonomies = get_object_taxonomies($post);
120
+ $terms = array();
121
+
122
+ foreach ($taxonomies as $taxonomy) {
123
+ $newterms = get_the_terms($id, $taxonomy);
124
+ if ($newterms) $terms = array_merge($terms, $newterms);
125
+ }
126
+
127
+ return $terms;
128
+ }
129
+
130
  function remove_instance_action($tag, $class, $function, $priority=10) {
131
  return suwp::remove_instance_filter($tag, $class, $function, $priority);
132
  }
modules/class.su-module.php CHANGED
@@ -646,7 +646,9 @@ class SU_Module {
646
  function get_setting($key, $default=null, $module=null) {
647
  if (!$module) $module = $this->get_settings_key();
648
 
649
- if (isset($this->plugin->dbdata['settings'][$module][$key]))
 
 
650
  $setting = $this->plugin->dbdata['settings'][$module][$key];
651
  else
652
  $setting = $default;
@@ -1434,19 +1436,6 @@ class SU_Module {
1434
  $this->textareas(array($id => $title), $rows, $cols);
1435
  }
1436
 
1437
- /**
1438
- * Outputs <option> tags.
1439
- *
1440
- * @since 2.4
1441
- */
1442
- function dropdown_options($options, $current = null) {
1443
- foreach ($options as $value => $label) {
1444
- echo "<option value='$value'";
1445
- selected($value, $current);
1446
- echo ">$label</option>";
1447
- }
1448
- }
1449
-
1450
  /********** ADMIN SECURITY FUNCTIONS **********/
1451
 
1452
  /**
@@ -1656,7 +1645,7 @@ class SU_Module {
1656
  $id = "_su_".su_esc_attr($id);
1657
  $title = str_replace(' ', '&nbsp;', $title);
1658
 
1659
- $html .= "<tr class='textbox'>\n<th scope='row'><label for='$id'>$title</label></th>\n"
1660
  ."<td><input name='$id' id='$id' type='text' value='$value' class='regular-text' tabindex='2' /></td>\n</tr>\n";
1661
  }
1662
 
@@ -1689,7 +1678,8 @@ class SU_Module {
1689
  */
1690
  function get_postmeta_checkboxes($checkboxes, $grouptext) {
1691
 
1692
- $html = "<tr>\n<th scope='row'>$grouptext</th>\n<td><fieldset><legend class='hidden'>$grouptext</legend>\n";
 
1693
 
1694
  if (is_array($checkboxes)) {
1695
  foreach ($checkboxes as $name => $desc) {
@@ -1724,6 +1714,52 @@ class SU_Module {
1724
  return $this->get_postmeta_checkboxes(array($id => $title), $grouptext);
1725
  }
1726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1727
 
1728
  /********** CRON FUNCTION **********/
1729
 
646
  function get_setting($key, $default=null, $module=null) {
647
  if (!$module) $module = $this->get_settings_key();
648
 
649
+ if (isset($this->plugin->dbdata['settings']
650
+ , $this->plugin->dbdata['settings'][$module]
651
+ , $this->plugin->dbdata['settings'][$module][$key]))
652
  $setting = $this->plugin->dbdata['settings'][$module][$key];
653
  else
654
  $setting = $default;
1436
  $this->textareas(array($id => $title), $rows, $cols);
1437
  }
1438
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1439
  /********** ADMIN SECURITY FUNCTIONS **********/
1440
 
1441
  /**
1645
  $id = "_su_".su_esc_attr($id);
1646
  $title = str_replace(' ', '&nbsp;', $title);
1647
 
1648
+ $html .= "<tr class='textbox' valign='middle'>\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
 
1678
  */
1679
  function get_postmeta_checkboxes($checkboxes, $grouptext) {
1680
 
1681
+ $valign = (is_array($checkboxes) && count($checkboxes)) ? 'top' : 'middle';
1682
+ $html = "<tr class='checkboxes' valign='$valign'>\n<th scope='row'>$grouptext</th>\n<td><fieldset><legend class='hidden'>$grouptext</legend>\n";
1683
 
1684
  if (is_array($checkboxes)) {
1685
  foreach ($checkboxes as $name => $desc) {
1714
  return $this->get_postmeta_checkboxes(array($id => $title), $grouptext);
1715
  }
1716
 
1717
+ /**
1718
+ * Generates the HTML for a single <select> post meta dropdown.
1719
+ *
1720
+ * @since 2.5
1721
+ * @uses get_module_key()
1722
+ * @uses get_postmeta()
1723
+ *
1724
+ * @param string $name The name of the <select> element.
1725
+ * @param array $options An array of options, where the array keys are the <option> values and the array values are the labels (<option> contents).
1726
+ * @param string $grouptext The text to display in a table cell to the left of the one containing the dropdown.
1727
+ * @return string $html
1728
+ */
1729
+ function get_postmeta_dropdown($name, $options, $grouptext) {
1730
+
1731
+ register_setting('seo-ultimate', $name);
1732
+ $current = $this->get_postmeta($name);
1733
+ $name = "_su_".su_esc_attr($name);
1734
+
1735
+ $html = "<tr class='dropdown' valign='middle'>\n<th scope='row'>$grouptext</th>\n<td><fieldset><legend class='hidden'>$grouptext</legend>\n";
1736
+ $html .= "<select name='$name' id='$name' onchange='javascript:su_toggle_select_children(this)'>";
1737
+ $html .= suhtml::option_tags($options, $current);
1738
+ $html .= "</select>\n";
1739
+ $html .= "</fieldset></td>\n</tr>\n";
1740
+
1741
+ return $html;
1742
+ }
1743
+
1744
+ /**
1745
+ * Turns a <tr> into a post meta subsection.
1746
+ *
1747
+ * @since 2.5
1748
+ * @uses get_postmeta
1749
+ *
1750
+ * @param string $field
1751
+ * @param string $value
1752
+ * @param string $html
1753
+ * @return string $html
1754
+ */
1755
+ function get_postmeta_subsection($field, $value, $html) {
1756
+ $hidden = ($this->get_postmeta($field) == $value) ? '' : ' hidden';
1757
+
1758
+ $field = su_esc_attr($field);
1759
+ $value = su_esc_attr($value);
1760
+ $html = str_replace('<tr ', "<tr class='su_{$field}_{$value}_subsection$hidden' ", $html);
1761
+ return $html;
1762
+ }
1763
 
1764
  /********** CRON FUNCTION **********/
1765
 
modules/settings/install.css ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .su-xgrade table.form-table ul {
2
+ list-style-type: disc;
3
+ padding: 0 0 0 2em;
4
+ margin: 0 0 2em 2em;
5
+ }
6
+
7
+ .su-xgrade table.form-table li {
8
+ padding-top: 0;
9
+ padding-bottom: 0;
10
+ margin-top: 0;
11
+ margin-bottom: 0;
12
+ }
13
+
14
+ .su-xgrade label {
15
+ padding: 0.5em 1em;
16
+ }
17
+
18
+ .su-xgrade label.first {
19
+ background-color: #DFFFE3;
20
+ }
21
+
22
+ .su-xgrade label.current-setting {
23
+ background-color: #FFFFE0;
24
+ }
modules/settings/install.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Install Module
4
+ *
5
+ * @since 2.5
6
+ */
7
+
8
+ if (class_exists('SU_Module')) {
9
+
10
+ define('SU_DOWNGRADE_LIMIT', '2.5');
11
+
12
+ class SU_Install extends SU_Module {
13
+
14
+ function get_parent_module() { return 'settings'; }
15
+ function get_child_order() { return 20; }
16
+ function is_independent_module() { return false; }
17
+
18
+ function get_module_title() { return __('Upgrade/Downgrade/Reinstall', 'seo-ultimate'); }
19
+ function get_menu_title() { return __('Installer', 'seo-ultimate'); }
20
+
21
+ function get_admin_page_tabs() {
22
+ return array(
23
+ __('Upgrade', 'seo-ultimate') => 'upgrade_tab'
24
+ , __('Downgrade', 'seo-ultimate') => 'downgrade_tab'
25
+ );
26
+ }
27
+
28
+ function init() {
29
+ if ($this->is_action('update')) {
30
+ add_filter('su_custom_admin_page-settings', array(&$this, 'do_installation'));
31
+ }
32
+ }
33
+
34
+ function upgrade_tab() {
35
+
36
+ $radiobuttons = $this->get_version_radiobuttons(SU_VERSION, false);
37
+ if (is_array($radiobuttons)) {
38
+ if (count($radiobuttons) > 1) {
39
+
40
+ echo "\n<p>";
41
+ _e("From the list below, select the version to which you would like to upgrade. Then click the &#8220;Upgrade&#8221; button at the bottom of the screen.", 'seo-ultimate');
42
+ echo "</p>\n";
43
+
44
+ echo "<div class='su-xgrade'>\n";
45
+ $this->admin_form_start();
46
+ $this->radiobuttons('version', $radiobuttons);
47
+ $this->admin_form_end(__('Upgrade', 'seo-ultimate'));
48
+ echo "</div>\n";
49
+ } else
50
+ $this->print_message('success', __("You are already running the latest version.", 'seo-ultimate'));
51
+ } else
52
+ $this->print_message('error', __("There was an error retrieving the list of available versions. Please try again later. You can also upgrade to the latest version of SEO Ultimate using the WordPress plugin upgrader.", 'seo-ultimate'));
53
+ }
54
+
55
+ function downgrade_tab() {
56
+
57
+ $radiobuttons = $this->get_version_radiobuttons(SU_DOWNGRADE_LIMIT, SU_VERSION);
58
+ if (is_array($radiobuttons)) {
59
+ if (count($radiobuttons) > 1) {
60
+
61
+ $this->print_message('warning', suwp::add_backup_url(__("Downgrading is provided as a convenience only and is not officially supported. Although unlikely, you may lose data in the downgrading process. It is your responsibility to backup your database before proceeding.", 'seo-ultimate')));
62
+
63
+ echo "\n<p>";
64
+ _e("From the list below, select the version to which you would like to downgrade. Then click the &#8220;Downgrade&#8221; button at the bottom of the screen.", 'seo-ultimate');
65
+ echo "</p>\n";
66
+
67
+ echo "<div class='su-xgrade'>\n";
68
+ $this->admin_form_start();
69
+ $this->radiobuttons('version', $radiobuttons);
70
+ $this->admin_form_end(__('Downgrade', 'seo-ultimate'));
71
+ echo "</div>\n";
72
+ } else
73
+ $this->print_message('warning', sprintf(__("Downgrading to versions earlier than %s is not supported.", 'seo-ultimate'), SU_DOWNGRADE_LIMIT));
74
+ } else
75
+ $this->print_message('error', __("There was an error retrieving the list of available versions. Please try again later.", 'seo-ultimate'));
76
+ }
77
+
78
+ function get_version_radiobuttons($min, $max) {
79
+
80
+ $this->update_setting('version', SU_VERSION);
81
+
82
+ $trunk_readme = suwp::load_webpage('http://plugins.trac.wordpress.org/browser/seo-ultimate/trunk/readme.txt?format=txt', SU_USER_AGENT);
83
+ if (!$trunk_readme) return false;
84
+ $trunk_changelog = sumd::get_section($trunk_readme, 'Changelog');
85
+ $versions = sumd::get_sections($trunk_changelog);
86
+
87
+ if (count($versions)) {
88
+
89
+ $radiobuttons = array();
90
+ $first = true;
91
+ foreach ($versions as $title => $changes) {
92
+ if (preg_match('|Version ([0-9.]{3,9}) |', $title, $matches)) {
93
+ $version = $matches[1];
94
+
95
+ if ($max && version_compare($version, $max, '>')) continue;
96
+ if ($min && version_compare($version, $min, '<')) break;
97
+
98
+ $changes = wptexturize(Markdown($changes));
99
+ if ($version == SU_VERSION)
100
+ $message = __('Current Version', 'seo-ultimate');
101
+ elseif ($first)
102
+ $message = __('Latest Version', 'seo-ultimate');
103
+ else
104
+ $message = '';
105
+ if ($message) $message = " &mdash; <em>$message</em>";
106
+
107
+ $radiobuttons[$version] = "<strong>$title</strong>$message</label>\n$changes\n";
108
+
109
+ $first = false;
110
+ }
111
+ }
112
+
113
+ return $radiobuttons;
114
+ }
115
+
116
+ return false; //Error
117
+ }
118
+
119
+ function do_installation() {
120
+
121
+ if ( ! current_user_can('update_plugins') )
122
+ wp_die(__('You do not have sufficient permissions to upgrade/downgrade plugins for this blog.', 'seo-ultimate'));
123
+
124
+ $nv = sustr::preg_filter('[0-9a-zA-Z .]', $_POST['version']);
125
+ if (!strlen($nv)) return false;
126
+
127
+ //Don't allow downgrading to anything below the minimum limit
128
+ if (version_compare(SU_DOWNGRADE_LIMIT, $nv)) return;
129
+
130
+ switch (version_compare($nv, SU_VERSION)) {
131
+ case -1: //Downgrade
132
+ $title = __('Downgrade to SEO Ultimate %s', 'seo-ultimate');
133
+ break;
134
+ case 0: //Reinstall
135
+ $title = __('Reinstall SEO Ultimate %s', 'seo-ultimate');
136
+ break;
137
+ case 1: //Upgrade
138
+ $title = __('Upgrade to SEO Ultimate %s', 'seo-ultimate');
139
+ }
140
+
141
+ $title = sprintf($title, $nv);
142
+ $nonce = 'su-install-plugin';
143
+ $plugin = 'seo-ultimate/seo-ultimate.php';
144
+ $url = 'update.php?action=upgrade-plugin&plugin='.$plugin;
145
+
146
+ include_once $this->plugin->plugin_dir_path.'plugin/class.su-installer.php';
147
+
148
+ $upgrader = new SU_Installer( new SU_Installer_Skin( compact('title', 'nonce', 'url', 'plugin') ) );
149
+ $upgrader->upgrade($plugin, SU_VERSION, $nv);
150
+
151
+ return true;
152
+ }
153
+ }
154
+
155
+ }
156
+ ?>
plugin/class.su-installer.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
3
+
4
+ class SU_Installer extends Plugin_Upgrader {
5
+
6
+ function su_strings($cv, $nv) {
7
+
8
+ //Generic
9
+ $this->strings['no_package'] = __('Package not available.', 'seo-ultimate');
10
+
11
+ //Upgrade
12
+ $this->strings['remove_old'] = __('Removing the current version of the plugin&#8230;', 'seo-ultimate');
13
+ $this->strings['remove_old_failed'] = __('Could not remove the current version of the plugin.', 'seo-ultimate');
14
+
15
+ switch (version_compare($nv, $cv)) {
16
+ case -1: //Downgrade
17
+ $this->strings['downloading_package'] = __('Downloading old version from <span class="code">%s</span>&#8230;', 'seo-ultimate');
18
+ $this->strings['unpack_package'] = __('Unpacking the downgrade&#8230;', 'seo-ultimate');
19
+ $this->strings['installing_package'] = __('Installing the downgrade&#8230;', 'seo-ultimate');
20
+ $this->strings['process_failed'] = __('Plugin downgrade failed.', 'seo-ultimate');
21
+ $this->strings['process_success'] = __('Plugin downgraded successfully.', 'seo-ultimate');
22
+ break;
23
+ case 0: //Reinstall
24
+ $this->strings['downloading_package'] = __('Downloading from <span class="code">%s</span>&#8230;', 'seo-ultimate');
25
+ $this->strings['unpack_package'] = __('Unpacking the reinstall&#8230;', 'seo-ultimate');
26
+ $this->strings['installing_package'] = __('Reinstalling the current version&#8230;', 'seo-ultimate');
27
+ $this->strings['process_failed'] = __('Plugin reinstallation failed.', 'seo-ultimate');
28
+ $this->strings['process_success'] = __('Plugin reinstalled successfully.', 'seo-ultimate');
29
+ break;
30
+ case 1: //Upgrade
31
+ default:
32
+ $this->strings['downloading_package'] = __('Downloading upgrade from <span class="code">%s</span>&#8230;', 'seo-ultimate');
33
+ $this->strings['unpack_package'] = __('Unpacking the upgrade&#8230;', 'seo-ultimate');
34
+ $this->strings['installing_package'] = __('Installing the upgrade&#8230;', 'seo-ultimate');
35
+ $this->strings['process_failed'] = __('Plugin upgrade failed.', 'seo-ultimate');
36
+ $this->strings['process_success'] = __('Plugin upgraded successfully.', 'seo-ultimate');
37
+ break;
38
+ }
39
+ }
40
+
41
+ function upgrade($plugin, $cv, $nv) {
42
+
43
+ $this->init();
44
+ $this->upgrade_strings();
45
+ $this->su_strings($cv, $nv);
46
+
47
+ add_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade'), 10, 2);
48
+ add_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'), 10, 4);
49
+
50
+ $this->run(array(
51
+ 'package' => "http://downloads.wordpress.org/plugin/seo-ultimate.$nv.zip",
52
+ 'destination' => WP_PLUGIN_DIR,
53
+ 'clear_destination' => true,
54
+ 'clear_working' => true,
55
+ 'hook_extra' => array(
56
+ 'plugin' => $plugin
57
+ )
58
+ ));
59
+
60
+ // Cleanup our hooks, incase something else does a upgrade on this connection.
61
+ remove_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade'));
62
+ remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'));
63
+
64
+ if ( ! $this->result || is_wp_error($this->result) )
65
+ return $this->result;
66
+
67
+ // Force refresh of plugin update information
68
+ delete_site_transient('update_plugins');
69
+ }
70
+ }
71
+
72
+ class SU_Installer_Skin extends Plugin_Upgrader_Skin {
73
+
74
+ function header() {
75
+ if ( $this->done_header )
76
+ return;
77
+ $this->done_header = true;
78
+ echo '<div class="wrap">';
79
+ echo screen_icon('plugins');
80
+ echo '<h2>' . $this->options['title'] . '</h2>';
81
+ }
82
+
83
+ }
84
+ ?>
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, robots, noindex, nofollow, 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.4
7
 
8
  This all-in-one SEO plugin gives you control over titles, noindex/nofollow, meta tags, slugs, canonical tags, "more" links, 404 errors, and more.
9
 
@@ -11,9 +11,11 @@ This all-in-one SEO plugin gives you control over titles, noindex/nofollow, meta
11
 
12
  = Recent Releases =
13
 
 
14
  * Version 2.4 adds a nofollow option for Deeplink Juggernaut links
15
  * Version 2.3 adds per-post noindex/nofollow toggles
16
  * Version 2.2 adds a links-per-post limiter for Deeplink Juggernaut
 
17
 
18
  = Features =
19
 
@@ -93,11 +95,12 @@ SEO Ultimate is an all-in-one [SEO](http://www.seodesignsolutions.com/) plugin w
93
  * If you choose to delete SEO Ultimate from within the WordPress plugin manager, SEO Ultimate will remove all its settings from your database.
94
  * Includes icon integration with the WordPress 2.7+ menu and the Ozh Admin Drop Down Menu plugin.
95
  * Uses WordPress plugin security features like nonces, etc.
 
96
 
97
  * **Features Coming Soon**
98
  * Automatic XHTML validation checking
99
  * Nofollow options
100
- * Title tag editing for attachments
101
  * ...And much, much more! Install SEO Ultimate today and use WordPress's automatic plugin updater to get new features as they're released.
102
 
103
  [**Download**](http://downloads.wordpress.org/plugin/seo-ultimate.zip) **your free copy of SEO Ultimate today.**
@@ -588,6 +591,10 @@ Frequently asked questions, documentation, and troubleshooting tips for SEO Ulti
588
 
589
  == Changelog ==
590
 
 
 
 
 
591
  = Version 2.4 (May 28, 2010) =
592
  * Feature: Added nofollow option for Deeplink Juggernaut links
593
 
1
  === SEO Ultimate ===
2
  Contributors: SEO Design Solutions
3
+ Tags: seo, google, yahoo, bing, search engines, admin, post, page, modules, title, meta, robots, noindex, nofollow, canonical, 404, robots.txt, htaccess, slugs, url, anchor, more, link, excerpt, permalink, links, autolinks, categories, uninstallable, downgradable
4
  Requires at least: 2.8
5
+ Tested up to: 3.0
6
+ Stable tag: 2.5
7
 
8
  This all-in-one SEO plugin gives you control over titles, noindex/nofollow, meta tags, slugs, canonical tags, "more" links, 404 errors, and more.
9
 
11
 
12
  = Recent Releases =
13
 
14
+ * Version 2.5 adds advanced plugin upgrade/downgrade functionality
15
  * Version 2.4 adds a nofollow option for Deeplink Juggernaut links
16
  * Version 2.3 adds per-post noindex/nofollow toggles
17
  * Version 2.2 adds a links-per-post limiter for Deeplink Juggernaut
18
+ * Version 2.1 adds a 404 Monitor overhaul and many other improvements
19
 
20
  = Features =
21
 
95
  * If you choose to delete SEO Ultimate from within the WordPress plugin manager, SEO Ultimate will remove all its settings from your database.
96
  * Includes icon integration with the WordPress 2.7+ menu and the Ozh Admin Drop Down Menu plugin.
97
  * Uses WordPress plugin security features like nonces, etc.
98
+ * Lets you upgrade/downgrade the plugin to versions of your choosing (starting with 2.5).
99
 
100
  * **Features Coming Soon**
101
  * Automatic XHTML validation checking
102
  * Nofollow options
103
+ * Title rewriting for attachments and custom post types
104
  * ...And much, much more! Install SEO Ultimate today and use WordPress's automatic plugin updater to get new features as they're released.
105
 
106
  [**Download**](http://downloads.wordpress.org/plugin/seo-ultimate.zip) **your free copy of SEO Ultimate today.**
591
 
592
  == Changelog ==
593
 
594
+ = Version 2.5 (June 1, 2010) =
595
+ * Feature: Users can now upgrade/downgrade SEO Ultimate to versions of their choosing starting with 2.5
596
+ * Bugfix: Fixed "string offset" fatal error
597
+
598
  = Version 2.4 (May 28, 2010) =
599
  * Feature: Added nofollow option for Deeplink Juggernaut links
600
 
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 title tags, noindex/nofollow, meta tags, slugs, canonical tags, "more" links, 404 errors, and more.
6
- Version: 2.4
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.4
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.4");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
- define("SU_USER_AGENT", "SeoUltimate/2.4");
45
 
46
  /********** INCLUDES **********/
47
 
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 title tags, noindex/nofollow, meta tags, slugs, canonical tags, "more" links, 404 errors, and more.
6
+ Version: 2.5
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.5
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.5");
42
  define("SU_AUTHOR", "SEO Design Solutions");
43
  define("SU_AUTHOR_URI", "http://www.seodesignsolutions.com/");
44
+ define("SU_USER_AGENT", "SeoUltimate/2.5");
45
 
46
  /********** INCLUDES **********/
47
 
seo-ultimate.pot CHANGED
@@ -1,4 +1,4 @@
1
- # Translation of the WordPress plugin SEO Ultimate 2.2 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 2.2\n"
10
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
11
- "POT-Creation-Date: 2010-05-24 21:13+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"
@@ -31,6 +31,10 @@ msgstr ""
31
  msgid "%s, and %s"
32
  msgstr ""
33
 
 
 
 
 
34
  #: modules/404s/fofs-log.php:16
35
  msgid "404 Monitor Log"
36
  msgstr ""
@@ -171,21 +175,25 @@ msgstr ""
171
  msgid "Content Links"
172
  msgstr ""
173
 
174
- #: modules/autolinks/content-autolinks.php:74
175
  msgid ""
176
  "The Deeplink Juggernaut can automatically link post/page anchor text to "
177
  "given URLs. This is a preview beta version. More functionality will be added "
178
  "in future releases of SEO Ultimate."
179
  msgstr ""
180
 
181
- #: modules/autolinks/content-autolinks.php:93
182
  msgid "Anchor Text"
183
  msgstr ""
184
 
185
- #: modules/autolinks/content-autolinks.php:94
186
  msgid "URL"
187
  msgstr ""
188
 
 
 
 
 
189
  #: modules/canonical/canonical.php:12
190
  msgid "Canonicalizer"
191
  msgstr ""
@@ -231,21 +239,21 @@ msgid ""
231
  "SEO Ultimate and may be outdated.)"
232
  msgstr ""
233
 
234
- #: modules/class.su-module.php:942
235
  #, php-format
236
  msgid "%s %s|Dropdown Title"
237
  msgstr ""
238
 
239
- #: modules/class.su-module.php:970
240
  #, php-format
241
  msgid "%1$s | %2$s %3$s by %4$s"
242
  msgstr ""
243
 
244
- #: modules/class.su-module.php:1004
245
  msgid "Settings updated."
246
  msgstr ""
247
 
248
- #: modules/class.su-module.php:1024
249
  msgid "Save Changes"
250
  msgstr ""
251
 
@@ -665,7 +673,7 @@ msgid "Custom Header Code"
665
  msgstr ""
666
 
667
  #: modules/meta/meta.php:97
668
- msgid "Description:"
669
  msgstr ""
670
 
671
  #: modules/meta/meta.php:100
@@ -674,7 +682,7 @@ msgid "You&#8217;ve entered %s characters. Most search engines use up to 160."
674
  msgstr ""
675
 
676
  #: modules/meta/meta.php:102
677
- msgid "Keywords:<br /><em>(separate with commas)</em>"
678
  msgstr ""
679
 
680
  #: modules/meta/meta.php:109
@@ -804,6 +812,18 @@ msgstr ""
804
  msgid "User login/registration pages"
805
  msgstr ""
806
 
 
 
 
 
 
 
 
 
 
 
 
 
807
  #: modules/sds-blog/sds-blog.php:12
808
  msgid "Whitepapers"
809
  msgstr ""
@@ -812,7 +832,7 @@ msgstr ""
812
  msgid "SEO Design Solutions Whitepapers"
813
  msgstr ""
814
 
815
- #. #-#-#-#-# plugin.pot (SEO Ultimate 2.2) #-#-#-#-#
816
  #. Author of the plugin/theme
817
  #: modules/sds-blog/sds-blog.php:49
818
  msgid "SEO Design Solutions"
@@ -845,6 +865,93 @@ msgstr ""
845
  msgid "Insert comments around HTML code insertions"
846
  msgstr ""
847
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
848
  #: modules/settings/settings-data.php:16
849
  msgid "Settings Data Manager"
850
  msgstr ""
@@ -954,7 +1061,7 @@ msgstr ""
954
  msgid "SEO Ultimate Plugin Settings"
955
  msgstr ""
956
 
957
- #. #-#-#-#-# plugin.pot (SEO Ultimate 2.2) #-#-#-#-#
958
  #. Plugin Name of the plugin/theme
959
  #: modules/settings/settings.php:14 plugin/class.seo-ultimate.php:723
960
  msgid "SEO Ultimate"
@@ -1242,14 +1349,90 @@ msgstr ""
1242
  msgid "SEO Settings"
1243
  msgstr ""
1244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1245
  #. Plugin URI of the plugin/theme
1246
  msgid "http://www.seodesignsolutions.com/wordpress-seo/"
1247
  msgstr ""
1248
 
1249
  #. Description of the plugin/theme
1250
  msgid ""
1251
- "This all-in-one SEO plugin gives you control over title tags, noindex, meta "
1252
- "data, slugs, canonical tags, \"more\" links, 404 error tracking, and more."
 
1253
  msgstr ""
1254
 
1255
  #. Author URI of the plugin/theme
1
+ # Translation of the WordPress plugin SEO Ultimate 2.5 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.5\n"
10
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/seo-ultimate\n"
11
+ "POT-Creation-Date: 2010-06-01 14:30+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"
31
  msgid "%s, and %s"
32
  msgstr ""
33
 
34
+ #: includes/jlwp/functions.php:77
35
+ msgid "backup your database"
36
+ msgstr ""
37
+
38
  #: modules/404s/fofs-log.php:16
39
  msgid "404 Monitor Log"
40
  msgstr ""
175
  msgid "Content Links"
176
  msgstr ""
177
 
178
+ #: modules/autolinks/content-autolinks.php:77
179
  msgid ""
180
  "The Deeplink Juggernaut can automatically link post/page anchor text to "
181
  "given URLs. This is a preview beta version. More functionality will be added "
182
  "in future releases of SEO Ultimate."
183
  msgstr ""
184
 
185
+ #: modules/autolinks/content-autolinks.php:102
186
  msgid "Anchor Text"
187
  msgstr ""
188
 
189
+ #: modules/autolinks/content-autolinks.php:103
190
  msgid "URL"
191
  msgstr ""
192
 
193
+ #: modules/autolinks/content-autolinks.php:104
194
+ msgid "Options"
195
+ msgstr ""
196
+
197
  #: modules/canonical/canonical.php:12
198
  msgid "Canonicalizer"
199
  msgstr ""
239
  "SEO Ultimate and may be outdated.)"
240
  msgstr ""
241
 
242
+ #: modules/class.su-module.php:944
243
  #, php-format
244
  msgid "%s %s|Dropdown Title"
245
  msgstr ""
246
 
247
+ #: modules/class.su-module.php:972
248
  #, php-format
249
  msgid "%1$s | %2$s %3$s by %4$s"
250
  msgstr ""
251
 
252
+ #: modules/class.su-module.php:1006
253
  msgid "Settings updated."
254
  msgstr ""
255
 
256
+ #: modules/class.su-module.php:1026
257
  msgid "Save Changes"
258
  msgstr ""
259
 
673
  msgstr ""
674
 
675
  #: modules/meta/meta.php:97
676
+ msgid "Meta Description:"
677
  msgstr ""
678
 
679
  #: modules/meta/meta.php:100
682
  msgstr ""
683
 
684
  #: modules/meta/meta.php:102
685
+ msgid "Meta Keywords:<br /><em>(separate with commas)</em>"
686
  msgstr ""
687
 
688
  #: modules/meta/meta.php:109
812
  msgid "User login/registration pages"
813
  msgstr ""
814
 
815
+ #: modules/noindex/noindex.php:105
816
+ msgid "Noindex: Tell search engines not to index this webpage."
817
+ msgstr ""
818
+
819
+ #: modules/noindex/noindex.php:106
820
+ msgid "Nofollow: Tell search engines not to spider links on this webpage."
821
+ msgstr ""
822
+
823
+ #: modules/noindex/noindex.php:107
824
+ msgid "Meta Robots Tag:"
825
+ msgstr ""
826
+
827
  #: modules/sds-blog/sds-blog.php:12
828
  msgid "Whitepapers"
829
  msgstr ""
832
  msgid "SEO Design Solutions Whitepapers"
833
  msgstr ""
834
 
835
+ #. #-#-#-#-# plugin.pot (SEO Ultimate 2.5) #-#-#-#-#
836
  #. Author of the plugin/theme
837
  #: modules/sds-blog/sds-blog.php:49
838
  msgid "SEO Design Solutions"
865
  msgid "Insert comments around HTML code insertions"
866
  msgstr ""
867
 
868
+ #: modules/settings/install.php:18
869
+ msgid "Upgrade/Downgrade/Reinstall"
870
+ msgstr ""
871
+
872
+ #: modules/settings/install.php:19
873
+ msgid "Installer"
874
+ msgstr ""
875
+
876
+ #: modules/settings/install.php:23 modules/settings/install.php:47
877
+ msgid "Upgrade"
878
+ msgstr ""
879
+
880
+ #: modules/settings/install.php:24 modules/settings/install.php:70
881
+ msgid "Downgrade"
882
+ msgstr ""
883
+
884
+ #: modules/settings/install.php:41
885
+ msgid ""
886
+ "From the list below, select the version to which you would like to upgrade. "
887
+ "Then click the &#8220;Upgrade&#8221; button at the bottom of the screen."
888
+ msgstr ""
889
+
890
+ #: modules/settings/install.php:50
891
+ msgid "You are already running the latest version."
892
+ msgstr ""
893
+
894
+ #: modules/settings/install.php:52
895
+ msgid ""
896
+ "There was an error retrieving the list of available versions. Please try "
897
+ "again later. You can also upgrade to the latest version of SEO Ultimate "
898
+ "using the WordPress plugin upgrader."
899
+ msgstr ""
900
+
901
+ #: modules/settings/install.php:61
902
+ msgid ""
903
+ "Downgrading is provided as a convenience only and is not officially "
904
+ "supported. Although unlikely, you may lose data in the downgrading process. "
905
+ "It is your responsibility to backup your database before proceeding."
906
+ msgstr ""
907
+
908
+ #: modules/settings/install.php:64
909
+ msgid ""
910
+ "From the list below, select the version to which you would like to "
911
+ "downgrade. Then click the &#8220;Downgrade&#8221; button at the bottom of "
912
+ "the screen."
913
+ msgstr ""
914
+
915
+ #: modules/settings/install.php:73
916
+ #, php-format
917
+ msgid "Downgrading to versions earlier than %s is not supported."
918
+ msgstr ""
919
+
920
+ #: modules/settings/install.php:75
921
+ msgid ""
922
+ "There was an error retrieving the list of available versions. Please try "
923
+ "again later."
924
+ msgstr ""
925
+
926
+ #: modules/settings/install.php:100
927
+ msgid "Current Version"
928
+ msgstr ""
929
+
930
+ #: modules/settings/install.php:102
931
+ msgid "Latest Version"
932
+ msgstr ""
933
+
934
+ #: modules/settings/install.php:122
935
+ msgid ""
936
+ "You do not have sufficient permissions to upgrade/downgrade plugins for this "
937
+ "blog."
938
+ msgstr ""
939
+
940
+ #: modules/settings/install.php:132
941
+ #, php-format
942
+ msgid "Downgrade to SEO Ultimate %s"
943
+ msgstr ""
944
+
945
+ #: modules/settings/install.php:135
946
+ #, php-format
947
+ msgid "Reinstall SEO Ultimate %s"
948
+ msgstr ""
949
+
950
+ #: modules/settings/install.php:138
951
+ #, php-format
952
+ msgid "Upgrade to SEO Ultimate %s"
953
+ msgstr ""
954
+
955
  #: modules/settings/settings-data.php:16
956
  msgid "Settings Data Manager"
957
  msgstr ""
1061
  msgid "SEO Ultimate Plugin Settings"
1062
  msgstr ""
1063
 
1064
+ #. #-#-#-#-# plugin.pot (SEO Ultimate 2.5) #-#-#-#-#
1065
  #. Plugin Name of the plugin/theme
1066
  #: modules/settings/settings.php:14 plugin/class.seo-ultimate.php:723
1067
  msgid "SEO Ultimate"
1349
  msgid "SEO Settings"
1350
  msgstr ""
1351
 
1352
+ #: plugin/class.su-installer.php:9
1353
+ msgid "Package not available."
1354
+ msgstr ""
1355
+
1356
+ #: plugin/class.su-installer.php:12
1357
+ msgid "Removing the current version of the plugin&#8230;"
1358
+ msgstr ""
1359
+
1360
+ #: plugin/class.su-installer.php:13
1361
+ msgid "Could not remove the current version of the plugin."
1362
+ msgstr ""
1363
+
1364
+ #: plugin/class.su-installer.php:17
1365
+ #, php-format
1366
+ msgid "Downloading old version from <span class=\"code\">%s</span>&#8230;"
1367
+ msgstr ""
1368
+
1369
+ #: plugin/class.su-installer.php:18
1370
+ msgid "Unpacking the downgrade&#8230;"
1371
+ msgstr ""
1372
+
1373
+ #: plugin/class.su-installer.php:19
1374
+ msgid "Installing the downgrade&#8230;"
1375
+ msgstr ""
1376
+
1377
+ #: plugin/class.su-installer.php:20
1378
+ msgid "Plugin downgrade failed."
1379
+ msgstr ""
1380
+
1381
+ #: plugin/class.su-installer.php:21
1382
+ msgid "Plugin downgraded successfully."
1383
+ msgstr ""
1384
+
1385
+ #: plugin/class.su-installer.php:24
1386
+ #, php-format
1387
+ msgid "Downloading from <span class=\"code\">%s</span>&#8230;"
1388
+ msgstr ""
1389
+
1390
+ #: plugin/class.su-installer.php:25
1391
+ msgid "Unpacking the reinstall&#8230;"
1392
+ msgstr ""
1393
+
1394
+ #: plugin/class.su-installer.php:26
1395
+ msgid "Reinstalling the current version&#8230;"
1396
+ msgstr ""
1397
+
1398
+ #: plugin/class.su-installer.php:27
1399
+ msgid "Plugin reinstallation failed."
1400
+ msgstr ""
1401
+
1402
+ #: plugin/class.su-installer.php:28
1403
+ msgid "Plugin reinstalled successfully."
1404
+ msgstr ""
1405
+
1406
+ #: plugin/class.su-installer.php:32
1407
+ #, php-format
1408
+ msgid "Downloading upgrade from <span class=\"code\">%s</span>&#8230;"
1409
+ msgstr ""
1410
+
1411
+ #: plugin/class.su-installer.php:33
1412
+ msgid "Unpacking the upgrade&#8230;"
1413
+ msgstr ""
1414
+
1415
+ #: plugin/class.su-installer.php:34
1416
+ msgid "Installing the upgrade&#8230;"
1417
+ msgstr ""
1418
+
1419
+ #: plugin/class.su-installer.php:35
1420
+ msgid "Plugin upgrade failed."
1421
+ msgstr ""
1422
+
1423
+ #: plugin/class.su-installer.php:36
1424
+ msgid "Plugin upgraded successfully."
1425
+ msgstr ""
1426
+
1427
  #. Plugin URI of the plugin/theme
1428
  msgid "http://www.seodesignsolutions.com/wordpress-seo/"
1429
  msgstr ""
1430
 
1431
  #. Description of the plugin/theme
1432
  msgid ""
1433
+ "This all-in-one SEO plugin gives you control over title tags, noindex/"
1434
+ "nofollow, meta tags, slugs, canonical tags, \"more\" links, 404 errors, and "
1435
+ "more."
1436
  msgstr ""
1437
 
1438
  #. Author URI of the plugin/theme