The SEO Framework

★︎ My account
  • Extensions
  • Documentation
  • Pricing
  1. Home
  2. Plugin Changelog
  3. 5.0.0 - Apex

5.0.0 – Apex

November 22, 2023 by Sybre Waaijer
Updated November 26, 2023

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() or tsf() 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 CSS content, 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 to tsf-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.
    • 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.
      • Schema.org/WebPage is now added to every page but excluded or exploited query pages.
        • This type is changed from WebPage to CollectionPage on archives. It’s changed to both CollectionPage and SearchResultsPage 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.
      • Schema.org/BreadcrumbList has been rewritten and is now supported on all types of pages, not just singular posts.
    • 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.
    • 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 constant THE_SEO_FRAMEWORK_AUTHOR_INFO_CAP.
      • When switching blogs on multisite, all data memoization now flushes.
    • 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.
    • 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).
  • 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.
    • 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.
    • Meta tags:
      • The theme_color metatag now also outputs on requests where Advanced Query Protection engages.
      • article:modified_time and article: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.
    • Sitemaps:
      • TSF no longer pings search engines the base sitemap location when updating the options without changing the options.
  • 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.
    • 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.
    • 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.
  • 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 the l'-part of l'apostrophe will also be included in the description when it’s at the start, and the apostrophe 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 match content, 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 match content, not test=">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()
    • 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.
    • 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.
  • 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).
    • Open Graph tag og:updated_time is no longer outputted; it is inferred from article: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).

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 trait Static_Deprecator. Since the method is brand new, nothing has been deprecated yet.
    • Pool tsf()->query() is now available.
      • All public query-related methods have been moved to that pool. E.g., tsf()->is_product() is now tsf()->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.
      • This pool has a sub-pool, accessible via tsf()->query()->exclusion().
        • Internally known as The_SEO_Framework\Helper\Query\Exclusion.
      • This pool has a sub-pool, accessible via tsf()->query()->utils().
        • Internally known as The_SEO_Framework\Helper\Query\Utils.
    • 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 now tsf()->post_type()->is_supported().
      • Internally known as The_SEO_Framework\Helper\Post_Type.
    • Pool tsf()->taxonomy() is now available.
      • All public taxonomy methods have been moved to that pool. E.g., tsf()->is_taxonomy_supported() is now tsf()->taxonomy()->is_supported().
      • Internally known as The_SEO_Framework\Helper\Taxonomy.
    • Pool tsf()->robots() is now available.
      • All public taxonomy methods have been moved to that pool. E.g., tsf()->get_robots_meta() is now tsf()->robots()->get_meta().
      • Internally known as The_SEO_Framework\Meta\Robots.
    • 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 now tsf()->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.
    • Pool tsf()->title() is now available.
      • All public title-related methods have been moved to that pool. E.g., tsf()->get_custom_title() is now tsf()->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.
      • This pool has a sub-pool, accessible via tsf()->title()->conditions().
        • Internally known as The_SEO_Framework\Meta\Title\Conditions.
    • Pool tsf()->description() is now available.
      • All public description-related methods have been moved to that pool. E.g., tsf()->description() is now tsf()->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.
    • 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 now tsf()->open_graph()->get_description().
      • Internally known as The_SEO_Framework\Meta\Open_Graph.
    • 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.
    • Pool tsf()->guidelines() is now available.
      • Internally known as The_SEO_Framework\Helper\Guidelines.
    • Pool tsf()->headers() is now available.
      • Internally known as The_SEO_Framework\Helper\Headers.
    • Pool tsf()->twitter() is now available.
      • All public Twitter-related methods have been moved to that pool. E.g., tsf()->get_twitter_title() is now tsf()->twitter()->get_description().
      • Internally known as The_SEO_Framework\Meta\Twitter.
    • 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 now tsf()->image()->get_custom_image_details().
      • Internally known as The_SEO_Framework\Meta\Image.
    • 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.
    • Pool tsf()->breadcrumbs() is now available.
      • Internally known as The_SEO_Framework\Meta\Breadcrumbs.
    • 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.
    • 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.
      • This pool has a sub-pool, accessible via tsf()->sitemap()->ping().
        • Internally known as The_SEO_Framework\Sitemap\Ping.
      • This pool has a sub-pool, accessible via tsf()->sitemap()->lock().
        • Internally known as The_SEO_Framework\Sitemap\Lock.
      • This pool has a sub-pool, accessible via tsf()->sitemap()->registry().
        • Internally known as The_SEO_Framework\Sitemap\Registry.
      • This pool has a sub-pool, accessible via tsf()->sitemap()->utils().
        • Internally known as The_SEO_Framework\Sitemap\Utils.
    • 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.
      • This pool has a sub-pool, accessible via tsf()->format()->time().
        • Internally known as The_SEO_Framework\Helper\Format\Time.
      • This pool has a sub-pool, accessible via tsf()->format()->arrays().
        • Internally known as The_SEO_Framework\Helper\Format\Arrays.
      • This pool has a sub-pool, accessible via tsf()->format()->strings().
        • Internally known as The_SEO_Framework\Helper\Format\Strings.
      • This pool has a sub-pool, accessible via tsf()->format()->color().
        • Internally known as The_SEO_Framework\Helper\Format\Color.
      • This pool has a sub-pool, accessible via tsf()->format()->html().
        • Internally known as The_SEO_Framework\Helper\Format\HTML.
    • 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.
      • 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.
      • 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.
        • This pool has a sub-pool, accessible via tsf()->admin()->layout()->form().
          • Internally known as The_SEO_Framework\Admin\Settings\Layout\Form.
    • 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 now tsf()->data()->blog()->get_public_blog_name().
        • Internally known as The_SEO_Framework\Data\Blog.
      • 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 now tsf()->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(), and tsf()->update_option().
        • 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 now tsf()->data()->plugin()->helper()->get_robots_post_type_option_id().
          • Internally known as The_SEO_Framework\Data\Plugin\Helper.
        • 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 now tsf()->data()->plugin()->post()->get_meta_item().
          • Internally known as The_SEO_Framework\Data\Plugin\Post.
        • 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 now tsf()->data()->plugin()->pta()->get_meta_item().
          • Internally known as The_SEO_Framework\Data\Plugin\PTA.
        • 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 now tsf()->data()->plugin()->setup()->get_default_options().
          • Internally known as The_SEO_Framework\Data\Plugin\Setup.
        • 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 now tsf()->data()->plugin()->term()->get_meta_item().
          • Internally known as The_SEO_Framework\Data\Plugin\Term.
        • 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 now tsf()->data()->plugin()->user()->get_meta_item().
          • Internally known as The_SEO_Framework\Data\Plugin\User.
      • 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 now tsf()->data()->post()->get_content().
        • Internally known as The_SEO_Framework\Data\Post.
  • Improved:
    • Method tsf()->__set() now protects against fatal errors on PHP 8.2 or later.
    • Usage of stopwatch microtime() has been exchanged for hrtime(), 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.
  • Changed:
    • When tsf() or the_seo_framework() are called too early (before plugins_loaded), they’ll return a silencer class.
    • Title overwriting is now engaged at template_redirect, instead of at plugins_loaded. This also tests for query support, so filtering the_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.
    • 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.
    • 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.
  • 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 (constant THE_SEO_FRAMEWORK_SITE_OPTIONS):
      • Added:
        • Index auto_description_html_method, this used to be auto_descripton_html_method (typo).
        • Index ld_json_enabled, this is used to toggle all Schema.org option generation.
      • 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.
      • 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.
        • 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.
    • For option index autodescription-updates-cache (constant THE_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.
  • Meta notes:
    • For term index autodescription-term-settings (constant THE_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.
    • 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.
    • All meta generation methods are now assumed to return (pre-)sanitized data. You must still escape the data when printing to screen.
  • Transient notes:
    • Added:
      • Transient tsf_sitemap_{$sitemap_id}_{$revision}_{$blog_id}_{$locale} may now be stored for sitemaps.
    • 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.
  • Function notes:
    • Added:
      • tsf_breadcrumb() is now available. This outputs the breadcrumb for the current page. This is the callback function for shortcode &#91;tsf_breadcrumb&#93;.
        • Its attributes (first argument) are filterable via shortcode_atts_tsf_breadcrumb.
      • 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() and the_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.
  • 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. Use The_SEO_Framework\Admin\Script\Loader instead.
      • Class The_SEO_Framework\Builders\Scripts is now deprecated. Use The_SEO_Framework\Admin\Script\Registry instead.
      • Class The_SEO_Framework\Interpreters\SEOBar is now deprecated. Use The_SEO_Framework\Admin\SEOBar\Builder instead.
      • Class The_SEO_Framework\Builders\Sitemap\Main is now deprecated. Use The_SEO_Framework\Sitemap\Optimized\Main instead.
        • However, nothing useful is left to access directly in this 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.
    • 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 via tsf() and the_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 function tsf() 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.
          • 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()
            1. Removed $use_cache; the cache is now dynamically updated.
            2. Now returns null if the option doesn’t exist.
          • update_option(), ennobled to be part of the legacy API.
          • get_title()
            1. Removed the second parameter, the output is always sanitized now.
            2. Removed the third parameter; use get_open_graph_title() or get_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()
            1. No longer calls the query in the sitemap to remove pagination.
            2. Removed support for argument index get_custom_field without deprecation notice (you should’ve used create_canonical_url() instead).
          • get_image_details(), removed the last $clean parameter. It always returns a cleaned image now.
        • 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(), use tsf()->query()->get_post_type_real_id() instead.
          • get_admin_post_type(), use tsf()->query()->get_admin_post_type() instead.
          • get_post_types_from_taxonomy(), use tsf()->taxonomy()->get_post_types() instead.
          • get_the_real_id(), use tsf()->query()->get_the_real_id() instead.
          • get_the_real_admin_id(), use tsf()->query()->get_the_real_admin_id() instead.
          • get_the_front_page_id(), use tsf()->query()->get_front_page_id() instead.
          • get_admin_term_id(), use tsf()->query()->get_admin_term_id() instead.
          • get_current_taxonomy(), use tsf()->query()->get_current_taxonomy() instead.
          • get_current_post_type(), use tsf()->query()->get_current_post_type() instead.
          • is_attachment(), use tsf()->query()->is_attachment() instead.
          • is_attachment_admin(), use tsf()->query()->is_attachment_admin() instead.
          • is_singular_archive(), use tsf()->query()->is_singular_archive() instead.
          • is_archive(), use tsf()->query()->is_archive() instead.
          • is_archive_admin(), use tsf()->query()->is_archive_admin() instead.
          • is_term_edit(), use tsf()->query()->is_term_edit() instead.
          • is_post_edit(), use tsf()->query()->is_post_edit() instead.
          • is_wp_lists_edit(), use tsf()->query()->is_wp_lists_edit() instead.
          • is_profile_edit(), use tsf()->query()->is_profile_edit() instead.
          • is_author(), use tsf()->query()->is_author() instead.
          • is_home(), use tsf()->query()->is_blog() instead.
          • is_home_as_page(), use tsf()->query()->is_blog_as_page() instead.
          • is_category(), use tsf()->query()->is_category() instead.
          • is_category_admin(), use tsf()->query()->is_category_admin() instead.
          • is_real_front_page(), use tsf()->query()->is_real_front_page() instead.
          • is_real_front_page_by_id(), use tsf()->query()->is_real_front_page_by_id() instead.
          • is_page(), use tsf()->query()->is_page() instead.
          • is_page_admin(), use tsf()->query()->is_page_admin() instead.
          • is_preview(), use tsf()->query()->is_preview() instead.
          • is_search(), use tsf()->query()->is_search() instead.
          • is_single(), use tsf()->query()->is_single() instead.
          • is_single_admin(), use tsf()->query()->is_single_admin() instead.
          • is_singular(), use tsf()->query()->is_singular() instead.
          • is_singular_admin(), use tsf()->query()->is_singular_admin() instead.
          • is_static_frontpage(), use tsf()->query()->is_static_front_page() instead.
          • is_tag(), use tsf()->query()->is_tag() instead.
          • is_tag_admin(), use tsf()->query()->is_tag_admin() instead.
          • is_tax(), use tsf()->query()->is_tax() instead.
          • is_shop(), use tsf()->query()->is_shop() instead.
          • is_product(), use tsf()->query()->is_product() instead.
          • is_product_admin(), use tsf()->query()->is_product_admin() instead.
          • is_year(), use tsf()->query()->is_year() instead.
          • is_ssl(), use tsf()->query()->is_ssl() instead.
          • is_seo_settings_page(), use tsf()->query()->is_seo_settings_page() instead.
          • is_menu_page(), use tsf()->query()->is_menu_page() instead.
          • page(), use tsf()->query()->page() instead.
          • paged(), use tsf()->query()->paged() instead.
          • numpages(), use tsf()->query()->numpages() instead.
          • is_multipage(), use tsf()->query()->is_multipage() instead.
          • is_sitemap(), use tsf()->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(), use tsf()->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(), use tsf()->format()->arrays()->array_merge_recursive_distinct() instead.
          • retrieve_robots_meta_assertions(), use tsf()->robots()->get_collected_meta_assertions() instead.
          • get_robots_meta(), use tsf()->robots()->get_meta() instead.
          • generate_robots_meta(), use tsf()->robots()->get_generated_meta() instead.
          • is_post_type_robots_set(), use tsf()->robots()->is_post_type_robots_set() instead.
          • is_taxonomy_robots_set(), use tsf()->robots()->is_taxonomy_robots_set() instead.
          • query_supports_seo(), use tsf()->query()->utils()->query_supports_seo() instead.
          • is_query_exploited(), use tsf()->query()->utils()->is_query_exploited() instead.
          • has_page_on_front(), use tsf()->query()->utils()->has_page_on_front() instead.
          • is_post_type_supported(), use tsf()->post_type()->is_supported() instead.
          • is_post_type_archive_supported(), use tsf()->post_type()->is_pta_supported() instead.
          • post_type_supports_taxonomies(), use tsf()->post_type()->supports_taxonomies() instead.
          • get_supported_post_type_archives(), use tsf()->post_type()->get_all_supported_pta() instead.
          • get_public_post_type_archives(), use tsf()->post_type()->get_public_pta() instead.
          • get_supported_post_types(), use tsf()->post_type()->get_all_supported() instead.
          • is_post_type_disabled(), use tsf()->post_type()->is_disabled() instead.
          • is_taxonomy_supported(), use tsf()->taxonomy()->is_supported() instead.
          • get_supported_taxonomies(), use tsf()->taxonomy()->get_all_supported() instead.
          • is_taxonomy_disabled(), use tsf()->taxonomy()->is_disabled() instead.
          • is_term_meta_capable(), use tsf()->query()->is_editable_term() instead.
          • get_hierarchical_post_types(), use tsf()->post_type()->get_all_hierarchical() instead.
          • get_nonhierarchical_post_types(), use tsf()->post_type()->get_all_nonhierarchical() instead.
          • get_hierarchical_taxonomies_as(), use tsf()->taxonomy()->get_hierarchical() instead.
          • get_post_type_label(), use tsf()->post_type()->get_label() instead.
          • get_tax_type_label(), use tsf()->taxonomy()->get_label() instead.
          • generate_og_type(), use tsf()->open_graph()->get_type() instead.
          • get_og_type(), use tsf()->open_graph()->get_type() instead.
          • get_redirect_url(), use tsf()->uri()->get_redirect_url() instead.
          • get_blogname(), use tsf()->data()->blog()->get_public_blog_name() instead.
          • get_filtered_raw_blogname(), use tsf()->data()->blog()->get_filtered_blog_name() instead.
          • get_blogdescription(), use tsf()->data()->blog()->get_filtered_blog_description() instead.
          • generate_twitter_card_type(), use tsf()->twitter()->get_card_type() instead.
          • get_twitter_card_types(), use tsf()->twitter()->get_supported_cards() instead.
          • get_available_twitter_cards(), with no alternative available.
          • get_separator(), use tsf()->title()->get_separator() instead.
          • get_title_separator(), use tsf()->title()->get_separator() instead.
          • get_separator_list(), use tsf()->title()->utils()->get_separator_list() instead.
          • trim_excerpt(), use tsf()->format()->strings()->clamp_sentence() instead.
          • get_excerpt_by_id(), use tsf()->description()->get_singular_excerpt() instead.
          • fetch_excerpt(), use tsf()->description()->get_singular_excerpt() instead.
          • get_modified_time(), with no alternative available.
          • get_description_from_custom_field(), use tsf()->description()->get_custom_description() instead.
          • get_generated_description(), use tsf()->description()->get_generated() instead.
          • get_generated_twitter_description(), use tsf()->twitter()->get_generated_description() instead.
          • get_generated_open_graph_description(), use tsf()->open_graph()->get_generated_description() instead.
          • supported_social_locales(), use tsf()->open_graph()->get_supported_locales() instead.
          • get_generated_open_graph_title(), use tsf()->open_graph()->get_generated_title() instead.
          • get_generated_twitter_title(), use tsf()->twitter()->get_generated_title() instead.
          • use_title_protection(), use tsf()->title()->conditions()->use_protection_status() instead.
          • use_title_pagination(), use tsf()->title()->conditions()->use_pagination() instead.
          • use_title_branding(), use tsf()->title()->conditions()->use_branding() instead.
          • use_generated_archive_prefix(), use tsf()->title()->conditions()->use_generated_archive_prefix() instead.
          • use_home_page_title_tagline(), use tsf()->title()->conditions()->use_branding() instead.
          • use_singular_title_branding(), use tsf()->title()->conditions()->use_branding() instead.
          • use_taxonomical_title_branding(), use tsf()->title()->conditions()->use_branding() instead.
          • use_post_type_archive_title_branding(), use tsf()->title()->conditions()->use_branding() instead.
          • get_title_seplocation(), use tsf()->title()->get_addition_location() instead.
          • get_home_title_seplocation(), use tsf()->title()->get_addition_location_for_front_page() instead.
          • get_home_title_additions(), use tsf()->title()->get_addition_for_front_page() instead.
          • get_custom_field_title(), use tsf()->title()->get_custom_title() instead.
          • get_generated_title(), use tsf()->title()->get_generated_title() instead.
          • get_filtered_raw_custom_field_title(), use tsf()->title()->get_bare_custom_title() instead.
          • get_filtered_raw_generated_title(), use tsf()->title()->get_bare_generated_title() instead.
          • get_raw_custom_field_title(), use tsf()->title()->get_bare_unfiltered_custom_title() instead.
          • get_raw_generated_title(), use tsf()->title()->get_bare_generated_title() instead.
          • get_static_front_page_title(), use tsf()->title()->get_front_page_title() instead.
          • get_generated_archive_title(), use tsf()->title()->get_archive_title() instead.
          • get_raw_generated_archive_title_items(), use tsf()->title()->get_archive_title_list() instead.
          • get_generated_single_post_title(), use tsf()->title()->get_post_title() instead.
          • get_generated_single_term_title(), use tsf()->title()->get_term_title() instead.
          • get_generated_post_type_archive_title(), use tsf()->title()->get_post_type_archive_title() instead.
          • get_static_untitled_title(), use tsf()->title()->get_untitled_title() instead.
          • get_generated_search_query_title(), use tsf()->title()->get_search_query_title() instead.
          • get_static_404_title(), use tsf()->title()->get_404_title() instead.
          • merge_title_branding(), use tsf()->title()->add_branding() instead.
          • merge_title_pagination(), use tsf()->title()->add_pagination() instead.
          • merge_title_protection(), use tsf()->title()->add_protection_status() instead.
          • has_custom_canonical_url(), use tsf()->uri()->get_custom_canonical_url() instead.
          • get_home_url(), use tsf()->data()->blog()->get_front_page_url() instead.
          • get_preferred_scheme(), use tsf()->uri()->utils()->get_preferred_url_scheme() instead.
          • set_preferred_url_scheme(), use tsf()->uri()->utils()->set_preferred_url_scheme() instead.
          • detect_site_url_scheme(), use uri()->utils()->detect_site_url_scheme() instead.
          • set_url_scheme(), use uri()->utils()->set_url_scheme() instead.
          • make_fully_qualified_url(), use uri()->utils()->make_fully_qualified_url() instead.
          • get_current_canonical_url(), use tsf()->uri()->get_canonical_url() instead.
          • get_current_permalink(), use tsf()->uri()->get_generated_permalink() instead.
          • get_homepage_permalink(), use tsf()->uri()->get_bare_front_page_url() instead.
          • create_canonical_url(), use tsf()->uri()->get_canonical_url() or tsf()->uri()->get_custom_canonical_url() instead.
          • get_home_canonical_url(), use tsf()->uri()->get_front_page_url() instead.
          • get_raw_home_canonical_url(), use tsf()->uri()->get_bare_front_page_url() instead.
          • get_singular_canonical_url(), use tsf()->uri()->get_singular_url() instead.
          • get_taxonomical_canonical_url(), use tsf()->uri()->get_term_url() instead.
          • get_post_type_archive_canonical_url(), use tsf()->uri()->get_pta_url() instead.
          • get_author_canonical_url(), use tsf()->uri()->get_author_url() instead.
          • get_date_canonical_url(), use tsf()->uri()->get_date_url() instead.
          • get_search_canonical_url(), use tsf()->uri()->get_search_url() instead.
          • add_pagination_to_url(), use tsf()->uri()->utils()->add_pagination_to_url() instead.
          • add_url_pagination(), use tsf()->uri()->utils()->add_pagination_to_url() instead.
          • remove_pagination_from_url(), use tsf()->uri()->utils()->remove_pagination_from_url() instead.
          • get_paged_url(), use tsf()->uri()->get_paged_url() instead.
          • get_paged_urls(), use tsf()->uri()->get_paged_url() instead.
          • get_home_host(), use tsf()->uri()->utils()->get_site_host() instead.
          • append_url_query(), use tsf()->uri()->utils()->append_url_query() instead.
          • matches_this_domain(), use tsf()->uri()->utils()->url_matches_blog_domain() instead.
          • convert_to_url_if_path(), use tsf()->uri()->utils()->convert_path_to_url() instead.
          • get_singular_custom_canonical_url(), use tsf()->uri()->get_custom_canonical_url() instead.
          • get_taxonomical_custom_canonical_url(), use tsf()->uri()->get_custom_canonical_url() instead.
          • get_post_type_archive_custom_canonical_url(), use tsf()->uri()->get_custom_canonical_url() instead.
          • get_shortlink(), use tsf()->uri()->get_shortlink() instead.
          • get_image_from_cache(), use tsf()->get_first_valid_image() instead.
          • get_image_details_from_cache(), use tsf()->get_image_details() instead.
          • get_custom_field_image_details(), use tsf()->image()->get_custom_image_details() instead.
          • get_generated_image_details(), use tsf()->image()->get_generated_image_details() instead.
          • merge_extra_image_details(), use tsf()->image()->merge_extra_image_details() instead.
          • get_image_dimensions(), use tsf()->image()->utils()->get_image_dimensions() instead.
          • get_image_alt_tag(), use tsf()->image()->utils()->get_image_alt_tag() instead.
          • get_image_filesize(), use tsf()->image()->utils()->get_image_filesize() instead.
          • get_largest_acceptable_image_src(), use tsf()->image()->utils()->get_largest_image_src() instead.
          • get_settings_capability(), use constant THE_SEO_FRAMEWORK_SETTINGS_CAP instead.
          • can_access_settings(), use current_user_can( THE_SEO_FRAMEWORK_SETTINGS_CAP ) instead.
          • html_output(), use tsf()->print_seo_meta_tags() instead.
          • do_meta_output(), use tsf()->print_seo_meta_tags() instead.
          • get_default_site_options(), use tsf()->data()->plugin()->setup()->get_default_options() instead.
          • get_warned_site_options(), use tsf()->data()->plugin()->setup()->get_warned_options() instead.
          • get_all_options(), use tsf()->data()->plugin()->get_options() instead.
          • get_default_option(), use tsf()->data()->plugin()->setup()->get_default_option() instead.
          • get_warned_option(), use tsf()->data()->plugin()->setup()->get_warned_option() instead.
          • get_robots_post_type_option_id(), use tsf()->data()->plugin()->helper()->get_robots_option_index() instead.
          • get_robots_taxonomy_option_id(), use tsf()->data()->plugin()->helper()->get_robots_option_index() instead.
          • update_settings(), use tsf()->data()->plugin()->update_option() instead.
          • get_static_cache(), use tsf()->data()->plugin()->get_site_cache() instead.
          • update_static_cache(), use tsf()->data()->plugin()->update_site_cache() instead.
          • update_static_cache(), use tsf()->data()->plugin()->update_site_cache() instead.
          • get_term_meta_item(), use tsf()->data()->plugin()->term()->get_meta_item() instead.
          • get_term_meta(), use tsf()->data()->plugin()->term()->get_meta() instead.
          • get_term_meta_defaults(), use tsf()->data()->plugin()->term()->get_default_meta() instead.
          • update_single_term_meta_item(), use tsf()->data()->plugin()->term()->update_single_meta_item() instead.
          • get_latest_category_id(), use tsf()->data()->term()->get_latest_category_id() instead.
          • get_latest_category_id(), use tsf()->data()->term()->is_term_populated() instead.
          • get_latest_post_id(), use tsf()->data()->post()->get_latest_post_id() instead.
          • get_primary_term(), use tsf()->data()->plugin()->post()->get_primary_term() instead.
          • get_primary_term_id(), use tsf()->data()->plugin()->post()->get_primary_term_id() instead.
          • update_primary_term_id(), use tsf()->data()->plugin()->post()->update_primary_term_id() instead.
          • save_term_meta(), use tsf()->data()->plugin()->term()->save_meta() instead.
          • delete_term_meta(), use tsf()->data()->plugin()->term()->delete_meta() instead.
          • get_user_meta_item(), use tsf()->data()->plugin()->user()->get_meta_item() instead.
          • get_current_post_author_meta_item(), use tsf()->data()->plugin()->user()->get_current_post_author_meta_item() instead.
          • get_current_post_author_meta(), use tsf()->data()->plugin()->user()->get_current_post_author_meta() instead.
          • get_user_meta(), use tsf()->data()->plugin()->user()->get_meta() instead.
          • get_user_meta_defaults(), use tsf()->data()->plugin()->user()->get_default_meta() instead.
          • update_single_user_meta_item(), use tsf()->data()->plugin()->user()->update_single_meta_item() instead.
          • save_user_meta(), use tsf()->data()->plugin()->user()->save_meta() instead.
          • get_post_author_id(), use tsf()->query()->get_post_author_id() instead.
          • get_current_post_author_id(), use tsf()->query()->get_post_author_id() instead.
          • get_user_id(), use tsf()->query()->get_current_user_id() instead.
          • get_post_content(), use tsf()->data()->post()->get_content() instead.
          • uses_non_html_page_builder(), use tsf()->data()->post()->uses_non_html_page_builder() instead.
          • is_protected(), use tsf()->data()->post()->is_protected() instead.
          • is_password_protected(), use tsf()->data()->post()->is_password_protected() instead.
          • is_private(), use tsf()->data()->post()->is_private() instead.
          • is_draft(), use tsf()->data()->post()->is_draft() instead.
          • get_post_meta_item(), use tsf()->data()->plugin()->post()->get_meta_item() instead.
          • get_post_meta(), use tsf()->data()->plugin()->post()->get_meta() instead.
          • get_post_meta_defaults(), use tsf()->data()->plugin()->post()->get_default_meta() instead.
          • update_single_post_meta_item(), use tsf()->data()->plugin()->post()->update_single_meta_item() instead.
          • save_post_meta(), use tsf()->data()->plugin()->post()->save_meta() instead.
          • get_post_type_archive_meta(), use tsf()->data()->plugin()->pta()->get_meta() instead.
          • get_post_type_archive_meta_item(), use tsf()->data()->plugin()->pta()->get_meta_item() instead.
          • get_all_post_type_archive_meta_defaults(), use tsf()->data()->plugin()->pta()->get_all_default_meta() instead.
          • get_post_type_archive_meta_defaults(), use tsf()->data()->plugin()->pta()->get_default_meta() instead.
          • get_sitemap_colors(), use tsf()->sitemap()->utils()->get_sitemap_colors() instead.
          • is_blog_public(), use tsf()->data()->blog()->is_public() instead.
          • current_blog_is_spam_or_deleted(), use tsf()->data()->blog()->is_spam_or_deleted() instead.
          • is_subdirectory_installation(), use tsf()->data()->blog()->is_subdirectory_installation() instead.
          • use_core_sitemaps(), use tsf()->sitemap()->utils()->use_core_sitemaps() instead.
          • can_run_sitemap(), use tsf()->sitemap()->utils()->may_output_optimized_sitemap() instead.
          • has_robots_txt(), use tsf()->robotstxt()->utils()->has_root_robots_txt() instead.
          • get_robots_txt_url(), use tsf()->robotstxt()->utils()->get_robots_txt_url() instead.
          • has_sitemap_xml(), use tsf()->sitemap()->utils()->has_root_sitemap_xml() instead.
          • robots_txt(), use tsf()->robotstxt()->get_robots_txt() instead.
          • delete_excluded_ids_cache(), use tsf()->query()->exclusion()->clear_excluded_post_ids_cache() instead.
          • get_excluded_ids_from_cache(), use tsf()->query()->exclusion()->get_excluded_ids_from_cache() instead.
          • clean_response_header(), with no alternative available.
          • init_admin_scripts(), use tsf()->load_admin_scripts() instead.
          • get_generated_seo_bar(), with no alternative available.
          • do_redirect(), use wp_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(), use tsf()->format()->markdown()->convert() instead.
          • gmt2date(), use function gmdate() instead.
          • get_timestamp_format(), use tsf()->format()->time()->get_preferred_format() instead.
          • uses_time_in_timestamp_format(), with no alternative available.
          • hellip_if_over(), use tsf()->format()->strings()->hellip_if_over() instead.
          • get_word_count(), use tsf()->format()->strings()->get_word_count() instead.
          • get_input_guidelines(), use tsf()->guidelines()->get_text_size_guidelines() instead.
          • get_input_guidelines_i18n(), use tsf()->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(), use tsf()->admin()->menu()->register_top_menu_page() instead.
          • get_admin_issue_count(), use tsf()->admin()->menu()->get_top_menu_issue_count() instead.
          • get_admin_menu_issue_badge(), use tsf()->admin()->menu()->get_issue_badge() instead.
          • admin_redirect(), use tsf()->admin()->utils()->redirect() instead.
          • register_dismissible_persistent_notice(), use tsf()->admin()->notice()->persistent()->register_notice() instead.
          • count_down_persistent_notice(), use tsf()->admin()->notice()->persistent()->count_down_notice() instead.
          • clear_persistent_notice(), use tsf()->admin()->notice()->persistent()->clear_notice() instead.
          • clear_all_persistent_notices(), use tsf()->admin()->notice()->persistent()->clear_all_notices() instead.
          • generate_dismissible_notice(), use tsf()->admin()->notice()->generate_notice() instead.
          • do_dismissible_notice(), use tsf()->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 filter the_seo_framework_settings_update_sanitizers instead.
          • get_relative_fontcolor(), use tsf()->format()->color()->get_relative_fontcolor() instead.
          • active_plugins(), use tsf()->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(), use sanitize_email() instead.
          • s_safe_html(), use wp_kses_post() instead.
          • s_no_html(), use strip_tags() instead.
          • s_no_html_space(), with no alternative available.
          • s_url_query(), use sanitize_url() instead.
          • s_url(), with no alternative available.
          • clean_canonical_url(), use esc_url() instead.
          • s_field_id(), use tsf()->escape()->option_name_attribute() instead.
          • s_description(), with no alternative available.
          • escape_description(), use esc_html() instead.
          • s_title(), with no alternative available.
          • escape_title(), use esc_html() instead.
          • esc_attr_preserve_amp(), use esc_attr() instead.
          • strip_newline_urls(), use tsf()->format()->html()->strip_newline_urls() instead.
          • strip_paragraph_urls(), use tsf()->format()->html()->strip_paragraph_urls() instead.
          • strip_tags_cs(), use tsf()->format()->html()->strip_tags_cs() instead.
          • s_excerpt(), use tsf()->format()->html()->extract_content() instead.
          • s_excerpt_raw(), use tsf()->format()->html()->extract_content() instead.
          • s_description_raw(), use tsf()->sanitize()->metadata_content() instead.
          • s_singleline(), use tsf()->sanitize()->newline_to_space() instead.
          • s_dupe_space(), use tsf()->sanitize()->remove_repeated_spacing() instead.
          • s_tabs(), use tsf()->sanitize()->tab_to_space() instead.
          • s_qubit(), use tsf()->sanitize()->qubit() instead.
          • s_one_zero(), use tsf()->sanitize()->boolean_integer() instead.
          • s_numeric_string(), use tsf()->sanitize()->numeric_string() instead.
          • s_absint(), use absint() instead.
          • s_color_hex(), use tsf()->sanitize()->rgb_hex() instead.
          • s_hyphen(), use tsf()->sanitize()->lone_hyphen_to_entity() instead.
          • s_nbsp(), use tsf()->sanitize()->nbsp_to_space() instead.
          • s_bsol(), use tsf()->sanitize()->backward_solidus_to_entity() instead.
          • s_bsol_raw(), use tsf()->sanitize()->backward_solidus_to_entity() instead.
          • s_title_raw(), use tsf()->sanitize()->metadata_content() instead.
          • s_image_details(), use tsf()->sanitize()->image_details() instead.
          • s_twitter_name(), use tsf()->sanitize()->twitter_profile_handle() instead.
          • s_facebook_profile(), use tsf()->sanitize()->facebook_profile_link() instead.
          • s_image_details_deep(), use tsf()->sanitize()->image_details() instead.
          • s_redirect_url(), use tsf()->sanitize()->redirect_url() instead.
          • s_url_relative_to_current_scheme(), use tsf()->uri()->utils()->make_absolute_current_scheme_url() instead.
          • s_relative_url(), use tsf()->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(), use tsf()->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(), use tsf()->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().
            • 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().
            • generate_cache_key()
            • generate_cache_key_by_type()
            • add_cache_key_suffix()
              • This has been moved to tsf()->sitemap()->cache()->build_sitemap_cache_key().
            • delete_sitemap_transient_permalink_updated
            • delete_sitemap_transient()
              • This has been moved to tsf()->sitemap()->cache()->clear_sitemap_caches().
          • 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 function The_SEO_Framework\is_headless() instead.
          • loaded, this check is no longer necessary.
          • pretty_permalinks, use tsf()->query()->utils()->using_pretty_permalinks() instead.
          • script_debug, use constant SCRIPT_DEBUG instead.
          • seo_settings_page_slug, use constant THE_SEO_FRAMEWORK_SITE_OPTIONS_SLUG or The_SEO_Framework\Admin::get_top_menu_args() instead.
          • seo_settings_page_hook, use tsf()->admin()->menu()->get_page_hook_name() instead.
          • the_seo_framework_debug, use constant THE_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.
  • Constant notes:
    • Added:
      • THE_SEO_FRAMEWORK_SITE_OPTIONS_SLUG is now available.
    • Changed:
      • THE_SEO_FRAMEWORK_DEBUG is now always available at plugins_loaded.
    • Removed:
      • THE_SEO_FRAMEWORK_DISABLE_TRANSIENTS, for it is no longer used.
  • 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 be the_seo_framework_auto_descripton_html_method_methods (typo).
      • the_seo_framework_sitemap_endpoint_list now accepts cache_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., at load-{$plugin_page}). If that’s not possible, use tsf()->load_admin_scripts() instead to enforce loading.
      • 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
        1. 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.
        2. No longer sends pre-sanitized data to the filter.
      • 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
        1. Removed 3rd and 4th parameters ($tt_id and $taxonomy).
        2. No longer sends pre-sanitized data to the filter.
      • 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.
    • 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, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_rel_canonical_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_shortlink_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_paged_url_output_next, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_paged_url_output_prev, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_ogtitle_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_ogdescription_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_oglocale_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_ogsitename_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_ogurl_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_facebookauthor_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_facebookpublisher_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_publishedtime_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_twittersite_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_twittercreator_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_twittertitle_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_twitterdescription_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_modifiedtime_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_ogtype_output, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_use_og_tags, use the_seo_framework_meta_generator_pools instead.
      • the_seo_framework_use_facebook_tags, use the_seo_framework_meta_generator_pools instead.
      • the_seo_framework_use_twitter_tags, use the_seo_framework_meta_generator_pools instead.
      • the_seo_framework_robots_meta, use the_seo_framework_meta_render_data instead.
      • the_seo_framework_image_details, use the_seo_framework_custom_image_details or the_seo_framework_generated_image_details instead.
      • the_seo_framework_fetched_description_excerpt, use the_seo_framework_description_excerpt instead.
      • the_seo_framework_manipulate_title, use the_seo_framework_overwrite_titles instead.
      • the_seo_framework_conflicting_plugins_type, use the_seo_framework_conflicting_plugins instead.
      • the_seo_framework_twittercard_output, with no alternative available.
      • the_seo_framework_generated_archive_title, use the_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 action the_seo_framework_before_meta_output instead.
        • the_seo_framework_pro, use action the_seo_framework_after_meta_output instead.
        • the_seo_framework_before_output, use action the_seo_framework_before_meta_output instead.
        • the_seo_framework_after_output, use action the_seo_framework_after_meta_output instead.
        • the_seo_framework_settings_capability, assign constant THE_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, use the_seo_framework_conflicting_plugins instead.
        • the_seo_framework_og_plugin_detected, use the_seo_framework_conflicting_plugins instead.
        • the_seo_framework_twittercard_plugin_detected, use the_seo_framework_conflicting_plugins instead.
        • the_seo_framework_ldjson_plugin_detected, use the_seo_framework_conflicting_plugins instead.
        • the_seo_framework_sitemap_plugin_detected, use the_seo_framework_conflicting_plugins instead.
        • the_seo_framework_multilingual_plugin_detected, use the_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, use the_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, use the_seo_framework_image_generation_params instead.
        • the_seo_framework_ld_json_breadcrumb_taxonomies, use the_seo_framework_breadcrumb_list instead.
        • the_seo_framework_ld_json_breadcrumb_terms, use the_seo_framework_breadcrumb_list instead.
        • the_seo_framework_json_breadcrumb_output, use the_seo_framework_breadcrumb_list instead.
        • the_seo_framework_json_search_output, use the_seo_framework_schema_graph_data instead.
        • the_seo_framework_json_knowledge_output, use the_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.
      • the_seo_framework_delete_cache_args, there’s no functionality left that could use this.
      • the_seo_framework_facebookappid_output, we removed app: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.
      • the_seo_framework_warn_homepage_global_title, we now use multilingual plugin detection via the_seo_framework_conflicting_plugins.
      • the_seo_framework_warn_homepage_global_description, we now use multilingual plugin detection via the_seo_framework_conflicting_plugins.
      • the_seo_framework_tell_multilingual_sitemap, we now use multilingual plugin detection via the_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. Use the_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.
  • 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, use the_seo_framework_cleared_sitemap_transients instead.
  • Hook notes:
    • Excluded IDs cache is now cleared on wp_insert_post and attachment_updated, from save_post and edit_attachment respectively.
    • These are among the most prominent changes of over 35 others:
      • [ \tsf(), 'html_output' ] no longer runs on wp_head. Instead, [ 'The_SEO_Framework\Front\Meta\Head', 'print_wrap_and_tags' ] is now outputted – remaining at priority 1.
      • _init_tsf no longer runs on plugins_loaded, but on init. Use filter the_seo_framework_load instead.
  • JavaScript notes:
    • HTML element with ID tsf-description-reference is no longer available. Use tsf-description-reference_{$type} instead.
      • $type can be: autodescription_description, autodescription-meta[description], autodescription-quick[description], autodescription-site-settings[homepage_description], or tsf-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. Use tsf-title-reference_{$type} instead.
      • See above for $type hints, where description is replaced with title in every instance.
  • 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.
Filed Under: The SEO Framework Changelog

Commercial

The SEO Framework
Trademark of CyberWire B.V.
Leidse Schouw 2
2408 AE Alphen a/d Rijn
The Netherlands
KvK: 83230076
BTW/VAT: NL862781322B01

Twitter  GitHub

Professional

Pricing
About
Support
Press

Rational

Blog
Privacy Policy
Terms and Conditions
Refund Policy

Practical

Documentation
TSF on WordPress
TSF on GitHub
TSFEM on here
TSFEM on GitHub
Feature Highlights

Incognito in 2025 › The SEO Framework