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 += ''; 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 +}