diff --git a/admin/ajax.php b/admin/ajax.php
index 9946c77d9d4..c9a409a3bd7 100644
--- a/admin/ajax.php
+++ b/admin/ajax.php
@@ -110,6 +110,20 @@ function wpseo_get_suggest() {
add_action( 'wp_ajax_wpseo_get_suggest', 'wpseo_get_suggest' );
+/**
+ * Used in the editor to replace vars for the snippet preview
+ */
+function wpseo_ajax_replace_vars() {
+ check_ajax_referer( 'wpseo-replace-vars' );
+
+ $args = get_post( $_POST['post_id'] );
+ $omit = array( 'excerpt', 'excerpt_only', 'title' );
+ echo wpseo_replace_vars( $_POST['string'], $args, $omit );
+ die;
+}
+
+add_action( 'wp_ajax_wpseo_replace_vars', 'wpseo_ajax_replace_vars' );
+
/**
* Save an individual SEO title from the Bulk Editor.
*/
diff --git a/admin/class-metabox.php b/admin/class-metabox.php
index 802544bcfeb..b9f69ab1a63 100644
--- a/admin/class-metabox.php
+++ b/admin/class-metabox.php
@@ -58,7 +58,7 @@ public static function translate_meta_boxes() {
self::$meta_fields['general']['metadesc']['title'] = __( 'Meta Description', 'wordpress-seo' );
self::$meta_fields['general']['metadesc']['description'] = sprintf( __( 'The meta
description will be limited to %s chars%s, %s chars left.', 'wordpress-seo' ), self::$meta_length, self::$meta_length_reason, '' ) . '
';
- self::$meta_fields['general']['metadesc']['help'] = __( 'If the meta description is empty, the snippet preview above shows what is generated based on this sites meta description template.', 'wordpress-seo' );
+ self::$meta_fields['general']['metadesc']['help'] = sprintf( __( 'The meta description is often shown as the black text under the title in a search result. For this to work it has to contain the keyword that was searched for.
Read %sthis post%s for more info.', 'wordpress-seo' ), '', '' );
self::$meta_fields['general']['metakeywords']['title'] = __( 'Meta Keywords', 'wordpress-seo' );
self::$meta_fields['general']['metakeywords']['description'] = __( 'If you type something above it will override your %smeta keywords template%s.', 'wordpress-seo' );
@@ -342,11 +342,11 @@ public function localize_script() {
if ( $title_template == '' ) {
$title_template = '%%title%% - %%sitename%%';
}
- $title_template = wpseo_replace_vars( $title_template, $post, array( '%%title%%' ) );
+ $title_template = wpseo_replace_vars( $title_template, $post, array( '%%title%%', '%%sitename%%', '%%sitedesc%%', '%%sep%%' ) );
$metadesc_template = '';
if ( isset( $options['metadesc-' . $post->post_type] ) && $options['metadesc-' . $post->post_type] !== '' ) {
- $metadesc_template = wpseo_replace_vars( $options['metadesc-' . $post->post_type], $post, array( '%%excerpt%%', '%%excerpt_only%%' ) );
+ $metadesc_template = wpseo_replace_vars( $options['metadesc-' . $post->post_type], $post, array( '%%excerpt%%', '%%excerpt_only%%', '%%sitename%%', '%%sitedesc%%', '%%sep%%' ) );
}
$sample_permalink = get_sample_permalink( $post->ID );
@@ -366,7 +366,11 @@ public function localize_script() {
'wpseo_title_template' => $title_template,
'wpseo_metadesc_template' => $metadesc_template,
'wpseo_permalink_template' => $sample_permalink,
+ 'sitename' => get_bloginfo( 'name' ),
+ 'sitedesc' => get_bloginfo( 'description' ),
+ 'sep' => wpseo_replace_vars( '%%sep%%', array() ),
'wpseo_keyword_suggest_nonce' => wp_create_nonce( 'wpseo-get-suggest' ),
+ 'wpseo_replace_vars_nonce' => wp_create_nonce( 'wpseo-replace-vars' ),
);
}
@@ -599,7 +603,7 @@ function get_post_date( $post ) {
$date = date_i18n( 'j M Y' );
}
- return $date;
+ return (string) $date;
}
/**
@@ -640,7 +644,7 @@ function snippet() {
$content .= '' . str_replace( 'http://', '', get_bloginfo( 'url' ) ) . '/' . esc_html( $slug ) . '/';
- $content .= '' . $datestr . '' . esc_html( $desc ) . '
';
+ $content .= '' . $datestr . '' . esc_html( $desc ) . '
';
$content .= '';
@@ -819,10 +823,10 @@ function column_content( $column_name, $post_id ) {
echo '';
}
if ( $column_name === 'wpseo-title' ) {
- echo esc_html( apply_filters( 'wpseo_title', $this->page_title( $post_id ) ) );
+ echo esc_html( apply_filters( 'wpseo_title', wpseo_replace_vars( $this->page_title( $post_id ), get_post( $post_id, ARRAY_A ) ) ) );
}
if ( $column_name === 'wpseo-metadesc' ) {
- echo esc_html( apply_filters( 'wpseo_metadesc', self::get_value( 'metadesc', $post_id ) ) );
+ echo esc_html( apply_filters( 'wpseo_metadesc', wpseo_replace_vars( self::get_value( 'metadesc', $post_id ), get_post( $post_id, ARRAY_A ) ) ) );
}
if ( $column_name === 'wpseo-focuskw' ) {
$focuskw = self::get_value( 'focuskw', $post_id );
diff --git a/css/metabox-tabs.css b/css/metabox-tabs.css
index 247d0487bc8..e03cbe1bc7c 100644
--- a/css/metabox-tabs.css
+++ b/css/metabox-tabs.css
@@ -128,6 +128,9 @@ ul.wpseo-metabox-tabs li {
word-wrap: break-word;
font-size: small;
}
+#wpseosnippet .desc .autogen {
+ color: #777;
+}
#wpseosnippet .date {
color: #808080;
}
@@ -160,15 +163,17 @@ ul.wpseo-metabox-tabs li {
text-decoration: underline;
}
-.wpseo_yahoo_kw {
- display: block;
- float: left;
- border-radius: 5px;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- background-color: #ddd;
- margin: 3px 8px 3px 0;
- padding: 3px;
+#focuskwresults ul {
+ margin: 0;
+}
+
+#focuskwresults p, #focuskwresults li {
+ font-size: 13px;
+}
+
+#focuskwresults li {
+ list-style-type: disc;
+ margin: 0 0 0 20px;
}
.wpseo_hidden {
diff --git a/inc/wpseo-functions.php b/inc/wpseo-functions.php
index de7186c7fb7..bf528e506d5 100644
--- a/inc/wpseo-functions.php
+++ b/inc/wpseo-functions.php
@@ -286,7 +286,7 @@ function wpseo_ping_search_engines( $sitemapurl = null ) {
// Always ping Google and Bing, optionally ping Ask and Yahoo!
wp_remote_get( 'http://www.google.com/webmasters/tools/ping?sitemap=' . $sitemapurl );
- wp_remote_get( 'http://www.bing.com/webmaster/ping.aspx?sitemap=' . $sitemapurl );
+ wp_remote_get( 'http://www.bing.com/ping?sitemap=' . $sitemapurl );
if ( $options['xml_ping_yahoo'] === true ) {
wp_remote_get( 'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=3usdTDLV34HbjQpIBuzMM1UkECFl5KDN7fogidABihmHBfqaebDuZk1vpLDR64I-&url=' . $sitemapurl );
diff --git a/js/wp-seo-metabox.js b/js/wp-seo-metabox.js
index a9628e53c38..59a3639c8f7 100644
--- a/js/wp-seo-metabox.js
+++ b/js/wp-seo-metabox.js
@@ -89,37 +89,67 @@ function testFocusKw() {
var focuskwNoDiacritics = removeLowerCaseDiacritics(focuskw);
var p2 = new RegExp(focuskwNoDiacritics.replace(/\s+/g, "[-_\\\//]"), 'gim');
- var metadesc = jQuery('#'+wpseoMetaboxL10n.field_prefix+'metadesc').val();
- var snippet = jQuery('#wpseosnippet');
var focuskwresults = jQuery('#focuskwresults');
- if (metadesc == '')
- metadesc = snippet.find('.desc').text();
+ var metadesc = jQuery('#wpseosnippet').find('.desc span.content').text();
if (focuskw != '') {
- var html = '' + wpseoMetaboxL10n.keyword_header + '
';
- html += wpseoMetaboxL10n.article_header_text + ptest(jQuery('#title').val(), p) + '
';
- html += wpseoMetaboxL10n.page_title_text + ptest(snippet.find('.title').text(), p) + '
';
- html += wpseoMetaboxL10n.page_url_text + ptest(url, p2) + '
';
- html += wpseoMetaboxL10n.content_text + ptest(jQuery('#content').val(), p) + '
';
- html += wpseoMetaboxL10n.meta_description_text + ptest(metadesc, p);
- html += '
';
+ var html = '' + wpseoMetaboxL10n.keyword_header + '
';
+ html += '';
+ html += '- ' + wpseoMetaboxL10n.article_header_text + ptest(jQuery('#title').val(), p) + '
';
+ html += '- ' + wpseoMetaboxL10n.page_title_text + ptest(jQuery('#wpseosnippet_title').text(), p) + '
';
+ html += '- ' + wpseoMetaboxL10n.page_url_text + ptest(url, p2) + '
';
+ html += '- ' + wpseoMetaboxL10n.content_text + ptest(jQuery('#content').val(), p) + '
';
+ html += '- ' + wpseoMetaboxL10n.meta_description_text + ptest(metadesc, p) + '
';
+ html += '
';
focuskwresults.html(html);
} else {
focuskwresults.html('');
}
}
+function replaceVariables(str,callback) {
+ // title
+ str = str.replace(/%%title%%/g, jQuery('#title').val());
+
+ // These are added in the head for performance reasons.
+ str = str.replace(/%%sitedesc%%/g, wpseoMetaboxL10n.sitedesc);
+ str = str.replace(/%%sitename%%/g, wpseoMetaboxL10n.sitename);
+ str = str.replace(/%%sep%%/g, wpseoMetaboxL10n.sep);
+
+ // excerpt
+ var excerpt = yst_clean(jQuery("#excerpt").val());
+ str = str.replace(/%%excerpt_only%%/g, excerpt);
+ str = str.replace(/%%excerpt%%/g, excerpt);
+
+ if (str.indexOf('%%') != -1 && str.match(/%%[a-z_]+%%/) != null ) {
+ jQuery.post(ajaxurl, {
+ action : 'wpseo_replace_vars',
+ string : str,
+ post_id : jQuery('#post_ID').val(),
+ _wpnonce: wpseoMetaboxL10n.wpseo_replace_vars_nonce
+ }, function (data) {
+ if (data) {
+ callback(data);
+ }
+ }
+ );
+ } else {
+ callback(str);
+ }
+
+}
+
function updateTitle(force) {
var title = '';
- var titleElm = jQuery('#'+wpseoMetaboxL10n.field_prefix+'title');
- var titleLengthError = jQuery('#'+wpseoMetaboxL10n.field_prefix+'title-length-warning');
+ var titleElm = jQuery('#' + wpseoMetaboxL10n.field_prefix + 'title');
+ var titleLengthError = jQuery('#' + wpseoMetaboxL10n.field_prefix + 'title-length-warning');
var divHtml = jQuery('');
- var snippetTitle = jQuery('#wpseosnippet').find('.title');
+ var snippetTitle = jQuery('#wpseosnippet_title');
if (titleElm.val()) {
title = titleElm.val();
} else {
- title = wpseoMetaboxL10n.wpseo_title_template.replace('%%title%%', jQuery('#title').val());
+ title = wpseoMetaboxL10n.wpseo_title_template;
title = divHtml.html(title).text();
}
if (title == '') {
@@ -130,95 +160,99 @@ function updateTitle(force) {
title = yst_clean(title);
title = jQuery.trim(title);
- var original_title = title;
title = divHtml.text(title).html();
if (force) {
titleElm.val(title);
- } else {
- // placeholder needs to be html decoded when being set by jQuery
- original_title = divHtml.html(original_title).text();
- titleElm.attr('placeholder', original_title);
}
- var e = document.getElementById('wpseosnippet_title');
- if ( e != null ) {
- if (e.scrollWidth > e.clientWidth) {
- titleLengthError.show();
- } else {
- titleLengthError.hide();
- }
- }
+ title = replaceVariables(title, function( title ) {
+ // do the placeholder
+ var placeholder_title = divHtml.html(title).text();
+ titleElm.attr('placeholder', placeholder_title);
- title = boldKeywords(title, false);
+ // and now the snippet preview title
+ title = boldKeywords(title , false);
- snippetTitle.html(title);
- testFocusKw();
+ jQuery('#wpseosnippet_title').html(title);
+
+ var e = document.getElementById('wpseosnippet_title');
+ if (e != null) {
+ if (e.scrollWidth > e.clientWidth) {
+ titleLengthError.show();
+ } else {
+ titleLengthError.hide();
+ }
+ }
+
+ testFocusKw();
+ } );
}
function updateDesc() {
- var autogen = false;
- var desc = jQuery.trim(yst_clean(jQuery('#'+wpseoMetaboxL10n.field_prefix+'metadesc').val()));
- var color = '#000';
+ var desc = jQuery.trim(yst_clean(jQuery('#' + wpseoMetaboxL10n.field_prefix + 'metadesc').val()));
var divHtml = jQuery('');
+ var snippet = jQuery('#wpseosnippet');
- if (desc == '') {
- if (wpseoMetaboxL10n.wpseo_metadesc_template != '') {
- var excerpt = yst_clean(jQuery("#excerpt").val());
- desc = wpseoMetaboxL10n.wpseo_metadesc_template.replace('%%excerpt_only%%', excerpt);
- desc = desc.replace('%%excerpt%%', excerpt);
- desc = divHtml.html(desc).text();
- }
-
- desc = jQuery.trim(desc);
+ if (desc == '' && wpseoMetaboxL10n.wpseo_metadesc_template != '') {
+ desc = wpseoMetaboxL10n.wpseo_metadesc_template;
+ }
- if (desc == '') {
- desc = jQuery("#content").val();
+ if ( desc != '' ) {
+ desc = replaceVariables( desc, function( desc ) {
+ desc = divHtml.text(desc).html();
desc = yst_clean(desc);
- var focuskw = escapeFocusKw(jQuery.trim(jQuery('#'+wpseoMetaboxL10n.field_prefix+'focuskw').val()));
- if (focuskw != '') {
- var descsearch = new RegExp(focuskw, 'gim');
- if (desc.search(descsearch) != -1 && desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length) {
- desc = desc.substr(desc.search(descsearch), wpseoMetaboxL10n.wpseo_meta_desc_length);
- } else {
- desc = desc.substr(0, wpseoMetaboxL10n.wpseo_meta_desc_length);
- }
- } else {
- desc = desc.substr(0, wpseoMetaboxL10n.wpseo_meta_desc_length);
- }
- autogen = true;
- }
- }
- desc = divHtml.text(desc).html();
- desc = yst_clean(desc);
+ var len = -1;
+ len = wpseoMetaboxL10n.wpseo_meta_desc_length - desc.length;
- var len = -1;
- if (!autogen)
- len = wpseoMetaboxL10n.wpseo_meta_desc_length - desc.length;
- else
- len = wpseoMetaboxL10n.wpseo_meta_desc_length;
+ if (len < 0)
+ len = '' + len + '';
+ else
+ len = '' + len + '';
- if (len < 0)
- len = '' + len + '';
- else
- len = '' + len + '';
+ jQuery('#' + wpseoMetaboxL10n.field_prefix + 'metadesc-length').html(len);
- if (autogen || desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length) {
- var space;
- if (desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length)
- space = desc.lastIndexOf(" ", ( wpseoMetaboxL10n.wpseo_meta_desc_length - 3 ));
- else
- space = wpseoMetaboxL10n.wpseo_meta_desc_length;
- desc = desc.substring(0, space).concat(' ...');
- }
+ desc = boldKeywords(desc, false);
+ // Clear the autogen description.
+ snippet.find('.desc span.autogen').html('');
+ // Set our new one.
+ snippet.find('.desc span.content').html(desc);
- desc = boldKeywords(desc, false);
+ testFocusKw();
+ });
+ } else {
+ // Clear the generated description
+ snippet.find('.desc span.content').html('');
+ testFocusKw();
+
+ desc = jQuery("#content").val();
+ desc = yst_clean(desc);
+
+ var focuskw = escapeFocusKw(jQuery.trim(jQuery('#' + wpseoMetaboxL10n.field_prefix + 'focuskw').val()));
+ if (focuskw != '') {
+ var descsearch = new RegExp(focuskw, 'gim');
+ if (desc.search(descsearch) != -1 && desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length) {
+ desc = desc.substr(desc.search(descsearch), wpseoMetaboxL10n.wpseo_meta_desc_length);
+ } else {
+ desc = desc.substr(0, wpseoMetaboxL10n.wpseo_meta_desc_length);
+ }
+ } else {
+ desc = desc.substr(0, wpseoMetaboxL10n.wpseo_meta_desc_length);
+ }
+ if (desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length) {
+ var space;
+ if (desc.length > wpseoMetaboxL10n.wpseo_meta_desc_length)
+ space = desc.lastIndexOf(" ", ( wpseoMetaboxL10n.wpseo_meta_desc_length - 3 ));
+ else
+ space = wpseoMetaboxL10n.wpseo_meta_desc_length;
+ desc = desc.substring(0, space).concat(' ...');
+ }
+ desc = boldKeywords(desc, false);
+ snippet.find('.desc span.autogen').html(desc);
+ }
- jQuery('#'+wpseoMetaboxL10n.field_prefix+'metadesc-length').html(len);
- jQuery('#wpseosnippet').find('.desc span.content').html(desc);
- testFocusKw();
}
function updateURL() {
@@ -250,7 +284,9 @@ function boldKeywords(str, url) {
} else {
kwregex = new RegExp("(^|[ \s\n\r\t\.,'\(\"\+;!?:\-]+)(" + kw + ")($|[ \s\n\r\t\.,'\)\"\+;!?:\-]+)", 'gim');
}
- str = str.replace(kwregex, "$1$2$3");
+ if ( str != undefined ) {
+ str = str.replace(kwregex, "$1$2$3");
+ }
}
return str;
}
@@ -386,12 +422,13 @@ jQuery(document).ready(function () {
},
show : {
when: {
- event: 'click'
+ event: 'mouseover'
}
},
hide : {
+ fixed: true,
when: {
- event: 'click'
+ event: 'mouseout'
}
},
style : {
diff --git a/wp-seo-main.php b/wp-seo-main.php
index 9343e428ca1..7b6c772c9bf 100644
--- a/wp-seo-main.php
+++ b/wp-seo-main.php
@@ -335,7 +335,14 @@ function wpseo_admin_init() {
}
}
- if ( in_array( $pagenow, array( 'edit.php', 'post.php', 'post-new.php' ) ) ) {
+ /**
+ * Filter: 'wpseo_always_register_metaboxes_on_admint' - Allow developers to change whether
+ * the WPSEO metaboxes are only registered on the typical pages (lean loading) or always
+ * registered when in admin.
+ *
+ * @api bool Whether to always register the metaboxes or not. Defaults to false.
+ */
+ if ( in_array( $pagenow, array( 'edit.php', 'post.php', 'post-new.php' ) ) || apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) ) {
$GLOBALS['wpseo_metabox'] = new WPSEO_Metabox;
if ( $options['opengraph'] === true ) {
$GLOBALS['wpseo_social'] = new WPSEO_Social_Admin;
@@ -358,7 +365,6 @@ function wpseo_admin_init() {
if ( $options['enablexmlsitemap'] === true ) {
$GLOBALS['wpseo_sitemaps_admin'] = new WPSEO_Sitemaps_Admin;
}
-
}
@@ -368,7 +374,7 @@ function wpseo_admin_init() {
if ( ! function_exists( 'spl_autoload_register' ) ) {
add_action( 'admin_init', 'yoast_wpseo_self_deactivate', 1 );
}
-else {
+else if ( ! defined( 'WP_INSTALLING' ) || WP_INSTALLING === false ) {
add_action( 'plugins_loaded', 'wpseo_init', 14 );
if ( is_admin() ) {
@@ -417,4 +423,4 @@ function yoast_wpseo_self_deactivate() {
unset( $_GET['activate'] );
}
}
-}
\ No newline at end of file
+}