Skip to content

Developer notes

Item Value
Add-on id kv_seo_pro_suite (scheme 3.0, priority 2900, after the core seo add-on at 1800; requires seo)
Namespace Tygh\Addons\KvSeoProSuite in app/addons/kv_seo_pro_suite/Tygh/Addons/KvSeoProSuite/
Tables ?:kv_sps_objects (object_type p/c/a, object_id, robots), ?:kv_sps_faq (faq_id, object_type, object_id, position, status), ?:kv_sps_faq_descriptions (faq_id, lang_code, question, answer)
Classes Storefront (head output entry point), Rules (robots/canonical), Hreflang, Social (Open Graph/Twitter), Markup (JSON-LD), ObjectData (FAQ and overrides), Llms (llms.txt), Crawlers (robots.txt block), PageCheck (admin page check and coverage), Settings
Controllers backend kv_seo_pro_suite (manage, apply_crawlers, remove_crawlers), products.post, categories.post, pages.post (SEO Pro tab); frontend kv_seo_pro_suite (mode llms)
Route /llms.txt → kv_seo_pro_suite.llms (schemas/routes/objects.post.php; replaces the 4.21 core route, the controller serves core content first)
Privileges Core view_seo_rules / manage_seo_rules; vendors have no access to the tools page
License Tygh/Addons/KvSeoProSuite/License/Client.php (license check client, generated from the shared Kavio Labs template), controllers/backend/kv_seo_pro_suite_license.php (“Check now” / cron license check), design/backend/templates/addons/kv_seo_pro_suite/license/info.tpl (License tab), license/card.tpl (License card on the add-on page), license/status_bar.tpl (status chip/banner on the tools page), license/badge.tpl (badge in Add-ons > Manage add-ons), hooks/addons/tabs_content.pre.tpl (card), hooks/addons/manage.post.tpl (badge), hooks/index/styles.post.tpl (loads license.less), design/backend/css/addons/kv_seo_pro_suite/license.less
Upgrades Tygh/Addons/KvSeoProSuite/Upgrade/Synchronizer.php (self-healing in-place upgrades: tables, settings, language variables, version)
Hook Since What happens
dispatch_before_display core Storefront::apply(): robots decision, canonical add/remove, hreflang rewrite (seo_alt_hreflangs_list), social tags (kv_sps_head), FAQ (kv_sps_faq), page-level JSON-LD appended to the core schema_org_markup_items. Runs after the SEO add-on’s handler (priority).
seo_get_schema_org_markup_items_post seo, 4.17+ Markup::extendProduct(): completes the core Product item and its offers (also offers inside an AggregateOffer).
seo_dispatch_before_display_before_cache seo, 4.17+ Adds the license state, a hash of the add-on settings and the month to the core cache key of the product markup.
seo_get_schema_org_organization_markup_post seo, 4.21+ Adds address, phone, e-mail, sameAs and contactPoint to the core Organization item. On older versions the add-on builds the item itself.
update_product_post, update_category_post, update_page_post core Save the SEO Pro tab (product_data[kv_sps], category_data[kv_sps], page_data[kv_sps]). Vendors: FAQ only, robots ignored.
delete_product_post, delete_category_post, delete_page, clone_product_post core Delete or copy FAQs and overrides.

All hook arguments are identical in 4.17.2 and 4.21.2.

Template hooks: storefront index:meta (post: robots, Open Graph, Twitter tags), products:product_tabs (post), categories:view (post) and pages:page_content (post) for the FAQ (components/faq.tpl); admin products:tabs_content, categories:tabs_content, pages:tabs_content. Templates only read variables assigned in PHP.

  • Everything the add-on prints depends on the URL and the add-on settings only, never on the visitor’s session. The product price tags follow the core rule for showing prices to guests.
  • The FAQ is printed inside the main block of product and category pages, which the core caches: schemas/block_manager/blocks.post.php adds kv_sps_faq, kv_sps_faq_descriptions and the settings tables as update handlers and the license state as a callable handler.
  • /llms.txt is cached with Registry::getOrSetCache() and reset by changes to products, prices, categories, pages, companies and settings.
  • No ?:storage_data writes at runtime. robots.txt is written only by admin actions.

fn_kv_seo_pro_suite_is_licensed() (cached License\Client::isActive()) gates: fn_kv_seo_pro_suite_storefront_active() (used by dispatch_before_display, the product markup hook and the organization hook), the llms.txt controller, and the Write to robots.txt action. Not gated: settings, the SEO Pro tabs, the tools page, page check, coverage, Remove from robots.txt, uninstall.

  • Change the add-on’s JSON-LD after it is built: hook dispatch_before_display with a priority above 2900 and edit the view variable schema_org_markup_items (keys kv_website, kv_organization, kv_breadcrumb_list, kv_blog_posting, kv_vendor_store, kv_faq_page).
  • Head tags: the view variable kv_sps_head (robots, og and twitter lists of [name, content]).
  • FAQ markup: override addons/kv_seo_pro_suite/components/faq.tpl in your theme. CSS is scoped under .kv-seo-pro-suite.

Tygh/Addons/KvSeoProSuite/License/Ed25519.php (checks the signature of the license server’s answers on servers whose PHP has no sodium extension) is derived from paragonie/sodium_compat, ISC License, Copyright (c) 2016-2023 Paragon Initiative Enterprises and Copyright (c) 2013-2019 Frank Denis. The full license notice is in the file header.