Blog Sync for WeblySEO - Full Changelog
========================================

For the current version's changelog, see readme.txt. This file holds the
complete release history.

= 1.4.13 =
* Compliance: Updated "Tested up to" WordPress version to 7.0.

= 1.4.12 =
* Compliance: Removed custom CSS field and related sanitization to enforce secure hardcoded CSS for the license overlay.
* Compliance: Removed dead link to Unsplash API terms.

= 1.4.11 =
* Compliance: Added `phpcs:ignore` annotations on the webhook `php://input` read with an inline comment clarifying it is a local PHP request-body stream (not a remote URL — `wp_remote_get` is not applicable).
* Compliance: Expanded webhook nonce-bypass comment to clarify that WordPress nonces are browser-session tokens and do not apply to server-to-server endpoints authenticated by a shared secret.
* Documentation: Added Unsplash to the readme External Services section — explains that stock images supplied by WeblySEO are hotlinked from Unsplash CDN per Unsplash API Terms (images must be served from their CDN for attribution tracking).

= 1.4.10 =
* Fix: Unsplash URLs are never copied into the Media Library (admin "Publish" HTML extraction, `[PHOTO:…]` placeholders, and webhook payloads). Hotlink only — matches Unsplash license; global `downloadPhotos` and per-image `shouldDownload` do not apply to Unsplash.
* Fix: Webhook image rows cannot sideload Unsplash even if `shouldDownload` is true; low-level sideload rejects `unsplash.com` URLs.
* Fix: Content URL swap after `process_images` used a non-existent top-level `images[].url`; webhook payloads nest the URL under `images[0].url`. Post body updates to attachment URLs so Media Library files match the HTML.
* Fix: `weblyseo_blog_sync_image_slot_url` treats plain string entries as URLs; `process_images` initializes `suggestedFileName` for non-array rows (avoids undefined variable).

= 1.4.9 =
* Change: Webhook `process_images` only sideloads remote http(s) images; data URI / base64 decoding removed (WeblySEO sends hosted URLs).
* Change: When global image download is disabled, sideload is skipped for all images (no data-URI exception).
* Improvement: Clearer skip-path logging when image payload is a plain URL string.

= 1.4.7 =
* Maintenance: Remote image downloads use `wp_remote_get()` and `WP_Filesystem` instead of cURL and direct PHP file handles (WordPress coding standards).
* Maintenance: `readme.txt` stable tag kept in sync with the plugin header version.

= 1.4.3 =
* Maintenance: Content API client limited to endpoints the plugin actually uses (test connection, drafts list, single draft, CMS done, WordPress post id).
* Maintenance: Removed unused admin AJAX handlers and unused script localization payload; removed unused language helper include.
* Documentation: Refreshed `readme.txt` (description, workflow, FAQ, external services) to match current behavior.

= 1.4.2 =
* Feature: Full support for domain-isolated physical image storage paths.
* Improvement: Optimized webhook pipeline to prioritize physical asset URLs over Base64 data.
* Fix: Recursive file extension sanitization to prevent double-extension bugs (e.g., .jpg.jpg).
* Performance: Reduced webhook payload size by eliminating embedded image data.

= 1.4.1 =
* Fix: Preserve existing WordPress blog history when syncing new WeblySEO posts.
* Fix: Match updates by `cmsPostId` / CMS post ID before creating a new WordPress post.
* Fix: Handle structured CMS identifiers safely so unrelated posts are not overwritten.
* Improvement: Store legacy draft tracking metadata for reliable future matching.

= 1.4.0 =
* Feature: Added full compatibility for Rank Math SEO alongside Yoast SEO.
* Feature: Added support for Focus Keyword synchronization.
* Feature: Added FAQ Schema synchronization for improved rich snippet visibility.
* Feature: Added Robots Meta (index/noindex, follow/nofollow) synchronization.
* Feature: Added SEO Score tracking in WordPress post meta.
* Improvement: Enhanced metadata mapping for social media (OpenGraph/Twitter) previews.

