== Changelog == = 1.0.1 = _Release date: 2026-03-05_ **Compatibility** * Confirmed compatibility with WordPress 7.0. Supported range is now WordPress 6.7 – 7.0. **Tests** * PHP_CodeSniffer: 3.13.5 * WordPress Coding Standards: 3.3.0 * PHPCompatibility: 9.3.5 = 1.0.0 = _Release date: 2026-02-18_ **Highlights** * Initial stable release of OpenGraph (by ROBOTSTXT). * Outputs a complete set of Open Graph and Twitter Card meta tags, with automatic detection of incompatible image formats (AVIF, WebP, GIF, BMP, SVG, TIFF) and HTTP-based resolution of JPEG/PNG alternatives. **Added** * Full Open Graph meta tag output: `og:title`, `og:type`, `og:url`, `og:description`, `og:site_name`, `og:locale`, `og:image`, `og:image:width`, `og:image:height`, `og:image:type`, `og:image:alt`. * Article-specific tags for singular posts: `article:published_time`, `article:modified_time`, `article:section`, `article:tag`. * Twitter Card meta tag output: `twitter:card`, `twitter:site`, `twitter:image`. * Direct tag injection via `wp_head` when no SEO plugin is active. * Yoast SEO integration via `wpseo_opengraph_image` filter. * RankMath integration via `rank_math/opengraph/facebook/og_image` filter. * Automatic format detection for AVIF, WebP, GIF, BMP, SVG, and TIFF featured images. * HTTP HEAD-based resolution of compatible JPEG/PNG alternatives. * Postmeta caching (`_og_image_fallback_url`) with automatic invalidation when the featured image is changed or removed. * Negative caching via transients (1-hour TTL) to avoid repeated failed HEAD requests. * Global fallback image URL setting (Settings > OpenGraph). * Homepage-specific image URL setting (Settings > OpenGraph). * Image URL validation at save time: incompatible formats are auto-resolved to JPEG/PNG; invalid or unresolvable URLs are rejected with an admin notice. * Twitter/X site handle setting for the `twitter:site` meta tag. * Per-post Open Graph overrides: custom title and description via meta box in the post editor. * Taxonomy archive image support via `robotstxt_og_taxonomy_image` filter. * Admin settings page (Settings > OpenGraph) with three tabs: Settings, Tools, Diagnostics. * Tools tab: Clear All Caches, Re-resolve All Images, Plugin Information. * Diagnostics tab: statistics (cached count, coverage), URL tester with HTTP header display, paginated cached entries table with per-row clear action. * WP-CLI command `wp og-fallback resolve` with `--all`, `--dry-run`, `--post-type` options. * WP-CLI command `wp og-fallback clear-cache` with `--all` and `--dry-run` options. * REST API: `POST /wp-json/robotstxt-og/v1/resolve/{post_id}` and `GET /wp-json/robotstxt-og/v1/status/{post_id}`. * Developer filters: `robotstxt_og_external_image_enabled`, `robotstxt_og_external_image_timeout`, `robotstxt_og_taxonomy_image`, `robotstxt_og_enable_logging`. * Auto-updater integration via Gitea (`robotstxt-updater.php`). * Full internationalization (text domain: `robotstxt-og`, POT file included). Spanish (es_ES) translation included. * `uninstall.php` with optional data deletion on plugin removal (opt-in, off by default). * Multisite compatible with per-site configuration. **Security** * Nonce verification on all forms and state-changing GET actions. * `manage_options` capability check on all admin pages, REST endpoints, and WP-CLI commands. * Input sanitization via WordPress APIs (`sanitize_key`, `sanitize_text_field`, `esc_url_raw`, `filter_input`) throughout. * Output escaping on all dynamic HTML (`esc_html`, `esc_attr`, `esc_url`, `absint`). * Prepared statements (`$wpdb->prepare()`) for all raw database queries; no direct SQL writes. * CSRF protection on all state-changing actions via `wp_nonce_url` / `wp_verify_nonce`. * HTTP requests use `wp_remote_head()` with configurable timeout — no `file_get_contents` or `curl` directly. **Compatibility** * WordPress: 6.7 - 6.9 * PHP: 8.2 - 8.5 * WP-CLI: 2.x * MariaDB: 10.6+ **Tests** * PHP_CodeSniffer: 3.13.5 * WordPress Coding Standards: 3.3.0 * PHPCompatibility: 9.3.5