We become just by doing just acts, temperate by doing temperate acts, brave by doing brave acts. – Aristotle
Release highlights
- There's a brand-new relational Schema.org structured data generator.
- We added a new shortcode (and function) for breadcrumbs to put in your templates.
- You can now select a preferred Twitter Card type for every post, term, and custom post type.
- Do you fancy the SEO Bar but find it distracting? Toggle the new dull, low-contrast color scheme.
- Special characters are now normalized for SEO Bar assertions, so it is now far more accurate.
- Users with an author role anywhere in a multisite network can now have their SEO meta tweaked from any site.
- Tooltip backgrounds and various border accents now adhere to the admin color scheme (once more).
Apex
Even though we dubbed TSF v4.2 “perfect,” it couldn’t be even better because of its legacy codebase. Many features and tweaks weren’t possible because those would’ve created bugs or made maintenance impossible. In v5.0, we overhauled everything while keeping in mind the future. In doing so, we managed to ascend to a new apex, and we can now see the next summit ahead.
Its code is unrecognizable, yet somehow very familiar. TSF v5.0 “Apex” is just the beginning of what comes next, and it won’t be downhill from here.
New breadcrumb shortcode
You can now use shortcode [tsf_breadcrumb]
. This shortcode is meant to be implemented in your theme and will output the current breadcrumb. It will listen to your meta title settings. You can learn more about its syntax in our Knowledge Base about the Breadcrumb shortcode.
New Schema.org graph generator
We added a new Schema.org structured data generator to TSF. This generator supports every page, post, archive, and custom post type. We built it to be referential and expansive by generating an ID-based graph. For example, if you refer to a Person once, their entity will be put right there, but if you refer to it again, it will use an ID-based reference. This keeps the output code neat and will not waste time generating an entity twice. You can filter it via the_seo_framework_schema_graph_data
.
New meta tag generator
TSF now generates all meta tags via a registry. You can alter the population of the registry via filters the_seo_framework_meta_generator_pools
and the_seo_framework_meta_generators
, and you can modify the final registry via filter the_seo_framework_meta_render_data
. For that, you can find an example at Github.
Important for developers
- We refactored the entire codebase in this update — over 1.20 million characters were written, and over 0.87 million were removed.
- The code counts 1229 registered changes; among which we added over 70 new classes, 220 new methods, 20 new filters, and a shortcode.
- For the main object,
tsf()
, we deleted 19 classes, deprecated 388 methods and 1 property, and deleted 110 methods and 10 properties. uid
is now an accepted custom query parameter for almost all meta-generator methods. If your custom filters for TSF act odd on profile pages, reach out to us in the forums and show us your code. We'll fix it for you.- So, if you ever used the
the_seo_framework()
ortsf()
function, you almost certainly will get a deprecation notice. If you need assistance resolving this, please open a new support topic and show us your code.
Environment upgrade notes
WordPress 5.5 through 5.8 are no longer supported. Here's why:
- Over 75% of all WordPress sites are using WordPress v5.9 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 7.2 and 7.3 are no longer supported. Here's why:
- Almost 80% of all WordPress sites are using PHP v7.4 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 a fantastic review, get a license, or do your friends and colleagues a favor by installing TSF for them.
Detailed log
We become brave by training ourselves to despise and endure terrors, and we shall be best able to endure terrors when we have become brave. – Aristotle
> View code changes.
> View closed issues.
For everyone
- Added:
- Breadcrumbs:
- HTML breadcrumb output is now supported. Since they aren’t coming to the Block editor anytime soon.
- You can use the shortcode,
[tsf_breadcrumb]
, which will output a breadcrumb for the current request. - The shortcode accepts attributes, these are the default values:
[tsf_breadcrumb sep="›" home="Home" class="tsf-breadcrumb"]
.sep
is the separator. This is outputted via CSScontent
, so you mustn’t use HTML.home
is the homepage’s name. This is translatable by default.class
is the CSS class for the breadcrumbs. This must be a valid class, or only the first few acceptable letters are chosen. When the entire class name is invalid, it’ll fall back totsf-breadcrumb
.- Detailed in our Knowledge Base about the Breadcrumb shortcode.
- You can use the function,
tsf_breadcrumbs()
, which will output the breadcrumbs for the current request. It accepts the same attributes as described above but then via a PHP array. - You can filter the attributes using filter
shortcode_atts_tsf_breadcrumb
. - You can filter the CSS using filter
the_seo_framework_breadcrumb_shortcode_css
. - You can filter the output using filter
the_seo_framework_breadcrumb_shortcode_output
.
- You can use the shortcode,
- HTML breadcrumb output is now supported. Since they aren’t coming to the Block editor anytime soon.
- Structured data:
- The Schema.org structured data generator has been upgraded to output graphs instead of simple, separated scripts.
- The way we’ve implemented it is faster and more robust than ever before, and it finally allows for rapid implementation of new types. This also means that we had to abandon all filters (see the developer notes far below).
- Because the data is much more expansive, we’ve added a new toggle to enable all structured data.
- This toggle is enabled by default for all new users of TSF.
- This toggle is enabled for existing users if Sitelinks Search Box, Authorized Presence, or Breadcrumbs are already enabled.
- We reintroduced the connected social networks interface for Schema.org.
- We still do not believe this is helpful for ranking. However, there’s little harm done in having it.
Schema.org/WebSite
is now added to every page.- When Sitelinks Searchbox is enabled:
Schema.org/SearchAction
is added to this.
- When Authorized Presence is enabled:
Schema.org/Organization
is added to this if the site represents an organization.Schema.org/Logo
is added to this.
Schema.org/Person
is added to this if the site represents a person.
- When Sitelinks Searchbox is enabled:
Schema.org/WebPage
is now added to every page but excluded or exploited query pages.- This type is changed from
WebPage
toCollectionPage
on archives. It’s changed to bothCollectionPage
andSearchResultsPage
on search pages. Schema.org/ReadAction
is added to this if the page is not an archive.Schema.org/Person
is added to this if there’s an author registered to the post.- When Breadcrumbs are enabled:
Schema.org/BreadcrumbList
is added to this.
- When Authorized Presence is enabled, and we’re on the front page:
Schema.org/Organization
is added to this if the site represents an Organization.Schema.org/Logo
is added to this.
- This type is changed from
Schema.org/BreadcrumbList
has been rewritten and is now supported on all types of pages, not just singular posts.
- The Schema.org structured data generator has been upgraded to output graphs instead of simple, separated scripts.
- Twitter Card:
- You can now override the default Twitter Card type for the homepage and every post, term, and post type archive.
- Yes, it’s still called Twitter Card, which is used for X and Discord.
- You can now override the default Twitter Card type for the homepage and every post, term, and post type archive.
- Multisite:
- On multisite, you can now inspect and edit user SEO metadata (“Authorial Info”) for any users that have author capabilities on any (other) blog.
- This capability is by default
edit_posts
, predefineable via constantTHE_SEO_FRAMEWORK_AUTHOR_INFO_CAP
.
- This capability is by default
- When switching blogs on multisite, all data memoization now flushes.
- On multisite, you can now inspect and edit user SEO metadata (“Authorial Info”) for any users that have author capabilities on any (other) blog.
- Migration:
- SEOPress’s metadata is now detected when activating the plugin for the first time, so TSF can suggest migrating SEO metadata.
- Third-party support:
- This plugin can now be updated via GitHub Plugin Updater.
- Accessibility:
- You can now opt to use a low-contrast color palette for the SEO Bar.
- We are aware this should be configurable via the device settings, but this standard is inconsistent. Besides, giving an option allows any site owner to set a preference.
- The color red will still jump out. This is because we use red to convey that something must be fixed. All other colors will look faded and less distracting.
- You can now opt to use a low-contrast color palette for the SEO Bar.
- Performance:
- All data fetchers use new memoization techniques that can hold data for up to 69 posts, terms, and users each (nice!). Whenever this number is exceeded in a single request, TSF maintains the first 7 entries and forgets the rest, assuming those first 7 are part of the initial request. This prevents excessive database lookups, data sanitization, etc., even beyond what we already did (only the last one requested was remembered).
- Breadcrumbs:
- Changed:
- Accessibility:
- The Homepage SEO Settings box’s title no longer carries a warning; instead, we added a bigger, more noticeable warning to every settings section when editing the homepage.
- We’re getting too many support inquiries about this; sorry about the noise, but it ought to decrease confusion.
- This also works around an issue where Gutenberg still doesn’t understand HTML.
- This also works around an issue where Gutenberg leadership does not respect the community that allowed them to create the everlasting abomination and fix all the points made here, which would take about 5 hours of work – postponed for 5 years already.
- The Homepage SEO Settings box’s title no longer carries a warning; instead, we added a bigger, more noticeable warning to every settings section when editing the homepage.
- Administration:
- When previewing a post, you may now be redirected when a custom redirect is entered in the meta.
- On various places where we mentioned Twitter, we now mention X. This is done sporadically, perhaps seemingly inconsistent, because we use “Twitter Card tags for X.”
- Compatibility:
- TSF now requires WordPress v5.9 or later, from WordPress v5.5 or later.
- When no proper Shop page is assigned in WooCommerce, TSF will now correctly treat the shop page as a Post Type Archive.
- In doing so, we removed the "Archives: " prefix. We find it an illogical addition for this post type specifically.
- The plugin compatibility loader now tests common filenames instead of function, constant, or class presence.
- Data:
- When activating or deactivating the plugin, only on WordPress 6.4 or later will the options toggle from autoloading ‘on’ and ‘off.’
- It will still toggle ‘on’ for older versions of WordPress but not ‘off.’
- When a dropdown option fails sanitization, it will revert back to the last known option instead of an arbitrary default.
- We no longer allow unregistered settings to be stored in TSF’s option meta. During the upgrade, all unregistered settings will be deleted automatically as a side-effect of registering new defaults.
- When activating or deactivating the plugin, only on WordPress 6.4 or later will the options toggle from autoloading ‘on’ and ‘off.’
- Meta tags:
- The
theme_color
metatag now also outputs on requests where Advanced Query Protection engages. article:modified_time
andarticle:published_time
now listen to Open Graph settings and will always try to output on single post types.- The description generator no longer uses the blog tagline for the homepage; it’s often too short anyway.
- Paginated URLs are now outputted regardless of indexation status or a custom canonical URL being present.
- This helps search engines find URLs to all paginated pages, improving link discovery.
- The shortlink URL is now also outputted on the paginated homepage.
- The
- Sitemaps:
- TSF no longer pings search engines the base sitemap location when updating the options without changing the options.
- Accessibility:
- Improved:
- Accessibility:
- The Custom Post Type Archive selector now better conveys that it’s not an option.
- When resetting the SEO Settings, a clearer “changed” notice is sent.
- When disabling Open Graph meta tags, the Post Dates tab will now disappear.
- When disabling Facebook, Twitter, or oEmbed meta tags, their namesake tab will now disappear.
- When disabling Open Graph, Facebook, Twitter, and oEmbed meta tags, the Social Title and Social Image settings will now disappear.
- When disabling the Website logo, the input form is now hidden.
- When disabling Authorized presence, all its related settings are now hidden.
- Administration:
- You can now store lone
0
‘s as titles and descriptions, and those will be outputted as-is on the front end.- If the title is unbranded, WordPress will replace the title.
- No one should make use of this feature. It serves as a flex that our data handling is super robust.
- You can now store ampersands (
&
), slashes (/
), and backward solidus (\
) in titles and descriptions without the risk of them being lost, changed, or duplicated on (a repeated) save.- Much work has been done in previous updates to prevent this issue, but we’re now certain this is robust.
- You can now store lone
- Compatibility:
- A new multilingual plugin conflict detector is implemented. Polylang, WPML, TranslatePress, and WPGlobus are detected by default as potentially conflicting. When a potentially conflicting multilingual plugin is detected:
- A warning is displayed above the homepage settings.
- A warning is displayed above the Post Type Archive settings.
- A warning is displayed in the Sitemap Output settings.
- When another SEO plugin is active, and you activate a plugin, a persistent notice is now outputted to warn that you shouldn’t mix SEO plugins.
- This notice is shown at most 3 times to admins that can activate plugins on the edit, edit-tags, plugins, dashboard, or The SEO Framework settings screens.
- This notice will clear when you deactivate a plugin or when it has been shown 3 times.
- Breadcrumbs of TSF are no longer disabled on WooCommerce product pages. This is because our new script ID can no longer conflict at Google.
- WooCommerce apparently also made changes to prevent the likelihood of conflicts.
- We no longer remove “All” languages from WPML when editing the SEO Settings – in the past, it caused querying issues.
- A new multilingual plugin conflict detector is implemented. Polylang, WPML, TranslatePress, and WPGlobus are detected by default as potentially conflicting. When a potentially conflicting multilingual plugin is detected:
- Localization:
- Repeated spacing in metadata is now replaced using the same space character inputted instead of a default space character.
- Performance:
- The plugin is faster now due to new coding standards (among others).
- Multiple types of homepages are no longer tested when fetching custom metadata, improving performance when viewing the administrative post list.
- The main query is no longer performed by WordPress when loading the sitemap, removing 10 redundant database queries.
- Related Core ticket is #51117.
- Sticky posts are no longer calculated when generating the sitemap, removing a redundant database query.
- Related Core ticket is #51542.
- The URL generator has been rewritten from the ground up. With that, we removed all patches for pagination and rely on our pagination tweaks now.
- Because of this, the sitemap generates up to 6% faster.
- The Shortlink generator has been rewritten. It no longer generates the URL before it determines it can actually use it. It also uses a much more straightforward method to append the query parameters.
- The Image generator has been rewritten. It now only feeds data when an actual image is found; this reduces operation feedback in subroutines, improving performance significantly.
- The main object in the plugin has been largely emptied and is 558 methods lighter. More importantly, it’s 15 668 lines of code (including comments) smaller.
- Now, depending on the options you use and which page one visits, selectively, only the required methods are loaded.
- Now, the main object is rarely required internally, but most methods are called statically (directly). This reduces the function overhead anywhere from 4% to 62%.
- Still, this may increase overhead by 17% due to a quirk in PHP. But, we combat this by creating as few methods as possible at the cost of “readability” (this only affects developers not using a modern code editor).
- Generated image metadata are now cached per method using PHP 8’s “Fiber” principle (I backported it conceptually to 7.4). This way, the generation of image metadata no longer relies on the type of image requested (Twitter, Open Graph, Structured Data) but may always benefit from already generated image metadata and continue to make more metadata when there’s demand.
- Fewer term and post metadata are stored in the plugin’s memoization (up to 69 items each, nice), so there’s less of a strain on memory when generating sitemaps or walking through metadata. Object caching can still work and won’t be affected.
- The SEO Bar no longer asserts the length of every word in a description but only those that are encountered too often, speeding up post list performance significantly.
- The description generator no longer tries to find the first character separator recursively when there are none.
- Redirects:
- When an invalid URL is supplied by the admin in the redirect field, the plugin now displays a generic HTTP error code 400 (Bad Request) instead of showing the page.
- Other:
- Touched up Link’s face.
- Accessibility:
- Fixed:
- Administration:
- Tooltip text is now more specifically colored white, making text legible again with some custom admin themes.
- Addressed a regression from TSF v4.2.0 where WordPress admin color schemes stopped affecting TSF’s color scheme. Affected are:
- Tooltip background and text color.
- Post/Page SEO Settings active-tab border color.
- Title and description lengths are now calculated more quickly and more accurately for the SEO Bar.
- Dashlane is being decadent by first removing a perfectly good desktop app and then stopping to adhere to agreed-upon web accessibility standards. Now, it is trying to shove their own “standard” down our throats. We won’t mention that “standard,” for no one should use it. But we did, so Dashlane is now less annoying for TSF.
- The SEO Settings meta box is now also styled correctly inside the Block Editor for other post types than ‘post’ when positioned under the content.
- Most notably, the padding and border around the settings make it much easier on your eyes.
- If a custom social image URL is inserted in the homepage post-edit meta box, it will now also be depicted in the Homepage Settings meta box on the SEO Settings page.
- Resolved an issue where the homepage’s Post SEO Settings “Remove the site title?” automatically got checked after updating the page. Even though this didn’t have an effect on the output, switching the homepage would cause unwonted and unanticipated behavior.
- Resolved an issue where an asynchronous update state (such as changing counter types) would seem to load infinitely, but it should’ve actually indicated updating has failed.
- Resolved an issue where special characters in the site title couldn’t be recognized as a match for title branding. For example, a
'
didn’t match up to a'
,'
,'
, or'
, while they’re all considered equal once rendered. - Updated the Google Search Console verification ID link; their redirect to the new endpoint wasn’t correct.
- Title:
- Resolved an issue where the Twitter title would fall back to a custom Open Graph title when Open Graph is disabled.
- Resolved an issue where the incorrect Open Graph fallback title was proposed as a placeholder in the admin interface.
- Description:
- Resolved an issue where the Twitter description would fall back to a custom Open Graph description when Open Graph is disabled.
- Words with attached plain connector punctuation (
l'apostrophe
) now get tested correctly for repeated words. - Words with attached plain connector punctuation (
l'apostrophe
) are now considered starting or mid-sentence words, so thel'
-part ofl'apostrophe
will also be included in the description when it’s at the start, and theapostrophe
part won’t be trimmed anymore if not followed by at least 2 more words or final punctuation (dot). - Resolved an issue where the description generator didn’t recognize non-closing element tags in unescaped attributes.
<el attr="test>">content<el>
must matchcontent
, not">content
.
- Resolved an issue where the description generator didn’t recognize an element’s second or later unclosed attributes.
<el attr attr="test> test=">content<el>
must matchcontent
, nottest=">content
.
- Resolved an issue where the description would face catastrophic backtracking when stacking elements never closed all.
<el 1><el 2></el> ... never close el 1
should match the entire document instead of halting the process.
- Resolved an issue that when the description generator found a similar unclosed element in a stack, it’d consider it as the beginning of the stack.
<element><element></element></never-closing-element>etc...
matched<element></element></never-closing-element>etc...
but now matches the second<element>
as content (which will then be obliterated in the second pass).
- Compatibility:
- Fixed a bug in Polylang that breaks all plugins but Yoast SEO and achieves nothing but slowing down your site – simply by purging Polylang’s egregious AJAX-handler from browser memory.
- Fixed an issue where the sitemap was invalidated when a URL had special query parameters with non-Latin characters.
- Meta output:
- Even if WordPress can’t fulfill a JSON-type request, WordPress will falsely report it’s parsing JSON-formatted content. Caching plugins ignore this and create a copy of this JSON-type response as a regular page, with the content altered – learn more. TSF no longer stops outputting SEO metadata when a JSON type is requested by a visitor, so caching plugins won’t accidentally store copies without metadata any longer.
- Akin to
is_admin()
, unexpected behavior will occur in WordPress, themes, and plugins when sending JSON headers. We deem this a security issue, although Automattic thinks differently (hence, Jetpack is still vulnerable to/?_jsonp=hi
, and so are hundreds of other plugins). Because we treated this as a security issue, we had to wait for Automattic to report back. - We consider the following WordPress API functions dangerous, and we advise security researchers investigating plugins utilizing these:
wp_is_json_request()
wp_is_jsonp_request()
wp_is_xml_request()
- Akin to
- Even if WordPress can’t fulfill a JSON-type request, WordPress will falsely report it’s parsing JSON-formatted content. Caching plugins ignore this and create a copy of this JSON-type response as a regular page, with the content altered – learn more. TSF no longer stops outputting SEO metadata when a JSON type is requested by a visitor, so caching plugins won’t accidentally store copies without metadata any longer.
- Shortlink:
- The shortlink can now generate a proper tag URL. WordPress created a different endpoint for this, unlike any other taxonomy.
- Headless mode:
- Primary terms are now ignored when
meta
is headless.
- Primary terms are now ignored when
- oEmbed:
- Resolved an issue where, when Open Graph meta tags were disabled, the oEmbeds would still take Open Graph titles.
- We added a tooltip to the option to explain it will fall back to the meta title if the Open Graph title is unavailable.
- Resolved an issue where, when Open Graph meta tags were disabled, the oEmbeds would still take Open Graph titles.
- Administration:
- Removed:
- The following plugins are no longer recognized as conflicting plugins:
- SEO: Yoast SEO Premium (Yoast SEO needs to be active for Yoast SEO Premium to work).
- Yoast SEO is still checked for.
- Sitemaps: Simple Wp Sitemap (abandoned).
- SEO: Yoast SEO Premium (Yoast SEO needs to be active for Yoast SEO Premium to work).
- Open Graph tag
og:updated_time
is no longer outputted; it is inferred fromarticle:modified_time
. - Facebook’s App ID is no longer available. You may get warnings in Facebook’s debugger about this, which you can safely ignore (Facebook doesn’t use this tag any longer, and their debugger is outdated).
- The following plugins are no longer recognized as conflicting plugins:
For translators
- Added:
- New sentences have been added.
- Updated:
- POT translation file.
- As always, various sentences have been updated for clarity.
For developers
- The plugin database version is now at
5001
. - Added:
- Over 220 methods have been added; only a few significant and moved methods have been mentioned in this changelog.
- Pooled objects:
- We pooled objects in methods; these methods allow you to directly access a class. Although we do not use pools internally (we call the classes directly), we urge you to use the pool. This is because it has a neat little feature: Dynamic deprecation. Whenever we choose to remove a method or property you used from a pool, your site won’t crash when you update the plugin – instead, you get a deprecation notice and a temporary fallback value.
- To learn more, check out method
tsf()->query()
and traitStatic_Deprecator
. Since the method is brand new, nothing has been deprecated yet.
- To learn more, check out method
- We pooled objects in methods; these methods allow you to directly access a class. Although we do not use pools internally (we call the classes directly), we urge you to use the pool. This is because it has a neat little feature: Dynamic deprecation. Whenever we choose to remove a method or property you used from a pool, your site won’t crash when you update the plugin – instead, you get a deprecation notice and a temporary fallback value.
- Pool
tsf()->query()
is now available.- All public query-related methods have been moved to that pool. E.g.,
tsf()->is_product()
is nowtsf()->query()->is_product()
. - Internally known as
The_SEO_Framework\Helper\Query
. - This pool has a sub-pool, accessible via
tsf()->query()->cache()
.- Internally known as
The_SEO_Framework\Helper\Query\Cache
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->query()->exclusion()
.- Internally known as
The_SEO_Framework\Helper\Query\Exclusion
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->query()->utils()
.- Internally known as
The_SEO_Framework\Helper\Query\Utils
.
- Internally known as
- All public query-related methods have been moved to that pool. E.g.,
- Pool
tsf()->post_type()
is now available.- All public post type methods have been moved to that pool. E.g.,
tsf()->is_post_type_supported()
is nowtsf()->post_type()->is_supported()
. - Internally known as
The_SEO_Framework\Helper\Post_Type
.
- All public post type methods have been moved to that pool. E.g.,
- Pool
tsf()->taxonomy()
is now available.- All public taxonomy methods have been moved to that pool. E.g.,
tsf()->is_taxonomy_supported()
is nowtsf()->taxonomy()->is_supported()
. - Internally known as
The_SEO_Framework\Helper\Taxonomy
.
- All public taxonomy methods have been moved to that pool. E.g.,
- Pool
tsf()->robots()
is now available.- All public taxonomy methods have been moved to that pool. E.g.,
tsf()->get_robots_meta()
is nowtsf()->robots()->get_meta()
. - Internally known as
The_SEO_Framework\Meta\Robots
.
- All public taxonomy methods have been moved to that pool. E.g.,
- Pool
tsf()->uri()
is now available.- All public uri-related methods have been moved to that pool. E.g.,
tsf()->get_custom_canonical_url()
is nowtsf()->uri()->get_custom_canonical_url()
. - Internally known as
The_SEO_Framework\Meta\URI
. - This pool has a sub-pool, accessible via
tsf()->uri()->utils()
.- Internally known as
The_SEO_Framework\Meta\URI\Utils
.
- Internally known as
- All public uri-related methods have been moved to that pool. E.g.,
- Pool
tsf()->title()
is now available.- All public title-related methods have been moved to that pool. E.g.,
tsf()->get_custom_title()
is nowtsf()->title()->get_custom_title()
. - Internally known as
The_SEO_Framework\Meta\Title
. - This pool has a sub-pool, accessible via
tsf()->title()->utils()
.- Internally known as
The_SEO_Framework\Meta\Title\Utils
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->title()->conditions()
.- Internally known as
The_SEO_Framework\Meta\Title\Conditions
.
- Internally known as
- All public title-related methods have been moved to that pool. E.g.,
- Pool
tsf()->description()
is now available.- All public description-related methods have been moved to that pool. E.g.,
tsf()->description()
is nowtsf()->description()->get_description()
. - Internally known as
The_SEO_Framework\Meta\Description
. - This pool has a sub-pool, accessible via
tsf()->description()->excerpt()
.- Internally known as
The_SEO_Framework\Meta\Description\Excerpt
.
- Internally known as
- All public description-related methods have been moved to that pool. E.g.,
- Pool
tsf()->open_graph()
is now available.- All public Open Graph-related methods have been moved to that pool. E.g.,
tsf()->get_open_graph_title()
is nowtsf()->open_graph()->get_description()
. - Internally known as
The_SEO_Framework\Meta\Open_Graph
.
- All public Open Graph-related methods have been moved to that pool. E.g.,
- Pool
tsf()->facebook()
is now available.- Facebook never had a public API, but it now has new methods, e.g.,
tsf()->facebook()->get_author()
. - Internally known as
The_SEO_Framework\Meta\Facebook
.
- Facebook never had a public API, but it now has new methods, e.g.,
- Pool
tsf()->guidelines()
is now available.- Internally known as
The_SEO_Framework\Helper\Guidelines
.
- Internally known as
- Pool
tsf()->headers()
is now available.- Internally known as
The_SEO_Framework\Helper\Headers
.
- Internally known as
- Pool
tsf()->twitter()
is now available.- All public Twitter-related methods have been moved to that pool. E.g.,
tsf()->get_twitter_title()
is nowtsf()->twitter()->get_description()
. - Internally known as
The_SEO_Framework\Meta\Twitter
.
- All public Twitter-related methods have been moved to that pool. E.g.,
- Pool
tsf()->image()
is now available.- All public Image-related methods have been moved to that pool. E.g.,
tsf()->get_custom_field_image_details()
is nowtsf()->image()->get_custom_image_details()
. - Internally known as
The_SEO_Framework\Meta\Image
.
- All public Image-related methods have been moved to that pool. E.g.,
- Pool
tsf()->schema()
is now available.- Also contains a public property:
$entities
, a list of all supported entity class names. - Internally known as
The_SEO_Framework\Meta\Image
.
- Also contains a public property:
- Pool
tsf()->breadcrumbs()
is now available.- Internally known as
The_SEO_Framework\Meta\Breadcrumbs
.
- Internally known as
- Pool
tsf()->robotstxt()
is now available.- All public
robots.txt
-related methods have been moved to that pool. E.g.tsf()->robotstxt()->get_robots_txt()
- Internally known as
The_SEO_Framework\RobotsTXT\Main
. - This pool has a sub-pool, accessible via
tsf()->robotstxt()->utils()
.- Internally known as
The_SEO_Framework\RobotsTXT\Utils
.
- Internally known as
- All public
- Pool
tsf()->sitemap()
is now available.- Unlike most other pools, this is a Closure where it stores only sub-pools.
- This pool has a sub-pool, accessible via
tsf()->sitemap()->cache()
.- Internally known as
The_SEO_Framework\Sitemap\Cache
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->sitemap()->ping()
.- Internally known as
The_SEO_Framework\Sitemap\Ping
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->sitemap()->lock()
.- Internally known as
The_SEO_Framework\Sitemap\Lock
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->sitemap()->registry()
.- Internally known as
The_SEO_Framework\Sitemap\Registry
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->sitemap()->utils()
.- Internally known as
The_SEO_Framework\Sitemap\Utils
.
- Internally known as
- Pool
tsf()->format()
is now available.- Unlike most other pools, this is a Closure where it stores only sub-pools.
- This pool has a sub-pool, accessible via
tsf()->format()->markdown()
.- Internally known as
The_SEO_Framework\Helper\Format\Markdown
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->format()->time()
.- Internally known as
The_SEO_Framework\Helper\Format\Time
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->format()->arrays()
.- Internally known as
The_SEO_Framework\Helper\Format\Arrays
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->format()->strings()
.- Internally known as
The_SEO_Framework\Helper\Format\Strings
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->format()->color()
.- Internally known as
The_SEO_Framework\Helper\Format\Color
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->format()->html()
.- Internally known as
The_SEO_Framework\Helper\Format\HTML
.
- Internally known as
- Pool
tsf()->admin()
is now available.- Unlike most other pools, this is a Closure where it stores only sub-pools.
- This pool has a sub-pool, accessible via
tsf()->admin()->menu()
.- Internally known as
The_SEO_Framework\Admin\Menu
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->admin()->notice()
.- Internally known as
The_SEO_Framework\Admin\Notice
. - This pool has a sub-pool, accessible via
tsf()->admin()->notice()->persistent()
.- Internally known as
The_SEO_Framework\Admin\Notice\Persistent
.
- Internally known as
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->admin()->layout()
.- Unlike most other sub-pools, this is a Closure where it stores only sub-pools.
- This pool has a sub-pool, accessible via
tsf()->admin()->layout()->html()
.- Internally known as
The_SEO_Framework\Admin\Settings\Layout\HTML
.
- Internally known as
- This pool has a sub-pool, accessible via
tsf()->admin()->layout()->form()
.- Internally known as
The_SEO_Framework\Admin\Settings\Layout\Form
.
- Internally known as
- Pool
tsf()->data()
is now available.- Unlike most other pools, this is a Closure where it stores only sub-pools.
- This pool has a sub-pool, accessible via
tsf()->data()->blog()
.- All public WordPress blog-related methods have been moved to that pool. E.g.,
tsf()->get_blogname()
is nowtsf()->data()->blog()->get_public_blog_name()
. - Internally known as
The_SEO_Framework\Data\Blog
.
- All public WordPress blog-related methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin()
.- All public TSF-related storage methods have been moved to that pool. E.g.,
tsf()->get_all_options()
is nowtsf()->data()->plugin()->get_options()
.- However, three of its methods have been ennobled to be part of the legacy API. So, you can use
tsf()->get_option()
,tsf()->get_options()
, andtsf()->update_option()
.
- However, three of its methods have been ennobled to be part of the legacy API. So, you can use
- Internally known as
The_SEO_Framework\Data\Plugin
. - This pool has a sub-pool, accessible via
tsf()->data()->plugin->helper()
.- All public TSF-related storage helper methods have been moved to that pool. E.g.,
tsf()->get_robots_option_index()
is nowtsf()->data()->plugin()->helper()->get_robots_post_type_option_id()
. - Internally known as
The_SEO_Framework\Data\Plugin\Helper
.
- All public TSF-related storage helper methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin->post()
.- All public TSF-related Post storage methods have been moved to that pool. E.g.,
tsf()->get_post_meta_item()
is nowtsf()->data()->plugin()->post()->get_meta_item()
. - Internally known as
The_SEO_Framework\Data\Plugin\Post
.
- All public TSF-related Post storage methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin->pta()
.- All public TSF-related Post Type Archive storage methods have been moved to that pool. E.g.,
tsf()->get_post_type_archive_meta_item()
is nowtsf()->data()->plugin()->pta()->get_meta_item()
. - Internally known as
The_SEO_Framework\Data\Plugin\PTA
.
- All public TSF-related Post Type Archive storage methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin->setup()
.- All public TSF-related Plugin Setup storage methods have been moved to that pool. E.g.,
tsf()->get_default_site_options()
is nowtsf()->data()->plugin()->setup()->get_default_options()
. - Internally known as
The_SEO_Framework\Data\Plugin\Setup
.
- All public TSF-related Plugin Setup storage methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin->term()
.- All public TSF-related Plugin Term storage methods have been moved to that pool. E.g.,
tsf()->get_term_meta_item()
is nowtsf()->data()->plugin()->term()->get_meta_item()
. - Internally known as
The_SEO_Framework\Data\Plugin\Term
.
- All public TSF-related Plugin Term storage methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->plugin->user()
.- All public TSF-related Plugin User storage methods have been moved to that pool. E.g.,
tsf()->get_user_meta_item()
is nowtsf()->data()->plugin()->user()->get_meta_item()
. - Internally known as
The_SEO_Framework\Data\Plugin\User
.
- All public TSF-related Plugin User storage methods have been moved to that pool. E.g.,
- All public TSF-related storage methods have been moved to that pool. E.g.,
- This pool has a sub-pool, accessible via
tsf()->data()->post()
.- All public WordPress post-related methods have been moved to that pool. E.g.,
tsf()->get_post_content()
is nowtsf()->data()->post()->get_content()
. - Internally known as
The_SEO_Framework\Data\Post
.
- All public WordPress post-related methods have been moved to that pool. E.g.,
- Improved:
- Method
tsf()->__set()
now protects against fatal errors on PHP 8.2 or later. - Usage of stopwatch
microtime()
has been exchanged forhrtime()
, improving accuracy and performance. - Deprecation and inaccessible property/method notices now absolutely accurately™ find the originating caller.
- Query error notices also now absolutely accurately™ find the originating caller, in reverse order.
0
should be allowed as a custom social/meta title and description now. Use\The_SEO_Framework\coalesce_strlen()
to test.- Options are no longer fetched twice every admin request to see if they still need to be registered, but instead always use our memoization engine when possible.
- We offloaded this checking to the setup, so it only checks once (ever) per WordPress site.
- Method
- Changed:
- When
tsf()
orthe_seo_framework()
are called too early (beforeplugins_loaded
), they’ll return a silencer class. - Title overwriting is now engaged at
template_redirect
, instead of atplugins_loaded
. This also tests for query support, so filteringthe_seo_framework_query_supports_seo
now affects titles.- This means that some plugins will have their title filters discarded once again. However, reenabling support for this is now much easier.
- Twitter cards are no longer validated whether a card type is provided.
- Hence, returning an empty string to the (now deprecated) filter
'the_seo_framework_twittercard_output'
will no longer disable Twitter cards.
- Hence, returning an empty string to the (now deprecated) filter
- When scripts are enqueued, it is now automatically determined whether late-enqueuing in the footer is necessary.
- Generation arguments:
- Generation arguments for getting titles, descriptions, canonical URLs, etc., now support
'tax'
instead of'taxonomy'
. - We also added support for
'uid'
, which stands for “User ID,” provisioned to become fully embraced in a future update. This is used sparingly and shouldn’t be relied on just yet. We have implemented checks against this parameter for forward compatibility.
- Generation arguments for getting titles, descriptions, canonical URLs, etc., now support
- Script templates no longer forward arguments by name but put them sequentially in variable
$view_args
instead. - Almost all of the plugin’s data is now sanitized when using the WordPress option or meta APIs instead of only when using TSF’s APIs. The exception is post metadata, which we’ll address in the next major update (learn more).
- Migration plugins might be affected if they use the default WordPress option/meta API calls that invoke any of these hooks:
'sanitize_option_' . THE_SEO_FRAMEWORK_SITE_OPTIONS
,'sanitize_term_meta_' . THE_SEO_FRAMEWORK_TERM_OPTIONS
.'sanitize_user_meta_' . THE_SEO_FRAMEWORK_USER_OPTIONS
.
- Migration plugins might be affected if they use the default WordPress option/meta API calls that invoke any of these hooks:
- When
- Fixed:
- Resolved PHP warning when editing a post type with altered term type availability.
- Resolved PHP warning when editing a user with editor capabilities on the primary network’s site via WordPress Multisite user-edit interface.
- The
<font>
tag is deprecated, so we updated the tag and its to<span>
in the debug panels.- These Easter eggs were fun while they lasted.
- Resolved an issue where Post Type Archive metadata could still be obtained after the post type is set to not be supported by TSF.
- Option notes:
- For option index
autodescription-site-settings
(constantTHE_SEO_FRAMEWORK_SITE_OPTIONS
):- Added:
- Index
auto_description_html_method
, this used to beauto_descripton_html_method
(typo). - Index
ld_json_enabled
, this is used to toggle all Schema.org option generation.
- Index
- Changed:
- The options no longer have their slashes stripped via
stripslashes_deep
. This was done precautionary because WordPress adds slashes to everything to account for a long-discouraged PHP quirk. Resaving the options would then cause slashes to become repeated:'
becomes\'
,\'
becomes\\\'
, etc. This is now addressed.- WordPress addressed this issue in their options API, about which I was unaware.
- See https://www.php.net/manual/en/function.get-magic-quotes-gpc.php.
- The options no longer have their slashes stripped via
- Removed
- Index
auto_descripton_html_method
.- It is now
auto_description_html_method
(typo in “description”). - We found no indication this was used in public yet, so we didn’t go through a deprecation process. Sorry in advance if this change affects your site.
- It is now
- Index
knowledge_gplus
.- It’s no longer supported since 2018; we kept it around because users could fill whatever URL in this field. But, it’s time to say goodbye to this cruft.
- Index
facebook_appid
.- Facebook no longer uses this, nor should you.
- Index
- Added:
- For option index
autodescription-updates-cache
(constantTHE_SEO_FRAMEWORK_SITE_CACHE
):- It’s now
autodescription-site-cache
and its contents will be migrated after updating.- This option will now also be home to the Archive and Search Exclusion cache.
- This option will be removed on upgrade. If you downgrade, it will be repopulated, and there should be no issues with that.
- It’s now
- For option index
- Meta notes:
- For term index
autodescription-term-settings
(constantTHE_SEO_FRAMEWORK_TERM_OPTIONS
):- Changed:
- Although the options were properly unslashed by WordPress, we did nothing of the like for terms. Now, term data is unslashed before saving, for both regular term and quick-edit saving. This means
\
will remain\
, and won’t become\\
ad infinitum.
- Although the options were properly unslashed by WordPress, we did nothing of the like for terms. Now, term data is unslashed before saving, for both regular term and quick-edit saving. This means
- Changed:
- For the post meta (multiple indexes):
- Added:
_tsf_twitter_card_type
, this sets the prefered Twitter Card type.
- Changed:
- Just like with term meta, you can now store backward solidi (
\
) without breakage.
- Just like with term meta, you can now store backward solidi (
- Added:
- All meta generation methods are now assumed to return (pre-)sanitized data. You must still escape the data when printing to screen.
- For term index
- Transient notes:
- Added:
- Transient
tsf_sitemap_{$sitemap_id}_{$revision}_{$blog_id}_{$locale}
may now be stored for sitemaps.
- Transient
- Removed:
- Transient
tsf_sitemap_5_%
, where%
doesn’t contain the sitemap ID, but changes per blog ID and language, is no longer used. This transient should clear automatically. - Transient
tsf_exclude_1_%
, where%
changes per blog ID and language, is no longer used. This transient will be deleted on upgrade. - Transient
tsf_exclude_0_%
was leftover from TSF v3.0 and will be deleted on upgrade.
- Transient
- Added:
- Function notes:
- Added:
tsf_breadcrumb()
is now available. This outputs the breadcrumb for the current page. This is the callback function for shortcode[tsf_breadcrumb]
.- Its attributes (first argument) are filterable via
shortcode_atts_tsf_breadcrumb
.
- Its attributes (first argument) are filterable via
The_SEO_Framework\is_headless()
is now available. Use this in favor of\tsf()->is_headless
, which is now deprecated.The_SEO_Framework\normalize_generation_args()
is now available.The_SEO_Framework\get_query_type_from_args()
is now available. This is to quickly determine the type from all generation arguments.The_SEO_Framework\coalesce_strlen()
is now available. This is to quickly determine if a string has length, or coalesce otherwise.
- Changed:
tsf()
andthe_seo_framework()
will now always return TSF’s object – even if the plugin isn’t fully initialized. We can now do this because the hook loader has been moved from the class instance.
- Added:
- Object notes:
- New objects:
- There are over 70 new classes; however, they are ALL marked private. Use our new pool API instead.
- Deprecated objects:
- Class
The_SEO_Framework\Bridges\Scripts
is now deprecated. UseThe_SEO_Framework\Admin\Script\Loader
instead. - Class
The_SEO_Framework\Builders\Scripts
is now deprecated. UseThe_SEO_Framework\Admin\Script\Registry
instead. - Class
The_SEO_Framework\Interpreters\SEOBar
is now deprecated. UseThe_SEO_Framework\Admin\SEOBar\Builder
instead. - Class
The_SEO_Framework\Builders\Sitemap\Main
is now deprecated. UseThe_SEO_Framework\Sitemap\Optimized\Main
instead.- However, nothing useful is left to access directly in this class.
- Class
- Removed objects:
- Class
The_SEO_Framework\Builders\Images
is now gone without deprecation.- It was a helper class with complex generators. We doubt anyone used this directly.
- Class
- Existing objects:
- Class
The_SEO_Framework\Internal\Debug
is now marked private. It was never meant to be public. - For class
The_SEO_Framework\Load
(callable viatsf()
andthe_seo_framework()
):- Note: This class is no longer available or loaded by default. This class has become an API haven and is no longer used internally.
- Note: This class can no longer be instantiated via the
new
keyword. - Note: The following classes have been dropped from the god object
tsf()
and deleted:The_SEO_Framework\Admin_Init
The_SEO_Framework\Admin_Pages
The_SEO_Framework\Cache
The_SEO_Framework\Core
The_SEO_Framework\Detect
The_SEO_Framework\Generate
The_SEO_Framework\Generate_Description
The_SEO_Framework\Generate_Image
The_SEO_Framework\Generate_LDJson
The_SEO_Framework\Generate_Title
The_SEO_Framework\Generate_URL
The_SEO_Framework\Init
The_SEO_Framework\Post_Data
The_SEO_Framework\Query
The_SEO_Framework\Render
The_SEO_Framework\Sanitize
The_SEO_Framework\Site_Options
The_SEO_Framework\Term_Data
The_SEO_Framework\User_Data
- Methods added:
get_instance()
, this is marked private and you should use functiontsf()
instead.get_options()
load_admin_scripts()
print_seo_meta_tags()
admin()
(pool)breadcrumbs()
(pool)data()
(pool)description()
(pool)escape()
(pool)facebook()
(pool)format()
(pool)guidelines()
(pool)headers()
(pool)image()
(pool)open_graph()
(pool)post_type()
(pool)query()
(pool)robots()
(pool)robotstxt()
(pool)sanitize()
(pool)schema()
(pool)sitemap()
(pool)taxonomy()
(pool)title()
(pool)twitter()
(pool)uri()
(pool)
- Methods ennobled: These are now part of the legacy API and will be maintained indefinitely.
get_option()
get_options()
(new!)update_option()
get_title()
get_open_graph_title()
get_twitter_title()
get_description()
get_open_graph_description()
get_twitter_description()
get_canonical_url()
get_image_details()
load_admin_scripts()
(new!)- However, consider filtering
the_seo_framework_register_scripts
instead.
- However, consider filtering
print_seo_meta_tags()
(new!)
- Methods changed:
- Note: None of the generator API methods accept
id
directly anymore. Use$args
instead, which we exclusively promoted using since TSF v3.1.0 (September 2018). get_option()
- Removed $use_cache; the cache is now dynamically updated.
- Now returns null if the option doesn’t exist.
update_option()
, ennobled to be part of the legacy API.get_title()
- Removed the second parameter, the output is always sanitized now.
- Removed the third parameter; use
get_open_graph_title()
orget_twitter_title()
instead.
get_open_graph_title()
, removed the second parameter, the output is always sanitized now.get_twitter_title()
, removed the second parameter, the output is always sanitized now.get_description()
, removed the second parameter, the output is always sanitized now.get_open_graph_description()
, removed the second parameter, the output is always sanitized now.get_twitter_description()
, removed the second parameter, the output is always sanitized now.get_canonical_url()
- No longer calls the query in the sitemap to remove pagination.
- Removed support for argument index
get_custom_field
without deprecation notice (you should’ve usedcreate_canonical_url()
instead).
get_image_details()
, removed the last$clean
parameter. It always returns a cleaned image now.
- Note: None of the generator API methods accept
- Methods deprecated:
set_transient()
, use WordPress’s builtin namesake instead.get_transient()
, use WordPress’s builtin namesake instead.is_404()
, use WordPress’s builtin namesake instead.is_admin()
, use WordPress’s builtin namesake instead.is_customize_preview()
, use WordPress’s builtin namesake instead.is_date()
, use WordPress’s builtin namesake instead.is_day()
, use WordPress’s builtin namesake instead.is_feed()
, use WordPress’s builtin namesake instead.is_month()
, use WordPress’s builtin namesake instead.is_robots()
, use WordPress’s builtin namesake instead.get_post_type_real_id()
, usetsf()->query()->get_post_type_real_id()
instead.get_admin_post_type()
, usetsf()->query()->get_admin_post_type()
instead.get_post_types_from_taxonomy()
, usetsf()->taxonomy()->get_post_types()
instead.get_the_real_id()
, usetsf()->query()->get_the_real_id()
instead.get_the_real_admin_id()
, usetsf()->query()->get_the_real_admin_id()
instead.get_the_front_page_id()
, usetsf()->query()->get_front_page_id()
instead.get_admin_term_id()
, usetsf()->query()->get_admin_term_id()
instead.get_current_taxonomy()
, usetsf()->query()->get_current_taxonomy()
instead.get_current_post_type()
, usetsf()->query()->get_current_post_type()
instead.is_attachment()
, usetsf()->query()->is_attachment()
instead.is_attachment_admin()
, usetsf()->query()->is_attachment_admin()
instead.is_singular_archive()
, usetsf()->query()->is_singular_archive()
instead.is_archive()
, usetsf()->query()->is_archive()
instead.is_archive_admin()
, usetsf()->query()->is_archive_admin()
instead.is_term_edit()
, usetsf()->query()->is_term_edit()
instead.is_post_edit()
, usetsf()->query()->is_post_edit()
instead.is_wp_lists_edit()
, usetsf()->query()->is_wp_lists_edit()
instead.is_profile_edit()
, usetsf()->query()->is_profile_edit()
instead.is_author()
, usetsf()->query()->is_author()
instead.is_home()
, usetsf()->query()->is_blog()
instead.is_home_as_page()
, usetsf()->query()->is_blog_as_page()
instead.is_category()
, usetsf()->query()->is_category()
instead.is_category_admin()
, usetsf()->query()->is_category_admin()
instead.is_real_front_page()
, usetsf()->query()->is_real_front_page()
instead.is_real_front_page_by_id()
, usetsf()->query()->is_real_front_page_by_id()
instead.is_page()
, usetsf()->query()->is_page()
instead.is_page_admin()
, usetsf()->query()->is_page_admin()
instead.is_preview()
, usetsf()->query()->is_preview()
instead.is_search()
, usetsf()->query()->is_search()
instead.is_single()
, usetsf()->query()->is_single()
instead.is_single_admin()
, usetsf()->query()->is_single_admin()
instead.is_singular()
, usetsf()->query()->is_singular()
instead.is_singular_admin()
, usetsf()->query()->is_singular_admin()
instead.is_static_frontpage()
, usetsf()->query()->is_static_front_page()
instead.is_tag()
, usetsf()->query()->is_tag()
instead.is_tag_admin()
, usetsf()->query()->is_tag_admin()
instead.is_tax()
, usetsf()->query()->is_tax()
instead.is_shop()
, usetsf()->query()->is_shop()
instead.is_product()
, usetsf()->query()->is_product()
instead.is_product_admin()
, usetsf()->query()->is_product_admin()
instead.is_year()
, usetsf()->query()->is_year()
instead.is_ssl()
, usetsf()->query()->is_ssl()
instead.is_seo_settings_page()
, usetsf()->query()->is_seo_settings_page()
instead.is_menu_page()
, usetsf()->query()->is_menu_page()
instead.page()
, usetsf()->query()->page()
instead.paged()
, usetsf()->query()->paged()
instead.numpages()
, usetsf()->query()->numpages()
instead.is_multipage()
, usetsf()->query()->is_multipage()
instead.is_sitemap()
, usetsf()->query()->is_sitemap()
instead.advanced_query_protection()
, with no alternative available.the_description()
, with no alternative available.robots()
, with no alternative available.canonical()
, with no alternative available.shortlink()
, with no alternative available.paged_urls()
, with no alternative available.theme_color()
, with no alternative available.google_site_output()
, with no alternative available.bing_site_output()
, with no alternative available.yandex_site_output()
, with no alternative available.baidu_site_output()
, with no alternative available.pint_site_output()
, with no alternative available.use_og_tags()
, with no alternative available.og_title()
, with no alternative available.og_description()
, with no alternative available.og_locale()
, with no alternative available.og_type()
, with no alternative available.og_image()
, with no alternative available.og_sitename()
, with no alternative available.og_url()
, with no alternative available.og_updated_time()
, with no alternative available.facebook_author()
, with no alternative available.facebook_publisher()
, with no alternative available.use_facebook_tags()
, with no alternative available.article_published_time()
, with no alternative available.article_modified_time()
, with no alternative available.output_modified_time()
, with no alternative available.output_published_time()
, with no alternative available.get_current_twitter_card_type()
, usetsf()->twitter()->get_card_type()
instead.twitter_card()
, with no alternative available.twitter_site()
, with no alternative available.twitter_creator()
, with no alternative available.twitter_title()
, with no alternative available.twitter_description()
, with no alternative available.twitter_image()
, with no alternative available.use_twitter_tags()
, with no alternative available.array_merge_recursive_distinct()
, usetsf()->format()->arrays()->array_merge_recursive_distinct()
instead.retrieve_robots_meta_assertions()
, usetsf()->robots()->get_collected_meta_assertions()
instead.get_robots_meta()
, usetsf()->robots()->get_meta()
instead.generate_robots_meta()
, usetsf()->robots()->get_generated_meta()
instead.is_post_type_robots_set()
, usetsf()->robots()->is_post_type_robots_set()
instead.is_taxonomy_robots_set()
, usetsf()->robots()->is_taxonomy_robots_set()
instead.query_supports_seo()
, usetsf()->query()->utils()->query_supports_seo()
instead.is_query_exploited()
, usetsf()->query()->utils()->is_query_exploited()
instead.has_page_on_front()
, usetsf()->query()->utils()->has_page_on_front()
instead.is_post_type_supported()
, usetsf()->post_type()->is_supported()
instead.is_post_type_archive_supported()
, usetsf()->post_type()->is_pta_supported()
instead.post_type_supports_taxonomies()
, usetsf()->post_type()->supports_taxonomies()
instead.get_supported_post_type_archives()
, usetsf()->post_type()->get_all_supported_pta()
instead.get_public_post_type_archives()
, usetsf()->post_type()->get_public_pta()
instead.get_supported_post_types()
, usetsf()->post_type()->get_all_supported()
instead.is_post_type_disabled()
, usetsf()->post_type()->is_disabled()
instead.is_taxonomy_supported()
, usetsf()->taxonomy()->is_supported()
instead.get_supported_taxonomies()
, usetsf()->taxonomy()->get_all_supported()
instead.is_taxonomy_disabled()
, usetsf()->taxonomy()->is_disabled()
instead.is_term_meta_capable()
, usetsf()->query()->is_editable_term()
instead.get_hierarchical_post_types()
, usetsf()->post_type()->get_all_hierarchical()
instead.get_nonhierarchical_post_types()
, usetsf()->post_type()->get_all_nonhierarchical()
instead.get_hierarchical_taxonomies_as()
, usetsf()->taxonomy()->get_hierarchical()
instead.get_post_type_label()
, usetsf()->post_type()->get_label()
instead.get_tax_type_label()
, usetsf()->taxonomy()->get_label()
instead.generate_og_type()
, usetsf()->open_graph()->get_type()
instead.get_og_type()
, usetsf()->open_graph()->get_type()
instead.get_redirect_url()
, usetsf()->uri()->get_redirect_url()
instead.get_blogname()
, usetsf()->data()->blog()->get_public_blog_name()
instead.get_filtered_raw_blogname()
, usetsf()->data()->blog()->get_filtered_blog_name()
instead.get_blogdescription()
, usetsf()->data()->blog()->get_filtered_blog_description()
instead.generate_twitter_card_type()
, usetsf()->twitter()->get_card_type()
instead.get_twitter_card_types()
, usetsf()->twitter()->get_supported_cards()
instead.get_available_twitter_cards()
, with no alternative available.get_separator()
, usetsf()->title()->get_separator()
instead.get_title_separator()
, usetsf()->title()->get_separator()
instead.get_separator_list()
, usetsf()->title()->utils()->get_separator_list()
instead.trim_excerpt()
, usetsf()->format()->strings()->clamp_sentence()
instead.get_excerpt_by_id()
, usetsf()->description()->get_singular_excerpt()
instead.fetch_excerpt()
, usetsf()->description()->get_singular_excerpt()
instead.get_modified_time()
, with no alternative available.get_description_from_custom_field()
, usetsf()->description()->get_custom_description()
instead.get_generated_description()
, usetsf()->description()->get_generated()
instead.get_generated_twitter_description()
, usetsf()->twitter()->get_generated_description()
instead.get_generated_open_graph_description()
, usetsf()->open_graph()->get_generated_description()
instead.supported_social_locales()
, usetsf()->open_graph()->get_supported_locales()
instead.get_generated_open_graph_title()
, usetsf()->open_graph()->get_generated_title()
instead.get_generated_twitter_title()
, usetsf()->twitter()->get_generated_title()
instead.use_title_protection()
, usetsf()->title()->conditions()->use_protection_status()
instead.use_title_pagination()
, usetsf()->title()->conditions()->use_pagination()
instead.use_title_branding()
, usetsf()->title()->conditions()->use_branding()
instead.use_generated_archive_prefix()
, usetsf()->title()->conditions()->use_generated_archive_prefix()
instead.use_home_page_title_tagline()
, usetsf()->title()->conditions()->use_branding()
instead.use_singular_title_branding()
, usetsf()->title()->conditions()->use_branding()
instead.use_taxonomical_title_branding()
, usetsf()->title()->conditions()->use_branding()
instead.use_post_type_archive_title_branding()
, usetsf()->title()->conditions()->use_branding()
instead.get_title_seplocation()
, usetsf()->title()->get_addition_location()
instead.get_home_title_seplocation()
, usetsf()->title()->get_addition_location_for_front_page()
instead.get_home_title_additions()
, usetsf()->title()->get_addition_for_front_page()
instead.get_custom_field_title()
, usetsf()->title()->get_custom_title()
instead.get_generated_title()
, usetsf()->title()->get_generated_title()
instead.get_filtered_raw_custom_field_title()
, usetsf()->title()->get_bare_custom_title()
instead.get_filtered_raw_generated_title()
, usetsf()->title()->get_bare_generated_title()
instead.get_raw_custom_field_title()
, usetsf()->title()->get_bare_unfiltered_custom_title()
instead.get_raw_generated_title()
, usetsf()->title()->get_bare_generated_title()
instead.get_static_front_page_title()
, usetsf()->title()->get_front_page_title()
instead.get_generated_archive_title()
, usetsf()->title()->get_archive_title()
instead.get_raw_generated_archive_title_items()
, usetsf()->title()->get_archive_title_list()
instead.get_generated_single_post_title()
, usetsf()->title()->get_post_title()
instead.get_generated_single_term_title()
, usetsf()->title()->get_term_title()
instead.get_generated_post_type_archive_title()
, usetsf()->title()->get_post_type_archive_title()
instead.get_static_untitled_title()
, usetsf()->title()->get_untitled_title()
instead.get_generated_search_query_title()
, usetsf()->title()->get_search_query_title()
instead.get_static_404_title()
, usetsf()->title()->get_404_title()
instead.merge_title_branding()
, usetsf()->title()->add_branding()
instead.merge_title_pagination()
, usetsf()->title()->add_pagination()
instead.merge_title_protection()
, usetsf()->title()->add_protection_status()
instead.has_custom_canonical_url()
, usetsf()->uri()->get_custom_canonical_url()
instead.get_home_url()
, usetsf()->data()->blog()->get_front_page_url()
instead.get_preferred_scheme()
, usetsf()->uri()->utils()->get_preferred_url_scheme()
instead.set_preferred_url_scheme()
, usetsf()->uri()->utils()->set_preferred_url_scheme()
instead.detect_site_url_scheme()
, useuri()->utils()->detect_site_url_scheme()
instead.set_url_scheme()
, useuri()->utils()->set_url_scheme()
instead.make_fully_qualified_url()
, useuri()->utils()->make_fully_qualified_url()
instead.get_current_canonical_url()
, usetsf()->uri()->get_canonical_url()
instead.get_current_permalink()
, usetsf()->uri()->get_generated_permalink()
instead.get_homepage_permalink()
, usetsf()->uri()->get_bare_front_page_url()
instead.create_canonical_url()
, usetsf()->uri()->get_canonical_url()
ortsf()->uri()->get_custom_canonical_url()
instead.get_home_canonical_url()
, usetsf()->uri()->get_front_page_url()
instead.get_raw_home_canonical_url()
, usetsf()->uri()->get_bare_front_page_url()
instead.get_singular_canonical_url()
, usetsf()->uri()->get_singular_url()
instead.get_taxonomical_canonical_url()
, usetsf()->uri()->get_term_url()
instead.get_post_type_archive_canonical_url()
, usetsf()->uri()->get_pta_url()
instead.get_author_canonical_url()
, usetsf()->uri()->get_author_url()
instead.get_date_canonical_url()
, usetsf()->uri()->get_date_url()
instead.get_search_canonical_url()
, usetsf()->uri()->get_search_url()
instead.add_pagination_to_url()
, usetsf()->uri()->utils()->add_pagination_to_url()
instead.add_url_pagination()
, usetsf()->uri()->utils()->add_pagination_to_url()
instead.remove_pagination_from_url()
, usetsf()->uri()->utils()->remove_pagination_from_url()
instead.get_paged_url()
, usetsf()->uri()->get_paged_url()
instead.get_paged_urls()
, usetsf()->uri()->get_paged_url()
instead.get_home_host()
, usetsf()->uri()->utils()->get_site_host()
instead.append_url_query()
, usetsf()->uri()->utils()->append_url_query()
instead.matches_this_domain()
, usetsf()->uri()->utils()->url_matches_blog_domain()
instead.convert_to_url_if_path()
, usetsf()->uri()->utils()->convert_path_to_url()
instead.get_singular_custom_canonical_url()
, usetsf()->uri()->get_custom_canonical_url()
instead.get_taxonomical_custom_canonical_url()
, usetsf()->uri()->get_custom_canonical_url()
instead.get_post_type_archive_custom_canonical_url()
, usetsf()->uri()->get_custom_canonical_url()
instead.get_shortlink()
, usetsf()->uri()->get_shortlink()
instead.get_image_from_cache()
, usetsf()->get_first_valid_image()
instead.get_image_details_from_cache()
, usetsf()->get_image_details()
instead.get_custom_field_image_details()
, usetsf()->image()->get_custom_image_details()
instead.get_generated_image_details()
, usetsf()->image()->get_generated_image_details()
instead.merge_extra_image_details()
, usetsf()->image()->merge_extra_image_details()
instead.get_image_dimensions()
, usetsf()->image()->utils()->get_image_dimensions()
instead.get_image_alt_tag()
, usetsf()->image()->utils()->get_image_alt_tag()
instead.get_image_filesize()
, usetsf()->image()->utils()->get_image_filesize()
instead.get_largest_acceptable_image_src()
, usetsf()->image()->utils()->get_largest_image_src()
instead.get_settings_capability()
, use constantTHE_SEO_FRAMEWORK_SETTINGS_CAP
instead.can_access_settings()
, usecurrent_user_can( THE_SEO_FRAMEWORK_SETTINGS_CAP )
instead.html_output()
, usetsf()->print_seo_meta_tags()
instead.do_meta_output()
, usetsf()->print_seo_meta_tags()
instead.get_default_site_options()
, usetsf()->data()->plugin()->setup()->get_default_options()
instead.get_warned_site_options()
, usetsf()->data()->plugin()->setup()->get_warned_options()
instead.get_all_options()
, usetsf()->data()->plugin()->get_options()
instead.get_default_option()
, usetsf()->data()->plugin()->setup()->get_default_option()
instead.get_warned_option()
, usetsf()->data()->plugin()->setup()->get_warned_option()
instead.get_robots_post_type_option_id()
, usetsf()->data()->plugin()->helper()->get_robots_option_index()
instead.get_robots_taxonomy_option_id()
, usetsf()->data()->plugin()->helper()->get_robots_option_index()
instead.update_settings()
, usetsf()->data()->plugin()->update_option()
instead.get_static_cache()
, usetsf()->data()->plugin()->get_site_cache()
instead.update_static_cache()
, usetsf()->data()->plugin()->update_site_cache()
instead.update_static_cache()
, usetsf()->data()->plugin()->update_site_cache()
instead.get_term_meta_item()
, usetsf()->data()->plugin()->term()->get_meta_item()
instead.get_term_meta()
, usetsf()->data()->plugin()->term()->get_meta()
instead.get_term_meta_defaults()
, usetsf()->data()->plugin()->term()->get_default_meta()
instead.update_single_term_meta_item()
, usetsf()->data()->plugin()->term()->update_single_meta_item()
instead.get_latest_category_id()
, usetsf()->data()->term()->get_latest_category_id()
instead.get_latest_category_id()
, usetsf()->data()->term()->is_term_populated()
instead.get_latest_post_id()
, usetsf()->data()->post()->get_latest_post_id()
instead.get_primary_term()
, usetsf()->data()->plugin()->post()->get_primary_term()
instead.get_primary_term_id()
, usetsf()->data()->plugin()->post()->get_primary_term_id()
instead.update_primary_term_id()
, usetsf()->data()->plugin()->post()->update_primary_term_id()
instead.save_term_meta()
, usetsf()->data()->plugin()->term()->save_meta()
instead.delete_term_meta()
, usetsf()->data()->plugin()->term()->delete_meta()
instead.get_user_meta_item()
, usetsf()->data()->plugin()->user()->get_meta_item()
instead.get_current_post_author_meta_item()
, usetsf()->data()->plugin()->user()->get_current_post_author_meta_item()
instead.get_current_post_author_meta()
, usetsf()->data()->plugin()->user()->get_current_post_author_meta()
instead.get_user_meta()
, usetsf()->data()->plugin()->user()->get_meta()
instead.get_user_meta_defaults()
, usetsf()->data()->plugin()->user()->get_default_meta()
instead.update_single_user_meta_item()
, usetsf()->data()->plugin()->user()->update_single_meta_item()
instead.save_user_meta()
, usetsf()->data()->plugin()->user()->save_meta()
instead.get_post_author_id()
, usetsf()->query()->get_post_author_id()
instead.get_current_post_author_id()
, usetsf()->query()->get_post_author_id()
instead.get_user_id()
, usetsf()->query()->get_current_user_id()
instead.get_post_content()
, usetsf()->data()->post()->get_content()
instead.uses_non_html_page_builder()
, usetsf()->data()->post()->uses_non_html_page_builder()
instead.is_protected()
, usetsf()->data()->post()->is_protected()
instead.is_password_protected()
, usetsf()->data()->post()->is_password_protected()
instead.is_private()
, usetsf()->data()->post()->is_private()
instead.is_draft()
, usetsf()->data()->post()->is_draft()
instead.get_post_meta_item()
, usetsf()->data()->plugin()->post()->get_meta_item()
instead.get_post_meta()
, usetsf()->data()->plugin()->post()->get_meta()
instead.get_post_meta_defaults()
, usetsf()->data()->plugin()->post()->get_default_meta()
instead.update_single_post_meta_item()
, usetsf()->data()->plugin()->post()->update_single_meta_item()
instead.save_post_meta()
, usetsf()->data()->plugin()->post()->save_meta()
instead.get_post_type_archive_meta()
, usetsf()->data()->plugin()->pta()->get_meta()
instead.get_post_type_archive_meta_item()
, usetsf()->data()->plugin()->pta()->get_meta_item()
instead.get_all_post_type_archive_meta_defaults()
, usetsf()->data()->plugin()->pta()->get_all_default_meta()
instead.get_post_type_archive_meta_defaults()
, usetsf()->data()->plugin()->pta()->get_default_meta()
instead.get_sitemap_colors()
, usetsf()->sitemap()->utils()->get_sitemap_colors()
instead.is_blog_public()
, usetsf()->data()->blog()->is_public()
instead.current_blog_is_spam_or_deleted()
, usetsf()->data()->blog()->is_spam_or_deleted()
instead.is_subdirectory_installation()
, usetsf()->data()->blog()->is_subdirectory_installation()
instead.use_core_sitemaps()
, usetsf()->sitemap()->utils()->use_core_sitemaps()
instead.can_run_sitemap()
, usetsf()->sitemap()->utils()->may_output_optimized_sitemap()
instead.has_robots_txt()
, usetsf()->robotstxt()->utils()->has_root_robots_txt()
instead.get_robots_txt_url()
, usetsf()->robotstxt()->utils()->get_robots_txt_url()
instead.has_sitemap_xml()
, usetsf()->sitemap()->utils()->has_root_sitemap_xml()
instead.robots_txt()
, usetsf()->robotstxt()->get_robots_txt()
instead.delete_excluded_ids_cache()
, usetsf()->query()->exclusion()->clear_excluded_post_ids_cache()
instead.get_excluded_ids_from_cache()
, usetsf()->query()->exclusion()->get_excluded_ids_from_cache()
instead.clean_response_header()
, with no alternative available.init_admin_scripts()
, usetsf()->load_admin_scripts()
instead.get_generated_seo_bar()
, with no alternative available.do_redirect()
, usewp_safe_redirect()
instead.allow_external_redirect()
, with no alternative available.get_document_title()
, with no alternative available.get_wp_title()
, with no alternative available.get_seo_settings_page_url()
, with no alternative available.convert_markdown()
, usetsf()->format()->markdown()->convert()
instead.gmt2date()
, use functiongmdate()
instead.get_timestamp_format()
, usetsf()->format()->time()->get_preferred_format()
instead.uses_time_in_timestamp_format()
, with no alternative available.hellip_if_over()
, usetsf()->format()->strings()->hellip_if_over()
instead.get_word_count()
, usetsf()->format()->strings()->get_word_count()
instead.get_input_guidelines()
, usetsf()->guidelines()->get_text_size_guidelines()
instead.get_input_guidelines_i18n()
, usetsf()->guidelines()->get_text_size_guidelines_i18n()
instead.output_js_title_data()
, with no alternative available.output_js_social_data()
, with no alternative available.output_js_description_data()
, with no alternative available.add_menu_link()
, usetsf()->admin()->menu()->register_top_menu_page()
instead.get_admin_issue_count()
, usetsf()->admin()->menu()->get_top_menu_issue_count()
instead.get_admin_menu_issue_badge()
, usetsf()->admin()->menu()->get_issue_badge()
instead.admin_redirect()
, usetsf()->admin()->utils()->redirect()
instead.register_dismissible_persistent_notice()
, usetsf()->admin()->notice()->persistent()->register_notice()
instead.count_down_persistent_notice()
, usetsf()->admin()->notice()->persistent()->count_down_notice()
instead.clear_persistent_notice()
, usetsf()->admin()->notice()->persistent()->clear_notice()
instead.clear_all_persistent_notices()
, usetsf()->admin()->notice()->persistent()->clear_all_notices()
instead.generate_dismissible_notice()
, usetsf()->admin()->notice()->generate_notice()
instead.do_dismissible_notice()
, usetsf()->admin()->notice()->output_notice()
instead.register_settings()
, with no alternative available.update_db_version()
, with no alternative available.init_sanitizer_filters()
, with no alternative available.add_option_filter()
, use filterthe_seo_framework_settings_update_sanitizers
instead.get_relative_fontcolor()
, usetsf()->format()->color()->get_relative_fontcolor()
instead.active_plugins()
, usetsf()->data()->blog()->get_active_plugins()
instead.conflicting_plugins()
, with no alternative available.get_conflicting_plugins()
, with no alternative available.detect_seo_plugins()
, with no alternative available.detect_og_plugin()
, with no alternative available.detect_twitter_card_plugin()
, with no alternative available.has_json_ld_plugin()
, with no alternative available.detect_sitemap_plugin()
, with no alternative available.s_email_address()
, usesanitize_email()
instead.s_safe_html()
, usewp_kses_post()
instead.s_no_html()
, usestrip_tags()
instead.s_no_html_space()
, with no alternative available.s_url_query()
, usesanitize_url()
instead.s_url()
, with no alternative available.clean_canonical_url()
, useesc_url()
instead.s_field_id()
, usetsf()->escape()->option_name_attribute()
instead.s_description()
, with no alternative available.escape_description()
, useesc_html()
instead.s_title()
, with no alternative available.escape_title()
, useesc_html()
instead.esc_attr_preserve_amp()
, useesc_attr()
instead.strip_newline_urls()
, usetsf()->format()->html()->strip_newline_urls()
instead.strip_paragraph_urls()
, usetsf()->format()->html()->strip_paragraph_urls()
instead.strip_tags_cs()
, usetsf()->format()->html()->strip_tags_cs()
instead.s_excerpt()
, usetsf()->format()->html()->extract_content()
instead.s_excerpt_raw()
, usetsf()->format()->html()->extract_content()
instead.s_description_raw()
, usetsf()->sanitize()->metadata_content()
instead.s_singleline()
, usetsf()->sanitize()->newline_to_space()
instead.s_dupe_space()
, usetsf()->sanitize()->remove_repeated_spacing()
instead.s_tabs()
, usetsf()->sanitize()->tab_to_space()
instead.s_qubit()
, usetsf()->sanitize()->qubit()
instead.s_one_zero()
, usetsf()->sanitize()->boolean_integer()
instead.s_numeric_string()
, usetsf()->sanitize()->numeric_string()
instead.s_absint()
, useabsint()
instead.s_color_hex()
, usetsf()->sanitize()->rgb_hex()
instead.s_hyphen()
, usetsf()->sanitize()->lone_hyphen_to_entity()
instead.s_nbsp()
, usetsf()->sanitize()->nbsp_to_space()
instead.s_bsol()
, usetsf()->sanitize()->backward_solidus_to_entity()
instead.s_bsol_raw()
, usetsf()->sanitize()->backward_solidus_to_entity()
instead.s_title_raw()
, usetsf()->sanitize()->metadata_content()
instead.s_image_details()
, usetsf()->sanitize()->image_details()
instead.s_twitter_name()
, usetsf()->sanitize()->twitter_profile_handle()
instead.s_facebook_profile()
, usetsf()->sanitize()->facebook_profile_link()
instead.s_image_details_deep()
, usetsf()->sanitize()->image_details()
instead.s_redirect_url()
, usetsf()->sanitize()->redirect_url()
instead.s_url_relative_to_current_scheme()
, usetsf()->uri()->utils()->make_absolute_current_scheme_url()
instead.s_relative_url()
, usetsf()->uri()->utils()->get_relative_part_from_url()
instead.s_term_meta()
, with no alternative available.s_post_meta()
, with no alternative available.s_user_meta()
, with no alternative available.s_all_post_type_archive_meta()
, with no alternative available.s_post_type_archive_meta()
, with no alternative available.s_canonical_scheme()
, with no alternative available.s_min_max_sitemap()
, with no alternative available.s_twitter_card()
, with no alternative available.s_image_preview()
, with no alternative available.s_snippet_length()
, with no alternative available.s_title_separator()
, with no alternative available.s_knowledge_type()
, with no alternative available.s_disabled_post_types()
, with no alternative available.s_post_types()
, with no alternative available.s_disabled_taxonomies()
, with no alternative available.s_taxonomies()
, with no alternative available.s_left_right()
, with no alternative available.s_left_right_home()
, with no alternative available.s_alter_query_type()
, with no alternative available.s_description_html_method()
, with no alternative available.has_posts_in_post_type_archive()
, usetsf()->data()->post()->has_posts_in_pta()
instead.has_unprocessed_syntax()
, with no alternative available.has_yoast_syntax()
, with no alternative available.has_rankmath_syntax()
, with no alternative available.has_seopress_syntax()
, with no alternative available.detect_plugin()
, with no alternative available.can_i_use()
, with no alternative available.detect_plugin_multi()
, with no alternative available.is_theme()
, with no alternative available.detect_non_html_page_builder()
, with no alternative available.is_gutenberg_page()
, usetsf()->query()->is_block_editor()
instead.
- Methods removed:
is_auto_description_enabled()
, without deprecation (it was marked private)._adjust_post_link_category()
, without deprecation (it was marked private).render_element()
, without deprecation (it was marked protected).array_flatten_list()
, without deprecation (it was marked protected).init_debug_vars()
, was never meant to be public.get_image_generation_params()
, has nothing to offer for the public API.set_plugin_check_caches()
, without deprecation (we now handle it without a cached check).facebook_app_id()
, without deprecation (feature is gone).- Since we rebuilt the class initialization, these methods are no longer available:
autodescription_run()
init_the_seo_framework()
init_global_actions()
init_global_filters()
init_admin_actions()
init_alter_search_query()
init_alter_archive_query()
- Since we rebuilt
The_SEO_Framework\Generate_Ldjson
and reworked the settings, these are removed:build_json_data
receive_json_data
render_ld_json_scripts
get_ld_json_website
get_ld_json_links
get_knowledge_logo
get_ld_json_breadcrumbs
get_ld_json_breadcrumbs_page
get_ld_json_breadcrumbs_post
get_ld_json_breadcrumb_home_crumb
get_ld_json_breadcrumb_current
get_schema_url_id
ld_json_breadcrumbs_use_seo_title
enable_ld_json_breadcrumbs
enable_ld_json_searchbox
enable_ld_json_knowledge
ld_json
- Since we moved class
The_SEO_Framework\Cache
‘s functionality from this object, these are removed:init_admin_caching_actions()
init_post_cache_actions()
delete_main_cache()
delete_post_cache()
delete_excluded_ids_cache()
- This has been moved to
tsf()->query()->exclusion()->clear_excluded_post_ids_cache()
.
- This has been moved to
delete_excluded_post_ids_transient()
delete_cache()
get_exclusion_transient_name()
get_sitemap_transient_name()
- This has been moved to
tsf()->sitemap()->cache()->get_sitemap_cache_key()
.
- This has been moved to
generate_cache_key()
generate_cache_key_by_type()
add_cache_key_suffix()
- This has been moved to
tsf()->sitemap()->cache()->build_sitemap_cache_key()
.
- This has been moved to
delete_sitemap_transient_permalink_updated
delete_sitemap_transient()
- This has been moved to
tsf()->sitemap()->cache()->clear_sitemap_caches()
.
- This has been moved to
- Since we rebuilt
The_SEO_Framework\Sanitize
and reworked the settings, these are removed:sanitize()
add_option_filter()
- Deprecated in TSF v4.2.0, the following deprecated methods of the
The_SEO_Framework\Load
object (tsf()
) are no longer available:append_php_query()
get_legacy_header_filters_output()
get_legacy_header_filters_output()
get_html_output()
is_robots_meta_noindex_set_by_args()
robots_meta()
can_do_sitemap_robots()
nav_tab_wrapper()
inpost_flex_nav_tab_wrapper()
get_social_image_uploader_form()
get_logo_uploader_form()
proportionate_dimensions()
seo_settings_page_url()
get_default_user_data()
get_user_option()
get_author_option()
get_current_author_option()
is_wc_shop()
is_wc_product()
is_wc_product_admin()
update_user_option()
get_field_name()
field_name()
get_field_id()
field_id()
code_wrap()
code_wrap_noesc()
description()
description_noesc()
attention()
attention_noesc()
attention_description()
attention_description_noesc()
wrap_fields()
make_info()
make_data_attributes()
make_checkbox()
make_single_select_form()
is_default_checked()
is_warning_checked()
get_is_conditional_checked()
is_conditional_checked()
output_character_counter_wrap()
output_pixel_counter_wrap()
wp_version()
detect_theme_support()
detect_page_builder()
uses_page_builder()
fb_locales()
language_keys()
get_timezone_string()
set_timezone()
reset_timezone()
get_current_term_meta()
is_blog_page()
is_blog_page_by_id()
is_front_page_by_id()
prepend_tax_label_prefix()
check_the_real_id()
get_default_settings()
get_warned_settings()
get_safe_schema_image()
- Properties deprecated:
inpost_nonce_field
, you should make a custom check.inpost_nonce_name
, you should make a custom check.is_headless
, use functionThe_SEO_Framework\is_headless()
instead.loaded
, this check is no longer necessary.pretty_permalinks
, usetsf()->query()->utils()->using_pretty_permalinks()
instead.script_debug
, use constantSCRIPT_DEBUG
instead.seo_settings_page_slug
, use constantTHE_SEO_FRAMEWORK_SITE_OPTIONS_SLUG
orThe_SEO_Framework\Admin::get_top_menu_args()
instead.seo_settings_page_hook
, usetsf()->admin()->menu()->get_page_hook_name()
instead.the_seo_framework_debug
, use constantTHE_SEO_FRAMEWORK_DEBUG
instead.the_seo_framework_use_transients
, with no alternative available.
- Properties removed:
- Deprecated in TSF v4.2.0,
load_options
is no longer available.
- Deprecated in TSF v4.2.0,
- Class
- New objects:
- Constant notes:
- Added:
THE_SEO_FRAMEWORK_SITE_OPTIONS_SLUG
is now available.
- Changed:
THE_SEO_FRAMEWORK_DEBUG
is now always available atplugins_loaded
.
- Removed:
THE_SEO_FRAMEWORK_DISABLE_TRANSIENTS
, for it is no longer used.
- Added:
- Filter notes:
- Note:
- Almost all internal hook callbacks in this plugin have a new name. If you removed a filter in TSF, it may now reappear. Please check your hooks.
- Added:
the_seo_framework_auto_description_html_method_methods
, this used to bethe_seo_framework_auto_descripton_html_method_methods
(typo).the_seo_framework_sitemap_endpoint_list
now acceptscache_id
for every entry.the_seo_framework_conflicting_plugins
now supports index'multilingual'
.the_seo_framework_meta_generator_pools
, this is used to remove meta generator callback pools preemptively.the_seo_framework_meta_generators
, this is used to add and remove meta generator callbacks.the_seo_framework_meta_render_data
, this is used to add, remove, and tweak generated metadata before it’s sent to the browser.the_seo_framework_custom_image_details
, this is used to change image details from custom field.the_seo_framework_generated_image_details
, this is used to change generated image details.the_seo_framework_schema_entity_builders
, this is used to add and remove Schema.org builders.the_seo_framework_schema_graph_data
, this is used to adjust the Schema.org output data.the_seo_framework_breadcrumb_list
, this is used to adjust the Breadcrumbs generation.the_seo_framework_primary_term
, this is used to adjust the primary term.the_seo_framework_description_excerpt
, this is used to adjust the description excerpt.the_seo_framework_register_scripts
, this is used to engage the script loader on a custom TSF page.- This must be filtered before
admin_enqueue_scripts
(e.g., atload-{$plugin_page}
). If that’s not possible, usetsf()->load_admin_scripts()
instead to enforce loading.
- This must be filtered before
the_seo_framework_settings_update_sanitizers
, this allows you to change sanitization callbacks on option-update.the_seo_framework_supported_twitter_card_types
, this allows you to remove or register new card types that are usable throughout the plugin.the_seo_framework_breadcrumb_shortcode_css
, this is used to filter the shortcode’s CSS.the_seo_framework_breadcrumb_shortcode_output
, this is used to filter the shortcode’s output.the_seo_framework_generated_archive_title_items
, this is used to filer the archive title and its prefix simultaneously.
- Changed:
the_seo_framework_taxonomy_disabled
, the second parameter is now nullable (instead of an empty string).the_seo_framework_save_post_meta
- The second parameter is now an integer, instead of Post object.
- If you cannot save posts any longer after updating… well, there’s your problem. We found no evidence of this being used in the wild.
- No longer sends pre-sanitized data to the filter.
- The second parameter is now an integer, instead of Post object.
the_seo_framework_generated_description
, added third parameter$type
.the_seo_framework_allow_excerpt_shortcode_tags
, added second parameter$args
.the_seo_framework_save_term_data
- Removed 3rd and 4th parameters (
$tt_id
and$taxonomy
). - No longer sends pre-sanitized data to the filter.
- Removed 3rd and 4th parameters (
the_seo_framework_save_user_data
, no longer sends pre-sanitized data to the filter.
- Fixed:
- Unsetting tabs via
the_seo_framework_inpost_settings_tabs
will no longer cause JavaScript errors.
- Unsetting tabs via
- Deprecated:
the_seo_framework_googlesite_output
, with no alternative available.the_seo_framework_bingsite_output
, with no alternative available.the_seo_framework_yandexsite_output
, with no alternative available.the_seo_framework_baidusite_output
, with no alternative available.the_seo_framework_pintsite_output
, with no alternative available.the_seo_framework_ldjson_scripts
, with no alternative available.the_seo_framework_description_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_rel_canonical_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_shortlink_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_paged_url_output_next
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_paged_url_output_prev
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_ogtitle_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_ogdescription_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_oglocale_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_ogsitename_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_ogurl_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_facebookauthor_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_facebookpublisher_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_publishedtime_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_twittersite_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_twittercreator_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_twittertitle_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_twitterdescription_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_modifiedtime_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_ogtype_output
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_use_og_tags
, usethe_seo_framework_meta_generator_pools
instead.the_seo_framework_use_facebook_tags
, usethe_seo_framework_meta_generator_pools
instead.the_seo_framework_use_twitter_tags
, usethe_seo_framework_meta_generator_pools
instead.the_seo_framework_robots_meta
, usethe_seo_framework_meta_render_data
instead.the_seo_framework_image_details
, usethe_seo_framework_custom_image_details
orthe_seo_framework_generated_image_details
instead.the_seo_framework_fetched_description_excerpt
, usethe_seo_framework_description_excerpt
instead.the_seo_framework_manipulate_title
, usethe_seo_framework_overwrite_titles
instead.the_seo_framework_conflicting_plugins_type
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_twittercard_output
, with no alternative available.the_seo_framework_generated_archive_title
, usethe_seo_framework_generated_archive_title_items
instead.
- Removed:
- Deprecated in TSF v4.2.0, two years later, we’ve now removed these filters:
the_seo_framework_pta_title
the_seo_framework_the_archive_title
the_seo_framework_generated_archive_title_prefix
the_seo_framework_load_options
the_seo_framework_pta_description
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_before_output
, use actionthe_seo_framework_before_meta_output
instead.the_seo_framework_after_output
, use actionthe_seo_framework_after_meta_output
instead.the_seo_framework_settings_capability
, assign constantTHE_SEO_FRAMEWORK_SETTINGS_CAP
instead.
- Because we’ve refactored the plugin detection system, the following filters weren’t compatible and thus removed:
the_seo_framework_seo_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_og_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_twittercard_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_ldjson_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_sitemap_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.the_seo_framework_multilingual_plugin_detected
, usethe_seo_framework_conflicting_plugins
instead.
- Because we’ve rewritten the Structured Data API from the ground up, these were incompatible and thus removed:
the_seo_framework_receive_json_data
, usethe_seo_framework_schema_graph_data
instead.the_seo_framework_use_breadcrumb_seo_title
, use title settings instead.- We may in the future add options to adjust the breadcrumb titles on a per-page/term basis.
the_seo_framework_knowledge_logo
, usethe_seo_framework_image_generation_params
instead.the_seo_framework_ld_json_breadcrumb_taxonomies
, usethe_seo_framework_breadcrumb_list
instead.the_seo_framework_ld_json_breadcrumb_terms
, usethe_seo_framework_breadcrumb_list
instead.the_seo_framework_json_breadcrumb_output
, usethe_seo_framework_breadcrumb_list
instead.the_seo_framework_json_search_output
, usethe_seo_framework_schema_graph_data
instead.the_seo_framework_json_knowledge_output
, usethe_seo_framework_schema_graph_data
instead.
the_seo_framework_auto_descripton_html_method_methods
- It is now
the_seo_framework_auto_description_html_method_methods
(typo in “description”). - We found no indication this was used in public yet, so we didn’t go through a deprecation process. Sorry in advance if this change affects your site.
- It is now
the_seo_framework_delete_cache_args
, there’s no functionality left that could use this.the_seo_framework_facebookappid_output
, we removedapp:id
support.the_seo_framework_delete_cache_{$type}
:- This includes
the_seo_framework_delete_cache_excluded_post_ids
, which is gone. - This also includes
the_seo_framework_delete_cache_sitemap
, which is now marked as deprecated.
- This includes
the_seo_framework_warn_homepage_global_title
, we now use multilingual plugin detection viathe_seo_framework_conflicting_plugins
.the_seo_framework_warn_homepage_global_description
, we now use multilingual plugin detection viathe_seo_framework_conflicting_plugins
.the_seo_framework_tell_multilingual_sitemap
, we now use multilingual plugin detection viathe_seo_framework_conflicting_plugins
.the_seo_framework_site_options
, use WP options API instead to alter option name'autodescription-site-settings'
.the_seo_framework_term_options
, use WP options API instead to alter term metadata name'autodescription-term-settings'
.the_seo_framework_user_options
, use WP options API instead to alter user metadata name'autodescription-user-settings'
.the_seo_framework_site_cache
, use WP options API instead to alter option name'autodescription-site-cache'
.the_seo_framework_available_twitter_cards
, we couldn’t make it work in the new API.the_seo_framework_wp_title
, this was for WP 4.4 titles. Usethe_seo_framework_pre_get_document_title
instead.the_seo_framework_available_sanitizer_filters
, we changed how we update settings, so the older filters are no longer compatible. Use'sanitize_option_' . THE_SEO_FRAMEWORK_SITE_OPTIONS
instead.the_seo_framework_301_noqueries
, we changed how we update settings, and this filter was no longer compatible. Use applicable option filters instead, like'sanitize_option_' . THE_SEO_FRAMEWORK_SITE_OPTIONS
,'sanitize_post_meta_redirect'
, and'sanitize_term_meta_' . THE_SEO_FRAMEWORK_TERM_OPTIONS
.
- Deprecated in TSF v4.2.0, two years later, we’ve now removed these filters:
- Note:
- Action notes:
- Added:
the_seo_framework_cleared_sitemap_transients
, used when sitemap transients are (probably) cleared.
- Changed:
the_seo_framework_seo_bar
, added the builder’s instance as the third parameter.the_seo_framework_tab_content
, now uses'args'
instead of'params'
for its first parameter’s indexes.- I didn’t deprecate this because I don’t think anyone uses it.
- Deprecated:
the_seo_framework_delete_cache_sitemap
, usethe_seo_framework_cleared_sitemap_transients
instead.
- Added:
- Hook notes:
- Excluded IDs cache is now cleared on
wp_insert_post
andattachment_updated
, fromsave_post
andedit_attachment
respectively. - These are among the most prominent changes of over 35 others:
[ \tsf(), 'html_output' ]
no longer runs onwp_head
. Instead,[ 'The_SEO_Framework\Front\Meta\Head', 'print_wrap_and_tags' ]
is now outputted – remaining at priority1
._init_tsf
no longer runs onplugins_loaded
, but oninit
. Use filterthe_seo_framework_load
instead.
- Excluded IDs cache is now cleared on
- JavaScript notes:
- HTML element with ID
tsf-description-reference
is no longer available. Usetsf-description-reference_{$type}
instead.$type
can be:autodescription_description
,autodescription-meta[description]
,autodescription-quick[description]
,autodescription-site-settings[homepage_description]
, ortsf-description-reference_autodescription-site-settings[pta][%s][description]
(where%s
is the post type).
- HTML element with ID
tsf-title-reference
is no longer available. Usetsf-title-reference_{$type}
instead.- See above for
$type
hints, wheredescription
is replaced withtitle
in every instance.
- See above for
- HTML element with ID
- CSS notes:
tsf-pt
no longer has inline RTL support, but instead supports RLT built in its file.
- Other:
- Cleaned up code. Reduced function call overhead.
- Removed capitalization in PHP methods; mainly,
_ID
. Since PHP methods are case-insensitive at runtime, this should not matter nearly any case. - Fixed typos in code. Props Viktor Szépe.
- Refreshed
composer.json
. Props Viktor Szépe. - Improved needless defense clauses. Props Viktor Szépe.
- We now try to avoid the word “home” in our code due to its ambiguity in relation to the front page and the blog page. So, we use “front” for front-page related queries, titles, etc., and “blog” otherwise.
- We no longer use
$escape
parameters in our code. You must escape as late as possible and not trust us blindly. - HTML element class
.tsf-breadcrumb
is now used on the front-end.