= 1.3.1 =
* Compliance: Standardized all global variables and classes with strict prefixing.
* Compliance: Fixed all translatable string placeholders for official directory standards.
* Security: Implemented Browser Autofill prevention for sensitive API credentials.
* Security: Hardened all admin-side URL parameter processing with proper sanitation.
* Cleanup: Removed legacy assets and non-permitted hidden files.

= 1.2.2 =
* Fix: Resolved branding inconsistencies and merge conflicts in core files.
* Fix: Standardized class names and option keys.
* Improvement: Enhanced stability of the webhook and API synchronization pipeline.

= 1.2.1 =
* Rebrand: Complete transition to "Blog Sync for WeblySEO" for compliance.
* Slug: Standardized plugin slug to weblyseo-blog-sync.
* Compliance: Updated plugin headers and ownership metadata to meet WordPress.org requirements.
* Feature: Added automatic settings migration from legacy versions.
* Improvement: Deep refactoring of AJAX actions and nonces for improved consistency.
* UI: Updated admin menu title to "WeblySEO Sync" for better visibility.

= 1.2.0 =
* Major: Complete plugin rebranding to WeblySEO Blog Sync.
* Refactor: Updated all internal class names and constants to use WeblySEO namespace.
* Refactor: Standardized all database options and table names for the new brand.
* Optimization: Isolated and reorganized Javascript localization for better performance and reliability.
* Security: Hardened internal data handling and updated all security nonces.

= 1.1.5 =
* Compliance update: Refactored all inline assets into external files.
* UI: Updated branding strings and refined enqueuing logic.

= 1.1.4 =
* Feature: Enhanced image handling to prioritize AI-suggested SEO filenames during download.
* Feature: Improved attachment metadata mapping (Title and Alt Text) based on AI suggestions.
* Optimization: Unified image naming strategy with Core AI platform.

= 1.1.3 =
* Fix: Changed license overlay default to disabled in compliance with WordPress directory guidelines.
* Fix: Improved draft title display logic.
* Feature: Enhanced documentation and detailed functionality descriptions.

= 1.1.2 =
* Fix: Minor UI updates and synchronization patches.

= 1.0.0 =
* Initial release.


Full Upgrade Notice History
============================

= 1.4.12 =
Compliance: Removed custom CSS option for license overlay to improve security. Fixed Unsplash terms URL. Recommended for all sites.

= 1.4.11 =
Compliance: phpcs ignore annotations for webhook secret auth and php://input stream; Unsplash external service documented in readme. Recommended for all sites.

= 1.4.10 =
Fix: Unsplash hotlink-only, webhook image URL replacement in post HTML, and related media handling. Recommended for all sites.

= 1.4.9 =
Webhook image sideload expects https URLs from WeblySEO; embedded data/base64 images are no longer processed. Recommended for all sites.

= 1.4.7 =
Maintenance: remote image download uses WordPress HTTP and Filesystem APIs for directory compliance. Recommended for all sites.

= 1.4.3 =
Maintenance release: leaner Content API client, fewer admin-ajax endpoints, updated readme. Recommended for all sites.

= 1.4.2 =
Enhanced media handling for domain-isolated physical image storage. Optimized webhook processing for local asset hosting.

= 1.4.1 =
Fixes WordPress post versioning during sync. Existing posts are updated by CMS post ID while older posts remain untouched.

= 1.3.1 =
Official directory compliance version. Fully audited prefixing, sanitized translations, and hardened security.

= 1.2.2 =
Consistency and stability update. Unified branding to "Blog Sync for WeblySEO" and resolved structural conflicts.

= 1.2.1 =
Rebrand: Complete transition to "Blog Sync for WeblySEO" for compliance.

= 1.2.0 =
Major rebranding update. The plugin has been completely transitioned to the WeblySEO brand. This includes internal code refactoring, updated namespace, and improved security. Recommended for all users.
