=== SEOWard ===
Contributors: omniswp
Tags: seo, meta description, title, schema, noindex
Requires at least: 6.7
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.6.8
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Lean SEO for WordPress: titles, descriptions, robots and canonicals per page, with global templates. Nothing locked, nothing added to your pages but the tags in the head.

== Description ==

SEOWard is a lean SEO plugin. It sets your page titles, meta descriptions, robots directives and canonical URLs, from templates you set once and from any page where you want to say something different. There is no Pro version, no licence key and no feature held back for a paid tier.

= What makes SEOWard different =

* **Nothing added to your pages.** No scripts, no stylesheets, no credit comment. SEOWard only prints the tags search engines read.
* **Works with WordPress, not around it.** Titles, robots and canonicals go through WordPress's own filters, so your theme and other plugins keep working as they should.
* **Templates first.** Set how every post type, taxonomy and archive is titled and described, with tokens like {title}, {site} and {excerpt}. Only type a title by hand where a page needs one.
* **A preview you can trust.** The search preview in the editor is worked out by the same code that prints the page, with real pixel widths rather than character counts.
* **No traffic lights.** SEOWard does not grade your writing with scores. An optional focus keyword shows where the phrase appears on the page, nothing more. Keyword research and rank tracking are better done in tools built for them.
* **Quiet admin.** No dashboard widgets, no admin bar menu, no upgrade prompts. The only notice outside SEOWard's own screens is a warning if a live site is still asking search engines to stay away.

= Features =

* Title and description templates for the home page, every public post type, taxonomy and post type archive, author, date and search pages, and the 404 page.
* Per page and per term: title, description, noindex or index, nofollow and canonical URL.
* Block editor panel with a search result preview, plus the same fields in the Classic Editor and on category, tag and term edit screens.
* Sensible defaults: date archives, search results, attachment pages and post format archives are kept out of search results.
* Canonical URLs for listing pages, which WordPress leaves out, including page numbers.
* Stands by while another SEO plugin is active, so you can prepare a switch without two plugins printing tags.
* Bulk editor: every page's search title and description in one list, with missing, duplicate and over-long ones flagged, plus an SEO column and Quick Edit fields on the Posts, Pages and category lists.
* Imports titles, descriptions and settings from Yoast SEO, Rank Math and All in One SEO, without changing their data.
* Schema for who runs the site (organisation, local business or person, with legal name, parent company, contact points, offices and topics) and for each page (FAQ, article, product, software, web app, how-to, service, event, person, business location).
* Social sharing tags, with 1200 by 630 JPEG share cards made from your images, and JPEG or PNG stand-ins for AVIF and WebP.
* robots.txt rules, and optional IndexNow submissions when pages are published.
* Redirects: 301, 302, 307, 410 and 451, exact or by pattern, added by hand or automatically when a page, post or category gets a new address. An optional 404 log (off by default) shows missing addresses to redirect. Imports redirects from Redirection, Rank Math and Yoast SEO Premium.
* Flags pages that still hold placeholder text (lorem ipsum).
* Optional llms.txt for AI assistants, built from your titles and descriptions, with your own text.
* Image alt text: a list of images without it, decorative marks, and pages that pick up alt text added to the media library later.

== Frequently Asked Questions ==

= Does SEOWard have a Pro version? =

No. Everything in SEOWard is free.

= Can I run it alongside another SEO plugin? =

SEOWard detects the common SEO plugins and prints nothing while one is active. Import their titles and descriptions under SEOWard > Import (or with `wp seoward import`), then deactivate the other plugin. SEOWard is not affiliated with any other SEO plugin.

= My theme ignores the titles. =

Your theme writes its own title tag. SEOWard can set titles on themes that declare "title-tag" support, which almost every modern theme does; the Settings screen tells you if yours does not.

= Does SEOWard contact any outside service? =

Not unless you turn on IndexNow (see below). SEOWard collects nothing about your visitors.

= Does llms.txt help my rankings? =

No. Google has said its search does not use llms.txt, and most AI crawlers do not read it yet. It is off by default; turn it on under SEOWard > llms.txt if you want AI assistants that do read it to find a clean summary of your site.

