In this minor update, we ensured compatibility with PHP 8 and WP 5.6. TSF now also fully integrates with WordPress Core Sitemaps, which you can configure via the SEO settings. If you decide to keep using TSF’s optimized sitemap, you can now enjoy prerendering, DoS protection, and full Polylang integration. Lastly, you’ll find various accessibility improvements, and we fixed about a dozen bugs.
We included a single-line self-destructing notification about our Cyber Monday sale. We hope you’ll opt to support our continuous efforts. But we’re also kindly asking you to understand we must promote our premium extensions to make TSF possible. We are apprehensive about any embedded advertising and self-promotion in the plugin, so we must rely on notifications until a better system is available in WordPress.
Detailed log
> View code changes.
> View closed issues.
For everyone
- Added:
- TSF is now compatible with PHP 8.0.0. This ensures compatibility with PHP 8.0.0 when it becomes generally available, but changes may be provisionary.
- Although a new PHP version is exciting, we advise against updating until the dust has settled. PHP 8.0 brings many deprecations and breaking changes, and those will probably cause many issues on your website for months to come, until all your active plugins and theme have been updated accordingly. There’s also no measurable performance benefit using PHP 8.0 over PHP 7.4 for WordPress.
- When Polylang is active, you can access any sitemap language via the
lang
query — even when Polylang settings are configured otherwise. This helps mitigate any sporadic issues you might still encounter.- For example (es for Spanish sitemap):
https://example.com/sitemap.xml?lang=es
. - Another example (es for Spanish sitemap):
https://en-gb.example.com/sitemap.xml?lang=es
.
- For example (es for Spanish sitemap):
- We now suggest a free extension in-line at the title settings when necessary theme support for titles is found missing. This message is only visible to users that can install plugins and should help lower our ever-increasing support burden.
- You can add
define( 'TSF_DISABLE_SUGGESTIONS', true )
to yourwp-config.php
file to prevent any suggestions showing up in your dashboard, even some that are seen as advertisement.
- You can add
- You can now enable sitemap prerendering. This helps mitigate timeout issues when the sitemap takes longer than a minute to render.
- Prerendering only works when:
- you use The SEO Framework’s optimized sitemap;
- you enable the sitemap’s transient caching via the SEO Settings’ “General Settings > Performance” options;
- and when pinging via cron is enabled.
- When you inspect the source of the sitemap, you can now see whether it’s prerendered via cron or generated via a manual request on line 5:
<-- Sitemap is generated/prerendered on ... -->
.
- Prerendering only works when:
- When the sitemap’s caching is enabled, and when no sitemap is generated yet whilst being called multiple times in a row (by anybody), subsequent requests are now blocked with a 503 error until (whichever comes first):
- the sitemap is fully generated;
- or after PHP’s configuration
max_execution_time
seconds (or 3 minutes, whichever is sooner). - Note: This feature prevents overloading the server when the sitemap is generated.
- Note: When using a translation plugin, this feature only prerenders one (most likely the main language’s) sitemap.
- TSF now integrates with WordPress 5.5 Core sitemaps. These sitemaps become active when you disable TSF’s “optimized” sitemap.
- The following options now affect Core Sitemaps:
- Sitemap Query Limit.
- Sitemap Hinting.
- Timestamps Settings.
- Ping Settings.
- Excluding the new prerendering feature.
- Core sitemaps’ entries are now removed when they’re not indexable.
- Since we do not catalog the ‘indexables’, you may find that some sitemaps will return a 404-response because of this. You can safely ignore this issue while we await a proper solution.
- We achieved this through unorthodox means — by reassigning the sitemap provider classes, extending the original classes yet overwriting the WP Core URL list function. This can cause compatibility issues in the long haul. However, we will change this when a proper workaround is implemented.
- Core sitemaps’ user-sitemap is now hidden when author pages are marked with
noindex
via TSF’s global robots meta settings.
- The following options now affect Core Sitemaps:
- TSF is now compatible with PHP 8.0.0. This ensures compatibility with PHP 8.0.0 when it becomes generally available, but changes may be provisionary.
- Improved:
- UI cohesiveness:
- Note: When you use filters, these changes might not be fully cohesive.
- Note: We did not apply these changes to the quick-edit screens, since the interface is much too intertwined with WordPress’s, plausibly causing confusion.
- Glossary:
protected
means “password protected”. WILL means definitely. MAY means depending on other factors interfering unlikely. MIGHT means depending on other factors interfering likely. - Page(/post) edit screen:
- When you change a
public
page toprivate
orprotected
, you’ll now notice before you save the page that:- the description placeholder WILL now become hidden;
- the canonical URL placeholder WILL now become hidden;
- the default indexing state MIGHT change from ‘index’ to ‘noindex’.
- When you change a
private
orprotected
page topublic
, you’ll now notice before you save the page that:- the canonical URL placeholder MAY now become visible;
- the default indexing state MAY change from ‘noindex’ to ‘index’.
- Note: We cannot generate a description before you edit a
private
orprotected
post and set the post topublic
. We consider this an edge-case not worth looking into right now because we’ll have to affect the underlying description API. - Note: When using the Classic Editor, we cannot dynamically fetch the provisioned canonical URL if you change the slug.
- When you set a page’s indexing state to ‘noindex’, you’ll now notice before you save the page that:
- the canonical URL placeholder WILL now become hidden.
- When you set a page’s indexing state to ‘index’, you’ll now notice before you save the page that:
- the canonical URL placeholder MAY now become visible.
- When you change a
- Term edit screen:
- When you set a term’s indexing state to ‘noindex’, you’ll now notice before you save the term that:
- the canonical URL placeholder WILL now become hidden.
- When you set a term’s indexing state to ‘index’, you’ll now notice before you save the term that:
- the canonical URL placeholder MAY now become visible.
- When you set a term’s indexing state to ‘noindex’, you’ll now notice before you save the term that:
- Sitemap UI:
- We now clearly refer to “optimized sitemap” whenever an option (group) only impacts TSF’s sitemap.
- Performance:
- Disabling the “Output multiple Open Graph image tags?” option will now improve front-end performance when a custom social image or a featured image is registered for the post.
- UI cohesiveness:
- Fixed:
- Resolved an issue where the notice dismissal button isn’t spanned correctly when administrative script concatenation is turned off.
- Resolved an issue where the default robots indexing state selection wasn’t correctly annotated when you edit a
private
orprotected
post. - Resolved an issue where the quick-and bulk-edit options weren’t correctly styled after disabling the SEO Bar in overview tables.
- Resolved an issue where filtered-in query strings were removed from paginated URLs. Props hivecl.
- Resolved an issue where emojis were converted in the reference title to image-elements by Twemoji via wpEmoji’s observer on tags and categories. Props bjarne.
- Resolved an issue where the title settings’ example page title output could be empty when only invalid tags were supplied to the latest post’s title.
- Resolved an issue where the Sitelinks search box URL wasn’t properly slashed based on custom permalink settings.
- Resolved an issue where archive translation strings from WP 5.5 weren’t properly integrated. Props teropaajoki.
- Polylang related:
- Resolved an issue where sitemaps didn’t output reliably on some subdomains or subdirectories.
- Resolved an issue where sitemap stylesheets didn’t affect the endpoint’s URL correctly to abide by CORS.
- Resolved an issue where Polylang didn’t correctly find the sitemap’s language when using cookies.
- Resolved an issue where non-translatable post types were excluded from the sitemap. They’re now solely appended to the primary language’s sitemap.
- Other:
- The “Priority Settings” for the sitemaps are now hidden when disabled.
- This feature is planned to be removed entirely in TSF v5.0.
- Added a “learn more” link to our KB at the sitemap settings.
- This update is required for the upcoming Extension Manager v2.5.
- The “Priority Settings” for the sitemaps are now hidden when disabled.
For translators
- Added:
- New translation strings are available.
- Updated:
- POT translation file.
For developers
- Database notes:
- This plugin now uses database version
4120
.
- This plugin now uses database version
- Option notes:
- For index
autodescription-site-settings
(constantTHE_SEO_FRAMEWORK_SITE_OPTIONS
):- Added:
ping_use_cron_prerender
, integer1
or0
.
- Changed:
multi_og_image
now defaults to0
, instead of1
, for new installations.- We made this change to reduce needless processing power.
- This feature is also confusing to some users, since it can cause unexpected (from the user’s standpoint) sharing behavior on Facebook.
- Current TSF installations are unaffected.
- Added:
- For index
- Action notes:
- Added:
tsf_sitemap_cron_hook_before
, runs just before pinging.tsf_sitemap_cron_hook_after
, runs right after pinging.tsf_sitemap_cron_hook_retry
, scheduled when first ping fails due to sitemap lock.the_seo_framework_before_redirect
, runs right before redirecting.
- Changed:
the_seo_framework_sitemap_transient_cleared
: Added indexping_use_cron_prerender
to the first parameter.
- Added:
- Filter notes:
- Added:
the_seo_framework_sitemap_base_path
, used internally to override Polylang’s cookie-based home path changing behavior.
- Other:
- The internal use of
the_seo_framework_sitemap_path_prefix
for Polylang compatibility now runs at priority 99, instead of 9.- This eases intercompatibility between plugins, which might set a custom prefix before we apply the Polylang compatibility layer.
- The internal use of
- Added:
- File notes:
inc\traits\core\overload.trait.php
is no longer available.
- Trait notes:
- Removed:
- These traits contained magic methods with their visibility changed for added security. This is no longer legal in PHP 8.0. The added security was only beneficial if we had made oversights in our programming.
The_SEO_Framework\Traits\Enclose_Stray_Private
The_SEO_Framework\Traits\Enclose_Core_Final
- These traits contained magic methods with their visibility changed for added security. This is no longer legal in PHP 8.0. The added security was only beneficial if we had made oversights in our programming.
- Removed:
- Object notes:
- For façade object
the_seo_framework()
:- Added:
use_core_sitemaps()
, tells whether WP 5.5 Core Sitemaps are used.
- Changed:
get_social_image_uploader_form()
no longer adds a redundant title to the selection button.generate_dismissible_notice()
:- No longer invokes the script loader during AJAX-requests.
- Now accepts empty messages so that AJAX-invoked generators can grab a notice wrapper.
- Added the
$inline
parameter. - Now enqueues scripts in the footer so that templates won’t spam the header.
do_dismissible_notice()
added the$inline
parameter.remove_pagination_from_url()
now correctly reappends query when pagination isn’t removed.get_paged_urls()
:- Added back memoization.
- Reduced needless canonical URL generation when it wouldn’t be processed anyway.
generate_cache_key_by_type()
now accepts$type
sitemap_lock
.init_cron_actions()
:- Added hook for sitemap prerender.
- Added hook for ping retry.
output_js_title_elements()
,output_js_title_data()
,output_js_description_elements()
, andoutput_js_description_data()
:- Now prevents
wp-emoji.js
parsing the references and data.
- Now prevents
get_image_details_from_cache()
Added a$single
parameter, which helps reduce processing power required.- This parameter might get deprecated when we start supporting PHP 7.1+ only. This acts as a workaround for WP moving forward too slowly.
- In light of this, these methods now forward the
multi_og_image
option to the generator—this is a temporary workaround. get_image_from_cache()
twitter_image()
og_image()
get_ld_json_website()
now properly slashes the search URL.
- Added:
- For object
\The_SEO_Framework\Builders\CoreSitemaps\Main
:- This is a new object.
- Extends object
\The_SEO_Framework\Builders\Sitemap
.
- Extends object
- Added:
get_instance()
- This is a new object.
- For object
\The_SEO_Framework\Builders\CoreSitemaps\Posts
:- This is a new object.
- Extends object
\WP_Sitemaps_Posts
. - Overrides
get_url_list()
- Extends object
- This is a new object.
- For object
\The_SEO_Framework\Builders\CoreSitemaps\Taxonomies
:- This is a new object.
- Extends object
\WP_Sitemaps_Taxonomies
. - Overrides
get_url_list()
- Extends object
- This is a new object.
- For object
\The_SEO_Framework\Bridges\Ping
:- Added:
engage_pinging_retry_cron()
, engages another pinging cron hook.retry_ping_search_engines()
, hooked into the retry cron hook, retries pinging.
- Changed:
engage_pinging_cron()
now registers before and after cron hooks. They should run subsequential when successful.
- Added:
- For object
\The_SEO_Framework\Bridges\Scripts
:- Changed:
get_media_scripts()
removed redundant button titles.
- Changed:
- For object
\The_SEO_Framework\Bridges\Sitemap
:- Added:
sitemap_cache_enabled()
, tells whether sitemap caching is enabled by the user.output_locked_header()
, prevents rendering of the sitemap whilst it’s still generating. Tells the visitor the maximum timeout.- The sitemap can unlock before this timeout expires.
lock_sitemap()
, locks a sitemap for regeneration.unlock_sitemap()
, unlocks a sitemap for regeneration.is_sitemap_locked()
, tells whether a sitemap is locked.
- Changed:
get_expected_sitemap_endpoint_url()
no longer passes the path to the home_url() function.output_base_sitemap()
is now static.output_stylesheet()
is now static.
- Added:
- For object
\The_SEO_Framework\Builders\Scripts
:- Added:
footer_enqueue()
, this allows you to delay outputting scripts.
- Added:
- For object
\The_SEO_Framework\Builders\Sitemap
:- Added:
generate_sitemap()
, a semi-abstract method that allows you to generate the sitemap.
- Added:
- For object
\The_SEO_Framework\Builders\Sitemap_Base
:- Added:
$base_is_regenerated
, boolean for whether the sitemap is done regenerating.$base_is_prerendering
, boolean for whether the sitemap is prerendering in the current request.base_get_sitemap_store_key()
, returns the default sitemap transient name used since aeons.prerender_sitemap()
, generates and stores the sitemap in transient cache.generate_sitemap()
, an abstracted method to generate and store the sitemap in transient cache.
- Added:
- For façade object
- JavaScript notes:
- For object
window.tsf
:- Added:
triggerNoticeReset()
, this allows you to dynamically insert interactive TSF notices, even persistent.
- Added:
- For object
window.tsfDescription
:- Added:
updateStateOf
now listens topart
useDefaultDescription
.
- Added:
- For object
window.tsfMedia
:- Added:
resetImageEditorActions()
, this allows you to dynamically insert interactive TSF image editors.
- Added:
- For object
- Fixed:
- The template loader unsets templates prior to looping over them. This prevents plausible infinite loops where scripts need to be reenqueued.