HeyTC SEO
Lean structured-data SEO plugin for WordPress — Article/News schema with E-E-A-T, Google News sitemap, IndexNow, FAQ schema, security hardening. No bloat.
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/malmichaels-gif/heytc-seo/archive/refs/heads/main.zipReadme
HeyTC SEO
Lean, no-bloat structured-data SEO for WordPress. It does the few things that actually move the needle for content publishers — rich structured data, a Google News sitemap, instant indexing, and clean meta/social tags — and deliberately nothing else.
Built for speed (and for news/editorial sites), but generic enough for any blog. No upsell dashboards, no tracking, no third-party runtime dependencies — no bloat.
Features
- Structured data (JSON-LD) —
Article/NewsArticle,Organization,WebSite,BreadcrumbList, andFAQPage, with E-E-A-T author signals (job title, areas of expertise, education, last-reviewed date). - Entity Links — map named entities to authoritative URLs; when an entity is
mentioned in a post it's linked in the Article schema (
about/mentions). - Google News sitemap at
/news-sitemap.xml, cached and bounded. - IndexNow — instant indexing ping on publish (Bing, Yandex, Seznam).
- Meta & social — titles, meta descriptions, canonical, Open Graph, Twitter
Cards, robots, and per-post
noindex/nofollow. - Structured FAQ markup — from a per-post FAQ editor and auto-detected from
core/details(accordion) blocks. (Note: Google retired FAQ rich results in May 2026; this remains valid, machine-readableFAQPageschema and the FAQs render visibly on the page — it's structure, not a rich-result promise.) - Security hardening — REST/XML-RPC tightening, security headers, version string removal, author-enumeration block.
- Core Web Vitals helpers — deferred scripts and configurable resource hints.
- Plays nice with others — detects Yoast, Rank Math, All in One SEO, SEOPress, and The SEO Framework, and automatically suppresses its own overlapping output so you never get duplicate tags or schema.
Why HeyTC SEO?
- Tiny by design. ~3,000 lines, no shipped dependencies. It does its work on
wp_head/wp_footerand gets out of the way — your pages and server stay fast. - Correct, not noisy. Schema follows Google's current rules (e.g. author name separate from job title). It's about eligibility and machine-readability — not a promise of AI-ranking magic.
- Coexists. Detects the big SEO plugins and steps aside, so you can trial it without duplicate tags or schema graphs.
- Developer-first. Everything site-specific is a filter (see below) — no sprawling settings screens to wade through.
What it deliberately doesn't do
Staying lean means saying no. This plugin does not ship redirects / 404 monitoring, social-image generation, or a general post/page XML sitemap — WordPress core already provides one. If you want an all-in-one SEO suite, use one. HeyTC SEO is the opposite bet.
Requirements
- WordPress 6.6+ (tested up to 7.0)
- PHP 8.2+
Installation
- Download or clone this repository into
wp-content/plugins/heytc-seo. - Activate HeyTC SEO in Plugins.
- Configure under the HeyTC SEO menu.
The folder is
heytc-seo, the main fileheytc-seo.php.
Entity Links
Under HeyTC SEO → Entity Links, add one entity per line:
Patrick Mahomes | https://en.wikipedia.org/wiki/Patrick_Mahomes
NASA | https://en.wikipedia.org/wiki/NASA
Acme Corp | https://acme.example.com/about
When an entity's exact name appears in a post's tags or body, it's emitted in that
post's Article schema as about (primary) and mentions (the rest), each with a
sameAs link. Matching is case-insensitive but preserves your canonical name.
Coexistence with other SEO plugins
If another major SEO plugin is active, HeyTC SEO automatically disables its own
meta tags and structured data (canonical, robots, descriptions, Open Graph,
Twitter, and all JSON-LD) to avoid duplicates. The news sitemap, security
hardening, and IndexNow keep working. An admin notice tells you when this is in
effect. Override detection with the heytc_seo_conflicting_plugin filter.
Developer filters
Everything site-specific is a filter with an empty/sensible default — nothing brand-specific is emitted out of the box.
| Filter | Default | Purpose |
|---|---|---|
heytc_seo_twitter_handle |
'' |
twitter:site handle (omitted if empty). |
heytc_seo_organization_same_as |
[] |
Organization sameAs social profile URLs. |
heytc_seo_organization_knows_about |
[] |
Organization knowsAbout topics. |
heytc_seo_speakable_selectors |
['.entry-content > p:nth-of-type(-n+3)'] |
speakable CSS selectors (NewsArticle). |
heytc_seo_news_dateline |
'' |
NewsArticle dateline (omitted if empty). |
heytc_seo_archive_title |
"{term} \| {site}" |
Category/tag archive <title>. |
heytc_seo_category_breadcrumb_map |
[] |
Map category slug → {name, url} breadcrumb hub. |
heytc_seo_breadcrumb_hub |
null |
Optional hub breadcrumb inserted before a mapped category. |
heytc_seo_entity_map |
stored map | Programmatically add/override entity links. |
heytc_seo_preconnect |
[] |
preconnect resource hints. |
heytc_seo_dns_prefetch |
[] |
dns-prefetch resource hints. |
heytc_seo_conflicting_plugin |
detected | Force/skip the other-SEO-plugin guard. |
Examples
// Set your X/Twitter handle and org profiles.
add_filter( 'heytc_seo_twitter_handle', fn() => 'yoursite' );
add_filter( 'heytc_seo_organization_same_as', fn() => [
'https://x.com/yoursite',
'https://www.linkedin.com/company/yoursite',
] );
// Point a category breadcrumb at a content hub instead of the bare archive.
add_filter( 'heytc_seo_category_breadcrumb_map', function ( $map ) {
$map['reviews'] = [ 'name' => 'Product Reviews', 'url' => home_url( '/reviews/' ) ];
return $map;
} );
External services
This plugin contacts external services only when you enable IndexNow:
- IndexNow (
api.indexnow.org) — on publish, submits the post URL for instant indexing. Off by default. See https://www.indexnow.org/.
No other outbound requests are made.
Theme integrations
includes/integrations/ holds optional, auto-detected integrations that stay
inert unless their target is active. Bundled:
- Newspaper (tagDiv) — suppresses the theme's own breadcrumb schema (so it
doesn't duplicate this plugin's) and tunes the
speakableselector.
PRs adding integrations for other popular themes are welcome.
License
GPL-2.0-or-later. See LICENSE.
Read the full README on GitHub →
Releases
| Tag | Published |
|---|---|
| v1.0.0 | Jun 4, 2026 |
These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.