== External services ==

**IndexNow** (off by default; SEOWard > Settings > IndexNow). When you turn it on, SEOWard sends the addresses of pages you publish, update or unpublish, and on request every indexable page, to the IndexNow API at https://api.indexnow.org/indexnow, which shares them with participating search engines (such as Bing, Yandex, Seznam and Naver). Only page addresses, your site's host name and a key that proves the site is yours are sent; nothing about visitors or users. Nothing is sent while "Discourage search engines" is on. IndexNow terms: https://www.indexnow.org/terms. Privacy policy of the API operator (Microsoft Bing): https://privacy.microsoft.com/privacystatement.

The Bulk editor's "Test in Google" and "Validate schema" links open Google's Rich Results Test and validator.schema.org in a new tab only when you click them; SEOWard itself sends them nothing.

== Changelog ==

= 0.6.8 =
* Image alt: file-name suggestions skip design layers and codes (such as hero-visual-0-l3) and abbreviations, so they only appear for names that describe the picture. AI assistants get a JPEG or PNG copy of AVIF images to look at (view_url in list-images).

= 0.6.7 =
* Image alt text (SEOWard > Image alt): every image without alt text in one list, with a thumbnail and the page it was uploaded to. Type alt text, mark decorative images (screen readers skip them) and save; it goes into the media library so every page using the image gets it. Respects Bricks' own decorative mark.
* Pages now use the media library's alt text wherever their copy of an image has none (the editor copies alt text into a post when an image is inserted, so later fixes never reached older posts). Nothing in your posts is changed, and alt text written for a spot is never replaced. On by default; can be turned off.
* Optional, off by default: alt text from the file name, on upload or as pages are shown, but only for names written in words. Camera names (IMG_2034), screenshots, hashes and one-word names are skipped, because reading those out is worse than nothing.
* New abilities seoward/list-images and seoward/update-image-alt, so an AI assistant that can see images writes real descriptions. get-overview reports how many images lack alt text.

= 0.6.6 =
* llms.txt (SEOWard > llms.txt, off by default): a Markdown summary of the site for AI assistants at /llms.txt. Choose which post types (custom post types included) and taxonomies to list and how many items each list holds, and add your own text. Each page is listed with its title, address and search description; noindex pages are left out. Served virtually, nothing written to disk. Also in seoward/update-settings (llms_*) and seoward/get-overview.

= 0.6.5 =
* Sitemaps: author archives are left out by default (tick them on the Sitemaps screen to list them). Sites that already saved this setting keep their choice.
* Sitemaps screen: page builder templates (such as Bricks templates) are listed, unticked by default. Custom post types and taxonomies appear and are included as soon as they are registered.

= 0.6.4 =
* Sitemaps screen: "Nothing to list yet" only shows on kinds of pages that are ticked.

= 0.6.3 =
* Sitemaps screen: kinds of pages with nothing published say so instead of linking to an empty sitemap.

= 0.6.2 =
* Sitemaps screen (SEOWard > Sitemaps): turn the sitemap on or off, leave out whole post types, taxonomies or the author archives, and set how many addresses each sitemap holds.
* The sitemap now answers at /sitemap_index.xml, with parts named post-sitemap.xml, category-sitemap.xml and so on, the addresses Yoast SEO and Rank Math use, so a sitemap already submitted in Google Search Console keeps working after switching. /sitemap.xml and /sitemaps.xml (All in One SEO, SEOPress) redirect to it, and robots.txt lists it. Prefer WordPress's own names? Choose /wp-sitemap.xml and the other addresses redirect there instead.
* Fix: the author sitemap is now really left out when author archives are noindex.

= 0.6.1 =
* The plugin is now called SEOWard (its slug, settings and ability names stay `seoward`).
* Placeholder text: Bricks pages are checked in full, every element's text and the Bricks components they use, so lorem ipsum in any section is found.
* Focus keyword: plurals count ("transit map" is found in "Transit Maps", and the other way round).
* Bulk editor: a Focus keyword column, with how many of the six places it appears in. list-items rows include each page's keyword.
* Schema contact points: a contact page on this site is kept as a link to the page itself, so it still works after moving to the live domain.
* Internal builds see new versions sooner (the update feed is cached for an hour and checked again whenever WordPress is asked to check for updates).

