{"id":272974,"date":"2026-01-13T14:47:29","date_gmt":"2026-01-13T14:47:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/saec-seo\/"},"modified":"2026-01-13T15:27:59","modified_gmt":"2026-01-13T15:27:59","slug":"saec-seo","status":"publish","type":"plugin","link":"https:\/\/tah.wordpress.org\/plugins\/saec-seo\/","author":20972369,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.4.11","stable_tag":"1.1.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"SAEC SEO","header_author":"SAEC Holding","header_description":"SEO audits, scoring, and XML sitemap.","assets_banners_color":"","last_updated":"2026-01-13 15:27:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/saec.me","rating":0,"author_block_rating":0,"active_installs":0,"downloads":287,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"saec","date":"2026-01-13 15:27:59"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2994,253908,186,4574],"plugin_category":[55],"plugin_contributors":[253909],"plugin_business_model":[],"class_list":["post-272974","plugin","type-plugin","status-publish","hentry","plugin_tags-metadata","plugin_tags-saec","plugin_tags-seo","plugin_tags-wp-cli","plugin_category-seo-and-marketing","plugin_contributors-saec","plugin_committers-saec"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/saec-seo.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>SAEC SEO provides read-only SEO audit, SEO override fields, optional SEO logs, and WP-CLI tooling for operational workflows.<\/p>\n\n<p>Company information:\n- SAEC Holding\n- https:\/\/saec.me\n- info@saec.me<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin can connect to Google Search Console using Google APIs if (and only if) an administrator enables the feature and completes the OAuth authorization flow.<\/p>\n\n<ul>\n<li>Service: Google Search Console API (Google APIs)<\/li>\n<li>Purpose: retrieve Search Analytics metrics (pages, clicks, impressions, CTR, position) to display inside WordPress.<\/li>\n<li>When data is sent: only when you click \u201cConnect\u201d \/ \u201cPull\u201d in the Search Console tab (manual action).<\/li>\n<li>Data sent to Google: your configured property URL (site URL) and the selected date range\/row limit used for the Search Analytics request.<\/li>\n<li>Data stored locally: OAuth token data is stored in a WordPress option; retrieved metrics are cached in WordPress options for display\/export.<\/li>\n<\/ul>\n\n<p>Relevant policies:\n* Google API Services User Data Policy: https:\/\/developers.google.com\/terms\/api-services-user-data-policy\n* Google APIs Terms of Service: https:\/\/developers.google.com\/terms\n* Google Privacy Policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GNU General Public License v2 or later.<\/p>\n\n<h3>More Features<\/h3>\n\n<p>A non-limited edition is available from the editor website: https:\/\/saec.me\/suite-saec<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to \/wp-content\/plugins\/ or install via ZIP upload.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>2.4.10<\/h4>\n\n<ul>\n<li>Admin: redesigned Sitemap tab layout (WP-native cards\/grid).<\/li>\n<\/ul>\n\n<h4>2.4.8<\/h4>\n\n<ul>\n<li>Remove all remaining Pro\/Agency limitation references and related settings.<\/li>\n<li>Remove WP-CLI integration from WP.org build.<\/li>\n<li><p>Remove bundled translation files (handled by WordPress.org translation system).<\/p><\/li>\n<li><p>2.3.1<\/p><\/li>\n<li>Fix: strict tab-save sanitization against defaults schema; avoid processing entire $_POST\/$_REQUEST.<\/li>\n<li>Fix: admin assets use wp_register_* + wp_enqueue_*; nonce action aligned with save endpoint.<\/li>\n<li>Fix: remove HTML-wrapped translation string in Help tab; add missing translators comments.<\/li>\n<li><p>Fix: additional wp_unslash\/sanitize handling for editor AJAX saves.<\/p><\/li>\n<li><p>2.3.0<\/p><\/li>\n<li>Fix: load admin CSS\/JS via wp_register_* and wp_enqueue_*; move inline CSS to enqueued stylesheet.<\/li>\n<li>Fix: add nonce and capability checks; sanitize\/validate inputs; escape output for key admin\/front-end renders.<\/li>\n<li>Fix: secure SQL queries with $wpdb-&gt;prepare() and escaped allowlisted table names.<\/li>\n<li>Fix: remove direct file writes for robots\/sitemap actions; use dynamic generation.<\/li>\n<li>Docs: document Google Search Console external service usage.<\/li>\n<\/ul>\n\n<h4>2.2.4<\/h4>\n\n<ul>\n<li>Add a small in-plugin (settings page only) link to SAEC SEO information.<\/li>\n<li>Fix admin permission message string.<\/li>\n<\/ul>\n\n<h4>2.2.2<\/h4>\n\n<ul>\n<li>Rebuilt Help tab: exhaustive documentation of all plugin features (fully translatable).<\/li>\n<\/ul>\n\n<h4>2.2.1<\/h4>\n\n<ul>\n<li>WordPress.org: remove runtime translation generation; ship compiled .mo files.<\/li>\n<li>Admin: load assets only on SAEC SEO admin page.<\/li>\n<li>Readme: Tested up to 6.9.<\/li>\n<\/ul>\n\n<h4>2.1.9<\/h4>\n\n<ul>\n<li>Fix: Scores \"Quick fix\" button now triggers AJAX action and shows status\/log.<\/li>\n<\/ul>\n\n<h4>2.1.8<\/h4>\n\n<ul>\n<li>System alerts: optional orphan pages threshold triggers an email notification.<\/li>\n<li>Fix: orphan scan suggestions query now uses a defined post type list (prevents PHP notices).<\/li>\n<\/ul>\n\n<h4>2.1.7<\/h4>\n\n<ul>\n<li>System: orphan hints now include inbound\/depth and suggested internal link sources.<\/li>\n<li>Admin: improved orphan list rendering.<\/li>\n<\/ul>\n\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>Fix: prevent fatal by implementing Runtime::filter_wp_sitemaps_enabled() (used to disable WordPress core sitemaps when configured).<\/li>\n<li>UI: Dashboard layout updated (key blocks now span full width where appropriate; improved spacing).<\/li>\n<\/ul>\n\n<h4>2.1.5<\/h4>\n\n<ul>\n<li>Sitemap: option to disable WordPress core sitemap (wp-sitemap.xml) and use SAEC sitemap only.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>System: improved orphan page detection (internal links extraction + inbound count + approximate depth from menus).<\/li>\n<li>Export: system scan JSON\/CSV and Search Console snapshots\/deltas export.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>UI: wider admin container for clearer 50\/50 grid on the Dashboard.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Add: system alerts (HTTP errors\/latency thresholds) with email notifications and cooldown.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Fix: register admin-post action for \u201cRun system scan\u201d.<\/li>\n<li>Add: daily systemic scan cron.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Add: System tab (basic) with local-only systemic SEO checks (HTTP availability for key endpoints, orphan page hints, SAEC Perf bridge presence).<\/li>\n<li>Add: Manual \u201cRun system scan\u201d action storing last results (UTC timestamp).<\/li>\n<\/ul>\n\n<h4>2.0.10<\/h4>\n\n<ul>\n<li>Fix: PHP fatal \"Multiple access type modifiers\" (removed stray orphan modifier before render_tab_sitemap).<\/li>\n<\/ul>\n\n<h4>2.0.9<\/h4>\n\n<ul>\n<li>Fix: add missing render_tab_sitemap() to prevent fatal when opening Sitemap tab.<\/li>\n<\/ul>\n\n<h4>2.0.8<\/h4>\n\n<ul>\n<li>Fix: remove stray tokens in admin class that could break admin rendering.<\/li>\n<li>Fix: ensure AJAX save handler is a proper class method.<\/li>\n<li>Sitemap: add transient cache for sitemap responses (configurable TTL).<\/li>\n<li>Sitemap: exclude password-protected content from sitemap.<\/li>\n<\/ul>\n\n<h4>2.0.7<\/h4>\n\n<ul>\n<li>Fix: admin settings save fallback via admin-post.php when admin-ajax.php returns 400.<\/li>\n<li>UI: Automation + Redirects forms switched to POST fallback while keeping AJAX when available.<\/li>\n<li>Add: Sitemap tab (URLs, settings, rebuild).<\/li>\n<\/ul>\n\n<h4>2.0.6<\/h4>\n\n<ul>\n<li>Fix: PHP parse error in includes\/class-db.php (activation rewrite hook).<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Fix: removed extra closing tags causing WordPress footer to appear mid-page (Automation \/ Redirects tabs).<\/li>\n<li>Fix: Automation tab settings now save (AJAX tab key supported).<\/li>\n<li>Fix: Run-now AJAX uses correct parameter (run) and supports existing buttons.<\/li>\n<li>UI: Two-column admin layout on all tabs except Scores.<\/li>\n<li>i18n: force plugin-generated MO file (from shipped PO) to avoid mojibake when third-party translation files exist.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Add: Google Search Console OAuth (connect\/disconnect) and API pull for page metrics.<\/li>\n<li>Add: Search Console settings (Client ID\/Secret, property, days, row limit) with AJAX save.<\/li>\n<li>Fix: i18n robustness \u2014 .mo files rebuilt from .po at runtime (removed packaged .mo to avoid mojibake).<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fix: admin.js restored as real JavaScript (AJAX save\/run).<\/li>\n<li>Fix: .mo recompiled from .po (UTF-8) to remove mojibake.<\/li>\n<li>Fix: Automation tab markup (removed stray closing label).<\/li>\n<li>Improvement: clearer AJAX error handling.<\/li>\n<\/ul>\n\n<h4>1.9.5<\/h4>\n\n<ul>\n<li>Add: Regression detection (local baseline) via daily job and history\/log entries.<\/li>\n<li>Add: Settings for regression scan scheduling and score-drop threshold.<\/li>\n<\/ul>\n\n<h4>1.9.4<\/h4>\n\n<ul>\n<li>Packaging: repackaged release (new ZIP).<\/li>\n<li>Version: bump to 1.9.4.<\/li>\n<\/ul>\n\n<h4>1.9.3<\/h4>\n\n<ul>\n<li>Fix: i18n \u2013 recompiled all .mo files from .po (UTF-8) to prevent mojibake in admin UI.<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>Fix: i18n \u2013 regenerated .mo files from .po and completed missing admin strings translations.<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Fix: PHP fatal error (duplicate access modifier) in SEO logs.<\/li>\n<li>Fix: WP-CLI audit argument parsing.<\/li>\n<li>Add: WP-CLI command <code>saec-seo gsc list<\/code>.<\/li>\n<li>Add: WP-CLI command <code>saec-seo logs purge<\/code> (with --dry-run).<\/li>\n<li>Add: readme.txt with GPLv2 or later reference and SAEC Holding information.<\/li>\n<\/ul>","raw_excerpt":"Automatic SEO management for WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/272974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=272974"}],"author":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/saec"}],"wp:attachment":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=272974"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=272974"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=272974"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=272974"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=272974"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=272974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}