Come with me, and you’ll be in a world of pure imagination. – Gene Wilder, Anthony Newley, Leslie Bricusse
Release highlights
- This update brings new post-type-archive settings. You can now edit their titles, descriptions, social and visibility settings, and even add redirects on the SEO Settings page.
- Fancy a custom site title for SEO purposes only? Check out the new title settings.
- You will find that the sitemap’s stylesheet now has its URLs centered; it also supports mobile devices.
- Developers can now enjoy using the new
tsf()
function — an alias ofthe_seo_framework()
. - If you’re a developer, you should also check out our perfectly tuned
memo()
,umemo()
, andfmemo()
functions, which help make TSF so performant.
Perfect
TSF is finally what I (Sybre) envisioned it to become when I first named it “The SEO Framework”: It’s lightning-fast, hassle-free, and has all necessary options while giving you the best in class experience. I hope you enjoy what I believe is a perfect product!
To me, The SEO Framework is finished. Done. It’s excellent. This doesn’t mean its journey ends here. Now, it’s time to add features you want. A restyled interface, migration support, custom title generation, more structured data fields, and many other community proposals are under consideration.
A perfect tip
This update comes with updated browser styles and scripts. Not all browsers get these for you; so, the interface might appear broken (and your “inputs” seem to be “removed”). Try a different browser, or clear your favorite browser’s cache. That ought to do the trick.
These keyboard shortcuts should help you with that. Visit the “broken” page, and hit:
- Safari Mac: CMD ⌘+OPTION ⌥+R
- Chrome/Firefox Mac: CMD ⌘+SHIFT ⇧+R
- Windows: CTRL ^+SHIFT ⇧+R
- Linux: CTRL ^+Alt ⌥+T, good luck.
Environment upgrade notes
WordPress 5.1 through 5.4 are no longer supported. Here’s why:
- Almost 66% of all WordPress sites are using WordPress v5.5 or later.
- Newer versions of WordPress are faster, more reliable, and easier to work with; for both you and us.
- Supporting past versions takes time away that’s better used implementing new features.
PHP 5.6 through 7.1 are no longer supported. Here’s why:
- Almost 80% of all WordPress sites are using PHP v7.2 or later.
- Newer versions of PHP are faster and more secure. For us, they’re also easier to work with.
- Again, supporting past versions takes time away that’s better used implementing new features.
Support the development
We hope you’ll love this update as much as we do. Please consider supporting us by giving an fantastic review, get a license, or do your friends and colleagues a favor by installing TSF for them.
Detailed log
Practice makes perfect. So does working 16 hours a day.
> View code changes.
> View closed issues.
For everyone
- Upgrade notes:
- PHP 7.2 or higher is now required, from PHP 5.6 or higher.
- WP 5.5 or higher is now required, from WP 5.1 or higher. Reasons:
- Removal of redundant timezone patches, fixed in WP 5.3.
- Archive title translations were changed in WP 5.5, now we no longer have to support two versions.
- Various “unexplainable” bugs have been resolved, among one where archive titles could be empty (although not brought up in that ticket, it solved the issue). These fixes alleviate our support burden.
- Core Sitemaps support is now mandatory. We no longer have to say “if” you have WP 5.5 or later.
- Core Sitemaps brought a new escaping method,
esc_xml()
, which will ensure future security. - Support for newer (less buggy) admin styles, such as a proper “default” button for the color-picker in WP 5.5 or later.
- We no longer need to support WordPress and PHP environment testing, of which the burden was shifted to WP 5.2.
- Added:
- You can now set a custom Site Title at “SEO Settings > Title Settings > Additions.”
- This new option only affects titles outputted by The SEO Framework.
- You can now manage post type archives at “SEO Settings > Post Type Archive Settings”.
- You can set all metadata for these as you can with terms:
- Meta Title (and removal of blog name);
- Meta Description;
- Open Graph Title/Description;
- Twitter Title/Description;
- Twitter Title/Description;
- Social image URL (or file upload);
- Canonical URL.
- Qubit robots settings: indexing, link following, and archiving.
- Redirect URL.
- You can set all metadata for these as you can with terms:
- You can now set a custom Site Title at “SEO Settings > Title Settings > Additions.”
- Changed:
- The styled optimized sitemap now has its content centered, and is fully responsive.
- TSF no longer outputs metatags on Ultimate Memmber’s user-pages. Now, it lets that plugin take over fully.
- TSF no longer tests for the compatible PHP or WordPress versions – we now rely on WordPress handling this.
- WordPress isn’t as gracious as we were: WP doesn’t deactivate the plugin if you upload an incompatible version via FTP, which TSF did. However, we consider this an edge case beyond corners.
- Improved:
- Sitemaps:
- Aside from the optimized sitemap being centered and responsive, it now also fully embraces RTL languages (Arabic, Hebrew, Farsi, et al.).
- Performance:
- Images are now fetched faster from the content.
- The SEO Bar now parses the title item faster.
- Open Graph and Twitter titles are now fetched faster when no custom one is provided.
- Open Graph, Twitter, and meta titles are now regenerated faster.
- The canonical URL of the current page is now stored in memory, so it won’t get fetched multiple times.
- The robots-meta is now generated on-demand only, meaning sitemaps generate much faster once more.
- Large sitemaps are now rendered more quickly by the browser.
- Tooltips despawn 25% quicker now.
- Tapping the tooltip no longer conjures tooltip animations, potentially saving battery-life.
- Administrative Markdown-text now generates a tad swifter.
- Throughout the plugin, we found ways to reduce opcodes.
- The bootstrap timer keeps timing while metadata is strapping. This time spent is added to both timers. We rectified the “boot” timer.
- The reason is that the plugin should be done “booting” once it starts generating the metadata.
- This issue became more apparent once we started splitting the generators in their respective builder-classes.
- Addressed an issue where canonical URLs accidentally bypassed some caches. This should vastly improve canonical URL and Structured Data generation.
- Twitter Cards generate 61% quicker now by removing redundant tests.
- Twitter and description inputs now use generators to assert the correct description that only sanitize the input when there is some, halving total input-processing time.
- Those title and description’s input counters are now synchronized at 60fps, instead of at 75~100fps sporadically.
- Only the trained eye can spot a minor delay on low response time monitors, but only whilst holding a repeat-key, which isn’t realistic.
- Image previews now get loaded only after the “slowest” typist is done typing the image URL.
- When no excerpt of the content can be fetched, needless trimming no longer happens.
- The floating title prefixes and additions helpers, resize listeners, and various other elements no longer rely on jQuery.
- Timestamps:
- The plugin no longer rectifies the timezones for its timestamps in the sitemap or for Facebook/Open Graph meta data, for it now relies on WP 5.3’s patches.
- Notices:
- Upgrade notices are now persistent; so, now you won’t miss an auto-upgrade.
- Shown only to users with
THE_SEO_FRAMEWORK_SETTINGS_CAP
(defaultupdate_options
) capability. - Shown once globally.
- These messages are always truly white-label; there’s no mention of “The SEO Framework”.
- Shown only to users with
- The first-activation notice is now persistent.
- Shown only to users with
activate_plugins
capability. - Shown twice globally.
- Shown only within two minutes of activation.
- On multisite, it can be shown on every sub-site, unless the plugin is network activated, then you’ll see it only on the main site.
- Shown only to users with
- Upgrade notices are now persistent; so, now you won’t miss an auto-upgrade.
- Accessibility:
- The SEO Bar item “Redirect” now conveys a more proper message when the page status is draft: “… once published.”
- “Duplicated words” is now “repeated words.”
- The Optimized Sitemap’s settings now explain there might be multiple sitemaps when Polylang or WPML is detected.
- The Title Settings their examples now better reflect real-world usage in certain corner cases.
- The Pixel Counter now moves instantly as you type, instead of easing in, making it more reactive yet less distractive.
- Default titles are now pre-texturized before they are displayed in the title-editor, making for more accurate front-end output predictions.
- The floating title additions and prefixes now more accurately align themselves. For instance, when the padding of the input element is larger at the top than bottom, it’ll no longer float too high.
- SEO Bar:
- The description word counter now recognizes connector-dashes, connector-punctuation, and closing quotes. This means that
we're
is seen as a single word, instead of two.
- The description word counter now recognizes connector-dashes, connector-punctuation, and closing quotes. This means that
- Other:
- Shortened Optimized Sitemap’s stylesheet’s trimmed URL length from 96 to 93 characters, with the maximum decreased from 99 to 95 characters.
- We did Elementor’s developer’s job by marking the post types
elementor_library
ande-landing-page
as “not-publicly-queryable” – but only for The SEO Framework.- If we’d mark it as “not-publicly-queryable” for all of WordPress, some functionality in Elementor might break. We do not care for that.
- Elementor’s devs had to mark it conditionally-public instead of conditionally-not-public. Thinking backwardly poses some difficulty for the average mind. Nevertheless, that’d remove about 2000 support inquiries for/about them yearly.
- Link now protects your site from hackers.
- Disclaimer: he does not, he can barely safe Hyrule without Farore.
- Sitemaps:
- Removed:
- Toggled off by default three years ago, hidden for almost all users one year ago, and now removed entirely: The Optimized Sitemap’s priority-meta feature. This feature hasn’t been used by any popular search engine for a long time.
- Older browsers no longer support window-resize support for the tabs of the “inpost SEO meta box.”
- Fixed:
- Addressed an issue after using keyboard navigation to invoke tooltips, a mouse hover to invoke a tooltip didn’t clear the keyboard-invoked tooltip when spawned elsewhere.
- Addressed an issue after using mouse hover to invoke tooltips, after using keyboard navigation to invoke tooltips, a mouse click to invoke a tooltip thence caused the arrow to not animate correctly.
- Addressed an issue with settings-headless mode where the list-edit (quick/bulk-edit) features was untentionally disabled; it’s now disabled when the meta-headless mode is enabled.
- Addressed a corner-case issue with Polylang where on WP installations instated prior WP v4.4 the primary sitemap got emptied when no new languages have been setup since WP v4.4 or later.
- Addressed a regression from TSF v4.1.4 where the Schema.org setting “Logo URL” couldn’t be selected nor could the Sitemap Logo be assigned correctly (due to assigning duplicated unique IDs).
- Addressed an off-by-one error causing the first content-image to be skipped for social sharing. Props daxelrod.
- This fix also addresses that “only” ‘four’ images got taken from the content, instead of the intended ‘five’.
- Addressed a regression where a part of the HTML comments was not fully translatable.
- Addressed layout issues where the site title smaller than 60px will have their examples have too much surrounding space. This also fixed an edge-case issue that caused text to overflow the meta boxes.
- Addressed several edge-case instances where placeholders didn’t properly reflect the actual output.
- Addressed an issue where empty post type archives’ post types weren’t detected, causing TSF to abandon processing.
- Addressed an issue where paginated post type archives have had their canonical URL always point to the first page.
- Addressed an issue where WordPress’s blocking robots-meta was still being outputted on search pages.
- Addressed an issue where the first page of paginated search pages received an ‘page-type-paged’
rel=next
URL, instead of an ‘archive-type-paged’ one.- This also resolves an issue where the second page linked back to a non-existing first page via
rel=prev
.
- This also resolves an issue where the second page linked back to a non-existing first page via
- Addressed an issue where the user’s preferred counter type got reset after updating a user.
- Other:
- The following plugins are no longer recognized as “conflicting”:
- SEO:
- Gregs High Performance SEO,
gregs-high-performance-seo
– Plugin got sold and eventually abandoned.
- Gregs High Performance SEO,
- Sitemaps:
- Better WordPress Google XML Sitemaps,
bwp-google-xml-sitemaps
– Plugin is abandoned and doesn’t work with WordPress 5.5 or later. - Google XML Sitemaps for qTranslate,
google-xml-sitemaps-v3-for-qtranslate
– Plugin’s userbase is tiny, plugin also got delisted due to a guideline violation. - XML Sitemaps,
xml-sitemaps
– Plugin’s userbase is small and the plugin seems abandoned.
- Better WordPress Google XML Sitemaps,
- Open Graph:
- Facebook Thumb Fixer,
facebook-thumb-fixer
– Plugin got delisted by author. - NextGEN Facebook OG,
nextgen-facebook
– Plugin got delisted by author. - Social Sharing Toolkit,
social-sharing-toolkit
– Plugin seems abandoned and doesn’t work on PHP 7 anyway. - WP Facebook Open Graph protocol,
wp-facebook-open-graph-protocol
– Plugin got abandoned and delisted due to trademark violation.
- Facebook Thumb Fixer,
- SEO:
- The following plugins are no longer recognized as “conflicting”:
For translators
- Added:
- New sentences have been added.
- Updated:
- POT translation file.
- As always, various sentences have been updated for clarity.
For developers
We do not record privately marked method/file changes. Some of those unrecorded changes might inadvertently affect your code, but come from deeply-nested, inaccessible parts.
- Plugin database version is now at
4200
. - Changed:
- The sitemap stylesheet now uses a different HTML hierarchy to output items. We made this change so we could center the sitemap.
- We also offloaded the sitemap’s styles over different “views”. Located at
inc/views/sitemap/xsl
.
- We also offloaded the sitemap’s styles over different “views”. Located at
- Throughout the code, you’ll find we now use more modern PHP syntax, since we jumped off the delapidated PHP v5.6 boat, and onto the deprecated PHP v7.2 one.
- Over 25% of hosts are NOT doing their jobs to keep your site secure.
- Throughout the code, we removed typehinting. Typehinting is great for API consistency, but we thoroughly and correctly prefix every function with documentation on which type to use.
- The goal was to remove redundant opcodes.
- Yes, typehinting can help find bugs in development. But, its results can be catastrophic on user websites, something we do not have the time to deal with. We expect other developers to uphold the API.
- In the future, OpCache might look for typehints and use those to improve performance. When that day comes, we’ll typehint everything we can.
- For the description generator, we removed the “on ‘Blogname'” part on the homepage and blog page.
- We did this to ease integration of a custom blog name, which would otherwise have to be reflected in that description, making for smelly code we did not want to maintain.
- This change does not affect ranking directly.
- It’d be best if you provide a custom description, regardless. Search engines can also ignore your descriptions when they don’t meet certain requirements, which this one never did.
- The sitemap stylesheet now uses a different HTML hierarchy to output items. We made this change so we could center the sitemap.
- Fixed:
- Addressed output-deprecation notice in the meta-debugger from TSF v4.1.4.
- Option notes:
- Option
the_seo_framework_tested_upgrade_version
will be deleted on upgrade because TSF no longer tests for the compatible PHP or WordPress versions.- This will be reinstated automatically on downgrade.
- For option index
autodescription-site-settings
(filterthe_seo_framework_site_options
, constantTHE_SEO_FRAMEWORK_SITE_OPTIONS
):- Added:
- Index
site_title
is new, and overrides WordPress’s\get_bloginfo( 'name' )
value used within The SEO Framework.- This affects all titles, including those of Structured Data (which can be superseded by
knowledge_name
).
- This affects all titles, including those of Structured Data (which can be superseded by
- Index
pta
is new, it contains an array of all post-type meta, indexed by post type names as keys. View methodtsf()->get_unfiltered_post_type_archive_meta_defaults()
to see an array of post type keys.
- Index
- Changed:
- Index
show_priority
is no longer used nor sanitized.- Updating the options will purge this index. Then, it’ll be rendered as disabled on downgrade.
- Index
knowledge_name
is no longer ‘sanitized and escaped’ on-save, but now only ‘sanitized’.
- Index
- Added:
- Global option
the_seo_framework_tested_upgrade_version
is now removed. We let WordPress test for us now (WP5.2+ feature).
- Option
- Function notes:
- Added:
tsf()
, an alias ofthe_seo_framework()
. They have exactly the same opcodes, so neither is faster than the other. Pick your poison.\The_SEO_Framework\memo()
stores and returns memoized values for the caller.- This function is neat because you can use it without specifying a caching key; it knows who invokes it:
return memo() ?? memo( expensive_call() );
.- This neatness is limited to methods, not files or lines. Yet, this allows you to call
memo()
multiple times per method.
- This neatness is limited to methods, not files or lines. Yet, this allows you to call
- The second and later parameters can be used to forward arguments.
- We found it impossible to further optimize this method. If you inspect its source, you find it does things unconventionally. This all leads to PHP performing it quickest; both during set and fetch.
- This function is neat because you can use it without specifying a caching key; it knows who invokes it:
\The_SEO_Framework\umemo()
stores and returns memoized values for the caller using a user-defined key.- This function is roughly 10 times faster than
\The_SEO_Framework\memo()
, but requires from you a unique identifier$key
. Example:return umemo( __METHOD__ ) ?? umemo( __METHOD__, expensive_call() );
- This function is roughly 10 times faster than
\The_SEO_Framework\fmemo()
stores and returns memoized values for the Closure caller.- This function is the slower than
\The_SEO_Framework\memo()
and\The_SEO_Framework\umemo()
, but it can store the result of a whole function call at once, and it can prevent the function from running more than once. - Quirk: Memoization can be busted immediately by another caller by supplying a random (unused) argument.
- We did not use this method for it’s difficult to work with pre-PHP7.4.
- This function is the slower than
- Removed:
the_seo_framework_boot()
- This function was marked as “private,” and should’ve never been used publicly.
- Added:
- Object notes:
- Henceforth,
SeoBar
is now referred to asSEOBar
. This affects namespaces and classes.- In PHP, those are case-insensitive; so, nothing changes here.
- For object
\The_SEO_Framework\Bridges\Ping
:- Methods added:
get_ping_url()
- Methods added:
- For object
\The_SEO_Framework\Bridges\Scripts
:- Methods changed:
- The following no longer register l10n (data):
get_description_scripts()
get_gutenberg_compat_scripts()
get_list_edit_scripts()
get_social_scripts()
get_tabs_scripts()
get_term_edit_scripts()
now properly populatesuse_generated_archive_prefix()
with a\WP_Term
object.
- The following no longer register l10n (data):
- Methods changed:
- For object
\The_SEO_Framework\Builders\SEOBar\<Page|Term>
:- Method changed:
get_query_cache()
no longer returns the robots-copyright data at['states']['robotsmeta']
. Use the options API instead.
- Method changed:
- These objects are marked as private and should not be called. This is informational only.
- Object
The_SEO_Framework\Builders\Robots\Main
is new.- Used by new object
The_SEO_Framework\Builders\Robots\Args
andThe_SEO_Framework\Builders\Robots\Query
. - Use public method
tsf()->generate_robots_meta()
to access the builder.
- Used by new object
- Object
\The_SEO_Framework\Builders\SeoBar
is now\The_SEO_Framework\Builders\SEOBar\Main
. - Object
\The_SEO_Framework\Builders\SeoBar_Page
is now\The_SEO_Framework\Builders\SEOBar\Page
. - Object
\The_SEO_Framework\Builders\SeoBar_Term
is now\The_SEO_Framework\Builders\SEOBar\Term
. - Object
\The_SEO_Framework\Builders\Sitemap_Base
is now\The_SEO_Framework\Builders\Sitemap\Base
. - Object
\The_SEO_Framework\Debug
is now\The_SEO_Framework\Internal\Debug
. - Object
\The_SEO_Framework\Deprecated
is now\The_SEO_Framework\Internal\Deprecated
. - Object
\The_SEO_Framework\Interpreters\Settings_Input
is new. - Object
\The_SEO_Framework\Interpreters\Sitemap_XSL
is new.
- Object
- Object
\The_SEO_Framework\Builders\Sitemap
is now\The_SEO_Framework\Builders\Sitemap\Main
.- A class alias is made Just-in-Time to smoothen deprecation.
- For object
\The_SEO_Framework\Load
(callable viatsf()
andthe_seo_framework()
):- Methods added:
get_all_post_type_archive_meta_defaults()
returns an array of all public post type archive option defaults.get_filtered_raw_blogname()
fetches the filtered blogname without considering TSF’ssite_title
option.get_home_url()
, a memoized version of WordPress Core’sget_home_url()
.get_post_type_archive_custom_canonical_url()
, returns the canonical url for the provided PTA, if any exists.get_post_type_archive_meta()
returns all post type archive meta.get_post_type_archive_meta_defaults()
returns an array of default post type archive meta.get_post_type_archive_meta_item()
returns a single post type archive item’s value.get_public_post_type_archives()
, returns a list of all public post types with archives.get_raw_home_canonical_url()
, returns the canonical home URL.get_supported_post_type_archives()
, returns a list of all supported post types with archives.get_supported_taxonomies()
, returns a list of all supported taxonomies.get_warned_option()
returns whether an option is warned.has_posts_in_post_type_archive()
, tests if the post type archive of said post type contains public posts.is_home_as_page()
, detects the non-front blog page.output_js_social_data
, outputs reference social data for your input elements.retrieve_robots_meta_assertions()
, returns the last cycle’s robots-assertions. Only returns data when asserting is enabled.s_all_post_type_archive_meta()
, sanitizes all post type archive metadata.s_post_type_archive_meta()
, sanitizes post type archive metadata.use_post_type_archive_title_branding()
, tells whether branding is enabled for post type archives.
- Methods changed:
add_url_pagination()
now properly adds pagination to search links.can_i_use()
rewrote sorting algorithm; now, it’s actually good.do_meta_output()
- Now invokes two actions before and after output.
- No longer rectifies timezones.
generate_robots_meta()
now offloads metadata generation to an actual generator (coroutine).get_author_canonical_url()
- The first parameter is now optional.
- When the $id isn’t set, the URL won’t get tested for pagination issues.
get_available_twitter_cards()
- No longer memoizes the return value.
- No longer tests for the Twitter title.
get_conflicting_plugins()
now always runs the filter (the_seo_framework_conflicting_plugins_type
), even when$type
is not registered.get_default_option()
:- Now supports an option index (sequential array of strings) as
$key
. - Removed second parameter (
$use_cache
). - Now always memoizes the unslashed options.
- Now supports an option index (sequential array of strings) as
get_filtered_raw_custom_field_title()
- The first parameter can now be voided.
- The first parameter is now rectified, so you can leave out indexes.
get_filtered_raw_generated_title()
- The first parameter can now be voided.
- The first parameter is now rectified, so you can leave out indexes.
get_option()
now supports an option index (sequential array of strings) as$key
.get_plugin_indicator()
is no longer publicly accessible.get_post_type_archive_canonical_url()
:- Now correctly adds pagination to the URL.
- Removed argument type deprecation doing it wrong warning.
get_post_type_real_ID()
, now supports common archives without relying on the first post.get_raw_generated_archive_title_items
returns the archive title items, also works in admin.get_relative_fontcolor
optimized code, but it now has some rounding changes at the end. This could offset the returned values by 1/255th.get_robots_post_type_option_id
no longer sanitizes the input parameter.get_robots_taxonomy_option_id
no longer sanitizes the input parameter.get_singular_canonical_url()
- Added memoization.
- When the
$id
isn’t set, the URL won’t get tested for pagination issues.
get_singular_custom_canonical_url()
, the first parameter is now optional.get_static_front_page_title()
& its aliasget_blogname()
:- Now listens to the new
site_title
option. - Now applies filters.
- Now listens to the new
get_taxonomical_canonical_url()
:- Added memoization.
- The parameters are now optional.
get_taxonomical_custom_canonical_url()
, the first parameter is now optional.get_term_meta_item()
no longer accidentally returns an empty array on failure, butnull
(as intended) instead.get_warned_site_options()
now memoizes its return value.get_word_count()
now supports detection of connector-dashes, connector-punctuation, and closing quotes, and recognizes those as whole words.has_custom_canonical_url()
- Now also detects canonical URLs for taxonomies.
- Now also detects canonical URLs for post type archives.
hellip_if_over()
no longer prepends a space before the hellip.init_cron_actions()
is now a protected method, and can no longer be accessed.is_home()
, added the first parameter to allow custom query testing.is_theme()
no longer “loads” the theme; instead, simply compares input to active theme options.remove_pagination_from_url()
Now properly removes pagination from search links.save_user_meta()
no longer returns the update success state.s_user_meta()
now accepts and sanitizes the ‘counter_type’ index.trim_excerpt()
now enforces at least a character length of 1. This prevents needless processing.- The following methods now support the
$args = [ 'pta' => $post_type ]
parameter, and might do something new and useful for post type archives:create_canonical_url()
generate_robots_meta()
get_canonical_url()
, but you should usecreate_canonical_url()
instead.get_custom_field_image_details()
get_custom_field_title()
get_description()
get_description_from_custom_field()
get_filtered_raw_custom_field_title()
get_filtered_raw_generated_title()
get_generated_description()
get_generated_image_details()
get_generated_open_graph_description()
get_generated_title()
get_generated_twitter_description()
get_generated_twitter_title()
get_image_details()
get_image_generation_params()
get_open_graph_description()
get_open_graph_title()
get_raw_custom_field_title()
get_raw_generated_title()
get_redirect_url()
get_title()
get_title_branding_from_args()
get_twitter_description()
get_twitter_title()
is_auto_description_enabled()
merge_title_branding()
merge_title_protection()
use_title_branding()
use_title_pagination()
use_title_protection()
- Methods deprecated:
append_php_query()
, usetsf()->append_url_query()
instead.check_the_real_ID()
, usetsf()->get_the_real_ID()
instead.fb_locales()
, usetsf()->supported_social_locales()
instead.get_author_option()
, usetsf()->get_current_post_author_id()
instead.get_current_author_option()
, usetsf()->get_current_post_author_meta_item()
instead.get_current_term_meta()
, usetsf()->get_term_meta()
instead.get_default_settings()
, usetsf()->get_default_option()
instead.get_default_user_data()
, usetsf()->get_user_meta_defaults()
instead.get_logo_uploader_form()
, use\The_SEO_Framework\Interpreters\Form::get_image_uploader_form()
instead.get_safe_schema_image()
, usetsf()->get_image_details()
instead.get_social_image_uploader_form()
, use\The_SEO_Framework\Interpreters\Form::get_image_uploader_form()
instead.get_user_option()
, usetsf()->get_user_meta_item()
instead.get_warned_settings()
, usetsf()->get_warned_option()
instead.inpost_flex_nav_tab_wrapper()
, use\The_SEO_Framework\Bridges\PostSettings::_flex_nav_tab_wrapper()
instead.is_blog_page()
, usetsf()->is_home_as_page()
instead.is_blog_page_by_id()
, usetsf()->is_home()
instead.is_front_page_by_id()
, usetsf()->is_real_front_page_by_id()
instead.is_robots_meta_noindex_set_by_args()
, usetsf()->generate_robots_meta()
instead.is_wc_product()
, usetsf()->is_product()
instead.is_wc_product_admin()
, usetsf()->is_product_admin()
instead.is_wc_shop()
, usetsf()->is_shop()
instead.language_keys()
, usetsf()->supported_social_locales()
instead.make_info()
, use\The_SEO_Framework\Interpreters\HTML::make_info()
instead.make_single_select_form()
, use\The_SEO_Framework\Interpreters\Form::make_single_select_form()
instead.nav_tab_wrapper()
, use\The_SEO_Framework\Bridges\SeoSettings::_nav_tab_wrapper()
instead.robots_meta()
, usetsf()->generate_robots_meta()
instead.seo_settings_page_url()
, usetsf()->get_seo_settings_page_url()
instead.update_user_option()
, usetsf()->update_single_user_meta_item()
instead.- The following deprecated methods have no alternative avaible:
attention()
attention_description()
attention_description_noesc()
attention_noesc()
can_do_sitemap_robots()
code_wrap()
code_wrap_noesc()
description()
description_noesc()
detect_page_builder()
detect_theme_support()
field_id()
field_name()
get_field_id()
get_field_name()
get_html_output()
get_is_conditional_checked()
get_legacy_header_filters_output()
get_timezone_string()
is_conditional_checked()
is_default_checked()
is_warning_checked()
make_checkbox()
make_data_attributes()
output_character_counter_wrap()
output_pixel_counter_wrap()
prepend_tax_label_prefix
proportionate_dimensions()
reset_timezone()
set_timezone()
uses_page_builder()
wp_version()
wrap_fields()
- Methods removed:
get_home_page_tagline()
, was deprecated since 4.1.0.get_query_cache()
, still calling this shouldn’t cause notable issues: Caching simply fails.is_post_type_page()
, was deprecated since 4.1.0.is_taxonomy_public()
, was deprecated since 4.1.0.permalink_structure()
, was deprecated since 4.1.0.set_query_cache()
, still calling this shouldn’t cause notable issues: Caching simply fails.the_seo_framework_get_option()
, was deprecated since 4.1.0.
- Properties deprecated:
$load_options
, use constantTHE_SEO_FRAMEWORK_HEADLESS
instead.
- Methods added:
- Object
\The_SEO_Framework\Silencer
is now\The_SEO_Framework\Internal\Silencer
.
- Henceforth,
- Constant notes:
- Namespace
\The_SEO_Framework\
ROBOTS_ASSERT
, used for thetsf()->robots_meta()
method family; makes the generator store assertions at the slight cost of performance.- Use
tsf()->retrieve_robots_meta_assertions()
to obtain what’s asserted in the last run.
- Use
ROBOTS_IGNORE_PROTECTION
now also prevents tests against archive pagination. This to make the constant in line with homepage pagination.
- Namespace
- Filter notes:
- Added:
the_seo_framework_generated_archive_title_prefix
, filters the archive title prefix.- These should never be used. If I find you use these filters in the wild, I’ll call you out for being a dumb developer. Properly annotate your post types and taxonomies before thinking about touching these filters!
the_seo_framework_public_post_types
, filters public post types.the_seo_framework_public_taxonomies
, filters public taxonomies.this filter!
the_seo_framework_post_type_archive_meta
filters all post type meta.the_seo_framework_get_post_type_archive_meta_defaults
filters all post type meta defaults.the_seo_framework_post_type_archive_metabox
, enables or disables the post type archive metabox.the_seo_framework_tell_multilingual_sitemap
, whether to tell about multilingual sitemaps on the setting pages.
- Changed:
the_seo_framework_sitemap_extend
, no longer forwards theshow_priority
index in the second ($args
) parameter.the_seo_framework_sitemap_additional_urls
, no longer forwards theshow_priority
index in the second ($args
) parameter.the_seo_framework_generated_archive_title
, added the$prefix
and$original_title
parameters, akin to WordPress Core’sget_the_archive_title
, albeit shifted by one parameter.the_seo_framework_custom_field_description
, no longer gets supplied custom query arguments when in the loop.- The following filters have had their needless second parameter (
$args
) removed:the_seo_framework_general_settings_tabs
the_seo_framework_homepage_settings_tabs
the_seo_framework_robots_settings_tabs
the_seo_framework_schema_settings_tabs
the_seo_framework_sitemaps_settings_tabs
the_seo_framework_social_settings_tabs
the_seo_framework_title_settings_tabs
- The following filters may now receive the
$args = [ 'pta' => $post_type ]
argument:the_seo_framework_custom_field_description
the_seo_framework_enable_auto_description
the_seo_framework_fetched_description_excerpt
the_seo_framework_generated_archive_title
the_seo_framework_generated_description
the_seo_framework_image_details
the_seo_framework_image_generation_params
the_seo_framework_robots_meta_array
the_seo_framework_title_from_custom_field
the_seo_framework_title_from_generation
the_seo_framework_use_title_branding
- Deprecated:
the_seo_framework_after_output
, use actionthe_seo_framework_after_meta_output
instead.the_seo_framework_before_output
, use actionthe_seo_framework_before_meta_output
instead.the_seo_framework_pre
, use actionthe_seo_framework_before_meta_output
instead.the_seo_framework_pro
, use actionthe_seo_framework_after_meta_output
instead.the_seo_framework_pta_title
, use the options API instead.the_seo_framework_settings_capability
, use constantTHE_SEO_FRAMEWORK_SETTINGS_CAP
instead.the_seo_framework_the_archive_title
, usethe_seo_framework_generated_archive_title_prefix
andthe_seo_framework_generated_archive_title
instead.
- Fixed:
the_seo_framework_use_archive_prefix
now gets a proper term object when (quick-)editing terms, instead of the taxonomy object.
- Removed:
the_seo_framework_inpost_seo_save_defaults
, was deprecated. Usethe_seo_framework_post_meta_defaults
instead.
- Other:
- We exchanged various static
'class::method'
callbacks for[ 'class', 'method' ]
ones. This does not affect the behavior ofremove_filter
. It’s only easier to read.
- We exchanged various static
- Added:
- Action notes:
- Added:
the_seo_framework_after_meta_output
, this replaces filtersthe_seo_framework_pro
andthe_seo_framework_after_output
the_seo_framework_before_meta_output
, this replaces filtersthe_seo_framework_pre
andthe_seo_framework_before_output
the_seo_framework_post_type_archive_before
, runs before the post type archive metabox’s contents.the_seo_framework_post_type_archive_after
, runs after the post type archive metabox’s contents.
- Other:
- We exchanged various static
'class::method'
callbacks for[ 'class', 'method' ]
ones. This does not affect the behavior ofremove_action
. It’s only easier to read.
- We exchanged various static
- Added:
- JavaScript notes:
- Note:
- The dependencies have shifted around. If you require TSF scripts, be sure to register the dependencies of all the scripts you require – don’t depend on chained dependencies.
- Removed:
- Various localization strings used as data holders:
window.tsfDescription.l10n
&window.tsfDescriptionL10n
.window.tsfGBC.l10n
&window.tsfGBCL10n
.window.tsfLe.l10n
&window.tsfLeL10n
.window.tsfSocial.l10n
&window.tsfSocialL10n
.window.tsfTabs.l10n
&window.tsfTabsL10n
.
- Various localization strings used as data holders:
- Events:
- Added:
- On
window
, TSF now dispatchestsf-resize
. This is both throttled and debounced:- It invokes immediately to help paint quickly after a mobile device rotates.
- It debounces by 100ms if a chain of resizes take place (border of window is dragged, device is slow with resizing, etc.). After this is done debouncing, another
tsf-resize
may be invoked immediately.
- On
- Added:
- Object
window.tsf
:- Added:
disPatchAtInteractive
sDoubleSpace
sSingleLine
sTabs
- Removed:
tsf.l10n.states.isRTL
&window.tsfL10n.isRTL
, usewindow.isRtl
instead.
- Added:
- Object
window.tsfDescription
:- Changed:
updateStateAll
, added a 3rd parameter, allowing you to exclude updates for certain elements.updateStateOf
now remains intert on a non-change.
- Changed:
- Object
window.tsfTitle
:- Changed:
updateStateAll
, added a 3rd parameter, allowing you to exclude updates for certain elements.updateStateOf
now remains intert on a non-change.
- Changed:
- Object
window.tsfTT
:- Changed:
doTooltip
- Can now work asynchronously.
- Now returns boolean whether the tooltip was entered successfully.
- Now removes all other tooltips. Only one may prevail!
getTooltip
now returns aHTMLElement
instead of ajQuery.Element
.triggerReset
now debounces by 100ms.
- Changed:
- Object
window.tsfSocial
:- Added:
getInputInstance
getStateOf
setInputInstance
updateStateAll
updateStateOf
- Removed:
getState
, without deprecation.updateState
, without deprecation.
- Added:
- Note:
- Other:
- Removed workarounds for PHP bug 75771.
- You can now autoload The SEO Framework’s classes using the wrong case for the first “chunk” of namespace:
\ThE_sEo_FrAmEwOrK\
.- Pro tip: Don’t. We ‘implemented’ it only in the spirit of PHP’s case-handling.