Developer notes
Files and data
Section titled “Files and data”| 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.
Caching and the full page cache
Section titled “Caching and the full page cache”- 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.phpaddskv_sps_faq,kv_sps_faq_descriptionsand the settings tables as update handlers and the license state as a callable handler. /llms.txtis cached withRegistry::getOrSetCache()and reset by changes to products, prices, categories, pages, companies and settings.- No
?:storage_datawrites at runtime. robots.txt is written only by admin actions.
License check
Section titled “License check”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.
Extending
Section titled “Extending”- Change the add-on’s JSON-LD after it is built: hook
dispatch_before_displaywith a priority above 2900 and edit the view variableschema_org_markup_items(keyskv_website,kv_organization,kv_breadcrumb_list,kv_blog_posting,kv_vendor_store,kv_faq_page). - Head tags: the view variable
kv_sps_head(robots,ogandtwitterlists of[name, content]). - FAQ markup: override
addons/kv_seo_pro_suite/components/faq.tplin your theme. CSS is scoped under.kv-seo-pro-suite.
Third-party code
Section titled “Third-party code”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.