= 0.6.0 =
* Redirects (SEOWard > Redirects): exact or pattern rules sending 301, 302, 307, 410 or 451, with hit counts. Rules can point at a page itself, so they follow it when it moves again.
* A published page, post or category that gets a new address (slug, parent or category) is redirected from the old one automatically, along with the pages under it. A page that takes back an old address is no longer redirected away.
* Optional 404 log, off by default, capped at 1,000 addresses and pruned after 30 days, with one-click "Redirect it".
* Import redirects from Redirection, Rank Math and Yoast SEO Premium (their own redirects are left untouched).
* Abilities list-redirects and update-redirects, and `wp seoward redirects`.

= 0.5.7 =
* Fix: listing every post type at once (the list-items ability, the Bulk editor's "All posts and pages") skipped pages written by other users.
* The bulk-update ability now confirms what it saved: schema type, fields and the nodes each page now prints, share and keyword details.
* Schema, who runs the site: organisation kinds (Corporation, Online business, NGO and more), legal name, other names, parent company, contact points, offices, topics, a language other than the site's, a website description separate from the tagline and an optional site search action.
* Schema per page: Software and Web app types, how-to guides; products can leave out the price.
* AVIF and WebP logos print as a PNG copy in the schema; share images can be turned into 1200 by 630 JPEG cards (also `wp seoward cards`).
* Focus keyword per page, with where it appears (title, description, headings, address, opening text). No scores.
* Pages that still hold lorem ipsum are flagged in the Bulk editor, the SEO column and the list-items ability.
* Bulk editor: "Test in Google" and "Validate schema" links on live sites.
* robots.txt rules on the Settings screen; optional IndexNow submissions, with a "Submit every page now" button for launch day.
* A clear banner on SEOWard screens while "Discourage search engines" is on.

= 0.5.6 =
* Titles and meta: each template shows an example search result for a real page of that kind. The Save button stays in view on long screens.
* Bulk editor: tidier rows; pages kept out of search results no longer count as needing attention; Media can be listed; saving the last page of a filter no longer lands on an empty page.
* Quick Edit only saves the SEO fields you changed, so it never undoes an edit made elsewhere since the list was opened. The SEO column only shows text for posts you may edit.
* Saving templates keeps those of post types and taxonomies that are switched off for a while.
* Share images: the right size when the original upload is used; the posts page previews as it prints.
* Internal builds: updates are signed and a download that does not match the signature is refused.
* Fixes: underscores in template fields, import table layout.

= 0.5.5 =
* Bulk editor (SEOWard > Bulk editor): every page, post or category with the search title and description it shows, their length and where they come from. Filter by what needs attention (no description, the same title or description as another page, longer than search results show), type over any of them and save the lot in one go.
* An SEO column and SEO title and description fields in Quick Edit on the Posts, Pages and category lists.
* Abilities: list-items flags duplicate titles and descriptions and can filter by them, or by everything that needs attention.

= 0.5.4 =
* Import from Yoast SEO, Rank Math and All in One SEO (SEOWard > Import): titles, descriptions, noindex and nofollow, canonical URLs, share titles, descriptions and images, and schema types, for posts, pages and categories. Check first, then import; values already set in SEOWard are kept unless you choose to replace them, and the other plugin's data is never changed. Their title variables become SEOWard tokens, and any without a token are listed.
* Site settings from the other plugin (templates, separator, publisher details, social profiles, default share image) are listed beside SEOWard's own, and only the ones you tick are saved.
* WP-CLI: wp seoward import and wp seoward export. Abilities: import-seo.
* The default title separator is now a pipe (|). Sites that chose a separator keep theirs.

= 0.5.3 =
* Sharing: each page, post and category can have its own share title, description and image for Facebook, LinkedIn, X and chat apps (a Social tab in the SEOWard dialog with a link preview, and a Sharing section in the classic box and on term screens). Empty fields share the search title, description and featured image as before.
* Abilities: get-seo and preview-seo show what a page is shared with, and update-seo and bulk-update-seo set share_title, share_description and share_image.

= 0.5.2 =
* Updates: internal builds now update themselves from the OmnisWP update server, under Dashboard > Updates, in Siteward and with WP-CLI. WordPress.org builds leave this out.
* Share images: images Modern Image Formats serves as AVIF or WebP are now swapped for their original JPEG or PNG (the attachment's type said JPEG while the file was AVIF), or left out when there is none.
* Bricks: saving a page in Bricks now clears that page's cache, and saving a Bricks template (header, footer) clears the whole site's, as Bricks' own saves never told the cache plugin.

= 0.5.1 =
* The search preview in the SEOWard dialog is now Google's width and type size, so it wraps where the length meter says.
* Category, tag and other term pages can take a schema page type (an FAQ page, for example) and custom JSON-LD; by default they are collection pages.
* Share images: AVIF and WebP are swapped for their JPEG or PNG copy, or left out when there is none, as Facebook cannot show AVIF.
* Abilities: every change lists the page caches it cleared, a new update-site-identity changes the site title and tagline, term schema in get-seo, preview-seo and update-seo, and warnings about unusable share images.

= 0.5.0 =
* Per-page schema: say what each page is (FAQ page, About, Contact, listing) or what it is about (article, blog post, news, service, product, event, person, business location), fill in that type's fields, or add your own JSON-LD. In the block editor's SEOWard dialog (Schema tab, with a live view of what the page prints) and the classic editor box.
* Each post type has a default schema type on Titles and meta (blog posts by default; pages are web pages).
* Page caches (W3 Total Cache, WP Rocket, LiteSpeed Cache, WP Super Cache, SiteGround, WP Fastest Cache, Breeze) are cleared after SEOWard changes what pages print.
* Every canonical tag is now printed by SEOWard in the same place and format.
* Shares that fall back to the logo use the small card instead of a stretched large one.
* Abilities: per-page schema in get-seo, preview-seo and update-seo, a new get-schema-types, schema types in templates, and clearer setup notes.

= 0.4.0 =
* Social sharing: Open Graph and X card tags from each page's search title, description and image, with a default share image. The theme's own tags (Bricks) are switched off while SEOWard prints; Bricks page SEO and sharing fields are read as fallbacks.
* Sitemaps: WordPress's sitemap now leaves out noindexed post types, taxonomies, author archives and items, and lists when each post last changed.
* Canonicals print on staging sites again: "Discourage search engines" no longer counts as a page being kept out of search.
* Schema logo: images under 112 pixels (such as a favicon) are skipped, and the Schema screen says when there is no usable logo.
* Abilities: names without HTML codes, media counted correctly, the canonical each page really prints, social settings, and the effective schema name and logo.

= 0.3.0 =
* Abilities API: AI assistants connected through any MCP adapter (Siteward MCP, or the official WordPress MCP Adapter) can read and change titles, descriptions, robots, canonicals, templates, site-wide schema and settings, with the same checks as the admin screens.
* Bricks pages: {excerpt} and automatic descriptions now read the text of pages built with Bricks.

= 0.2.0 =
* New Schema screen: who runs the site (organisation, local business with opening hours and areas served, or person), logo, contact details and profiles elsewhere. Every page now prints one JSON-LD graph with the publisher, website, page and breadcrumb trail.
* Block editor: a SEOWard button in the top toolbar opens every option in one dialog, including a live view of the page's schema.

= 0.1.2 =
* Every SEOWard screen and the editor fields now carry a short "How this screen works" guide for screen readers and AI assistants working in the browser, plus machine-readable field data.

= 0.1.1 =
* Noindexed single pages no longer print a canonical link, matching listings.

= 0.1.0 =
* First build: templates, per page and per term fields, block and classic editor, robots and canonical output, other SEO plugin detection, launch check.
