1,
'missing' => 2,
'generated' => 4,
'queued' => 8,
'processing' => 16,
'failed' => 32,
'hidden' => 64,
'auto_queue_disallowed' => 128,
'all' => 256,
'unverified' => 512,
'waiting_to_queue' => 1024,
);
const AI4SEO_POSTS_TO_BE_ANALYZED_OPTION_NAME = '_ai4seo_posts_to_be_analyzed';
const AI4SEO_NOTIFICATIONS_OPTION_NAME = '_ai4seo_notifications';
// Authenticated provenance prevents API metadata from selecting the richer trusted-local HTML policy.
const AI4SEO_NOTIFICATION_MESSAGE_SOURCE_FIELD = 'message_source';
const AI4SEO_NOTIFICATION_MESSAGE_SOURCE_SIGNATURE_FIELD = 'message_source_signature';
const AI4SEO_NOTIFICATION_MESSAGE_SOURCE_LOCAL = 'local';
const AI4SEO_NOTIFICATION_MESSAGE_SOURCE_REMOTE = 'remote';
// Bound repair and mutation retries so persistent concurrency cannot monopolize a request.
const AI4SEO_NOTIFICATION_CAS_MAX_ATTEMPTS = 3;
// Keep general option and post-meta identifiers separate from notification provenance policy.
const AI4SEO_DEBUG_MESSAGES_OPTION_NAME = 'ai4seo_debug_messages';
const AI4SEO_SETTINGS_OPTION_NAME = 'ai4seo_settings';
const AI4SEO_POST_META_GENERATED_DATA_META_KEY = 'ai4seo_generated_data';
const AI4SEO_POST_META_ACTIVE_METADATA_META_KEY = 'ai4seo_active_metadata';
const AI4SEO_POST_META_POST_CONTENT_SUMMARY_META_KEY = 'ai4seo_content_summary';
const AI4SEO_POST_META_RELATED_POST_ID_META_KEY = 'ai4seo_related_post_id';
const AI4SEO_POST_META_ATTACHMENT_CONTEXT_POLICY = 'ai4seo_attachment_context_policy';
const AI4SEO_ATTACHMENT_CONTEXT_MAX_CANDIDATES = 20;
const AI4SEO_ATTACHMENT_CONTEXT_MAX_BYTES = 4194304;
// Keep recovery readers, classifiers, and writers within the same per-post storage bounds.
const AI4SEO_ACTIVE_METADATA_MAX_ROWS = 100;
const AI4SEO_ACTIVE_METADATA_MAX_ROW_BYTES = 65536;
// Entry-level custom instructions are stored separately from generated data and active metadata.
const AI4SEO_POST_META_METADATA_CUSTOM_INSTRUCTIONS_META_KEY = 'ai4seo_metadata_custom_instructions';
const AI4SEO_POST_META_ATTACHMENT_ATTRIBUTES_CUSTOM_INSTRUCTIONS_META_KEY = 'ai4seo_attachment_attributes_custom_instructions';
const AI4SEO_STYLES_HANDLE = 'ai-for-seo-styles';
const AI4SEO_SCRIPTS_HANDLE = 'ai-for-seo-scripts';
const AI4SEO_INJECTION_SCRIPTS_HANDLE = 'ai-for-seo-injection-scripts';
const AI4SEO_STYLES_FILE_NAME = 'ai-for-seo-styles-' . AI4SEO_PLUGIN_VERSION_NUMBER . '.css';
const AI4SEO_SCRIPTS_FILE_NAME = 'ai-for-seo-scripts-' . AI4SEO_PLUGIN_VERSION_NUMBER . '.js';
const AI4SEO_INJECTION_SCRIPTS_FILE_NAME = 'ai-for-seo-alt-text-injection-' . AI4SEO_PLUGIN_VERSION_NUMBER . '.js';
// Keep PHP context validation and the localized JavaScript dispatcher on one stable vocabulary.
const AI4SEO_PRIMARY_ASSET_CONTEXTS = array(
'activation-offer',
'plugin-ui',
'frontend-metadata-editor',
'content-list',
'post-editor',
'external-media',
'plugin-deactivation',
'tos-gate',
);
const AI4SEO_VERY_LOW_CREDITS_THRESHOLD = 10;
const AI4SEO_LOW_CREDITS_THRESHOLD = 40;
const AI4SEO_CUSTOM_PLAN_DISCOUNT = 30; // in percent.
const AI4SEO_DAILY_FREE_CREDITS_AMOUNT = 5;
const AI4SEO_MONEY_BACK_GUARANTEE_DAYS = 14;
const AI4SEO_MAX_LATEST_ACTIVITY_LOGS = 10;
const AI4SEO_BLUE_GET_MORE_CREDITS_BUTTON_THRESHOLD = 100;
const AI4SEO_GIVING_FEEDBACK_CREDITS = 100;
const AI4SEO_GIVING_FEEDBACK_DISCOUNT = 10; // in percent.
const AI4SEO_NEXTGEN_GALLERY_POST_TYPE = 'ai4seo_ngg';
const AI4SEO_TAXONOMY_PROXY_POST_TYPE = 'ai4seo_taxonomy';
const AI4SEO_TAXONOMY_PROXY_SOURCE_META_KEY = '_ai4seo_taxonomy_source';
const AI4SEO_TAXONOMY_PROXY_NAME_META_KEY = '_ai4seo_taxonomy_name';
const AI4SEO_TAXONOMY_PROXY_AVAILABILITY_META_KEY = '_ai4seo_taxonomy_availability';
const AI4SEO_TAXONOMY_PROXY_SYNC_OPTION_NAME = 'ai4seo_taxonomy_proxy_sync_v1';
const AI4SEO_ANALYSIS_ISSUE_OPTION_PREFIX = 'ai4seo_analysis_issue_v1_';
const AI4SEO_ANALYSIS_ISSUE_MIGRATION_OPTION = 'ai4seo_analysis_issue_inventory_v1';
const AI4SEO_ANALYSIS_ISSUE_PAGE_SIZE = 50;
const AI4SEO_TAXONOMY_PROXY_SYNC_CRON_HOOK = 'ai4seo_taxonomy_proxy_sync';
const AI4SEO_TAXONOMY_PROXY_CONTINUATION_CRON_HOOK = 'ai4seo_taxonomy_proxy_sync_continue';
const AI4SEO_TAXONOMY_PROXY_SYNC_BATCH_SIZE = 200;
const AI4SEO_TAXONOMY_PROXY_SYNC_TIME_LIMIT = 10;
const AI4SEO_MAX_DISPLAYABLE_ALREADY_READ_NOTIFICATIONS = 2;
const AI4SEO_ANALYZE_PERFORMANCE_INTERVAL = 7200; // 2h
const AI4SEO_GLOBAL_NONCE_IDENTIFIER = 'ai4seo_ajax_nonce';
// These values form the single-use checkout-return handshake shared by URL generation and validation.
const AI4SEO_PURCHASE_RETURN_QUERY_PARAMETER = 'ai4seo-just-purchased';
const AI4SEO_PURCHASE_RETURN_TOKEN_QUERY_PARAMETER = 'ai4seo_purchase_return_token';
const AI4SEO_PURCHASE_RETURN_TOKEN_OPTION_PREFIX = 'ai4seo_purchase_return_token_';
const AI4SEO_PURCHASE_RETURN_TOKEN_EXPIRY_CRON_HOOK = 'ai4seo_expire_purchase_return_token';
const AI4SEO_PURCHASE_RETURN_TOKEN_TTL_SECONDS = 604800; // 7 days.
// Keep the durable purchase namespace and stable RobHub outcomes shared by AJAX and return handling.
const AI4SEO_CREDIT_PURCHASE_ATTEMPT_OPTION_PREFIX = '_ai4seo_credit_purchase_v1_';
const AI4SEO_CREDIT_PURCHASE_BUSY = 5092601;
const AI4SEO_CREDIT_PURCHASE_EXPIRED = 5092602;
const AI4SEO_CREDIT_PURCHASE_COMPLETED = 5092603;
const AI4SEO_CREDIT_PURCHASE_CONFLICT = 5092604;
const AI4SEO_CREDIT_PURCHASE_PENDING = 5092605;
const AI4SEO_CREDIT_PURCHASE_REJECTED = 5092606;
const AI4SEO_CREDIT_PURCHASE_STORAGE_ERROR = 5092607;
const AI4SEO_CREDIT_PURCHASE_INVALID = 5092608;
const AI4SEO_PAYG_CREDITS_THRESHOLD = 100;
const AI4SEO_ALLOWED_PAYG_STATUS = array( 'idle', 'budget-limit-reached', 'processing', 'payment-pending', 'payment-received', 'payment-failed', 'payment-method-failed', 'error' );
const AI4SEO_SEMAPHORE_MAX_WAIT_SECONDS = 5; // 5 seconds
const AI4SEO_SEMAPHORE_POLL_INTERVAL_SECONDS = .1; // .1 seconds
const AI4SEO_SEMAPHORE_TTL_SECONDS = 30; // 30 seconds
const AI4SEO_POST_TABLE_ANALYSIS_BATCH_SIZE = 10000; // number of posts to analyze per batch.
const AI4SEO_POST_TABLE_ANALYSIS_MAX_EXECUTION_TIME = 2; // maximum execution time in seconds per batch.
const AI4SEO_DASHBOARD_ANALYSIS_MAX_EXECUTION_TIME = 3; // Shared analysis budget per dashboard request.
const AI4SEO_POST_TABLE_ANALYSIS_SLEEP_BETWEEN_RUNS = 100000; // microseconds to sleep between runs.
const AI4SEO_POST_TABLE_ANALYSIS_PROCESSING_TIMEOUT = 90; // seconds.
const AI4SEO_LARGE_SITE_POSTS_THRESHOLD = 50000;
const AI4SEO_LARGE_SITE_ANALYSIS_BATCH_SIZE = 1000;
const AI4SEO_ANALYSIS_RECONCILIATION_BATCH_SIZE = 25;
const AI4SEO_ANALYSIS_RECONCILIATION_RETRY_DELAY = 900;
const AI4SEO_LARGE_SITE_AUTOMATIC_ANALYSIS_INTERVAL = 86400; // 24h
const AI4SEO_DEEP_CONTEXT_SEARCH_POSTMETA_THRESHOLD = 1000000;
const AI4SEO_DEEP_CONTEXT_SEARCH_MAX_TIMEOUTS_PER_CRON_RUN = 3;
// Maximum block counts and their full-analysis quiet periods; larger sites use the daily interval.
const AI4SEO_ANALYSIS_REFRESH_INTERVALS = array(
2 => 0,
10 => 300,
100 => 3600,
);
// Keep neutral SQL date bindings inside MySQL's supported DATETIME range under strict modes.
const AI4SEO_MYSQL_DATETIME_MINIMUM = '1000-01-01 00:00:00';
// Custom instruction limits are tied to subscription status rather than one-off credit balances.
const AI4SEO_CUSTOM_INSTRUCTIONS_FREE_LENGTH_LIMIT = 200;
const AI4SEO_CUSTOM_INSTRUCTIONS_SUBSCRIPTION_LENGTH_LIMIT = 1000;
const AI4SEO_CRON_JOBS_ENABLED = true; // set to true to enable cron jobs, false to disable them.
$GLOBALS['ai4seo_held_semaphores'] = isset( $GLOBALS['ai4seo_held_semaphores'] ) && is_array( $GLOBALS['ai4seo_held_semaphores'] )
? $GLOBALS['ai4seo_held_semaphores']
: array();
$GLOBALS['ai4seo_ajax_nonce'] = '';
const AI4SEO_MAX_EDITOR_INPUT_LENGTHS = array(
'focus-keyphrase' => 128,
'meta-title' => 205,
'meta-description' => 505,
'keywords' => 512,
'facebook-title' => 205,
'facebook-description' => 375,
'twitter-title' => 205,
'twitter-description' => 375,
'title' => 256,
'alt-text' => 390,
'caption' => 256,
'description' => 512,
// Reserve filename capacity here so API-generated names use the same immutable cap registry as editor fields.
'file-name' => 255,
'fallback' => 512,
);
// Mirror API prompt targets for save-time diagnostics; misses stay usable while the hard caps above remain authoritative.
const AI4SEO_GENERATED_OUTPUT_QUALITY_WINDOWS = array(
'metadata' => array(
'meta-title' => array(
'min-length' => 45,
'max-length' => 65,
),
'meta-description' => array(
'min-length' => 130,
'max-length' => 160,
),
'keywords' => array(
'max-items' => 10,
),
'facebook-title' => array(
'min-length' => 45,
'max-length' => 65,
),
'facebook-description' => array(
'min-length' => 90,
'max-length' => 120,
),
'twitter-title' => array(
'min-length' => 45,
'max-length' => 65,
),
'twitter-description' => array(
'min-length' => 90,
'max-length' => 125,
),
),
'attachment_attributes' => array(
'title' => array(
'min-length' => 50,
'max-length' => 80,
),
'alt-text' => array(
'min-length' => 95,
'max-length' => 125,
),
'caption' => array(
'min-length' => 130,
'max-length' => 160,
),
'description' => array(
'min-length' => 180,
'max-length' => 240,
),
'file-name' => array(
'min-length' => 40,
'max-length' => 80,
),
),
);
const AI4SEO_FOCUS_KEYPHRASE_RECOMMENDED_MAX_LENGTH = 30;
const AI4SEO_METADATA_KEYWORDS_RECOMMENDED_MIN_ITEMS = 5;
const AI4SEO_METADATA_KEYWORDS_RECOMMENDED_MAX_ITEMS = 10;
/**
* Return the plugin change log.
*
* @return array[] the change log of the plugin
*/
function ai4seo_get_change_log(): array {
return array(
array(
'date' => '2026-11-05',
'version' => '2.6.2',
'important' => false,
'updates' => array(
'Added a choice of verified source posts for image generation, with automatic context checks and clear feedback when a source is unavailable.',
'Added detailed lists of entries affected by SEO analysis problems, while allowing unaffected content to continue processing.',
'Made analysis preparation, pauses, background updates, and provisional statistics easier to distinguish.',
'Improved filtering and sorting of large content libraries, including clearer messages when a list cannot be loaded.',
'Fixed retrying all failed generations so the affected entries can be processed again.',
'Enabled metadata editing for the first draft of supported public content types.',
'Improved reconnection for eligible free accounts after connection errors.',
'Clarified image-generation settings and the preview of unsaved Keywords changes.',
'Bug Fixes & Maintenance: Fixed 2 minor bugs and addressed 1 security issue.',
),
),
array(
'date' => '2026-10-27',
'version' => '2.6.1',
'important' => false,
'updates' => array(
'Improved handling of large content libraries in filtered lists, title sorting, and SEO Autopilot.',
'Kept completed SEO statistics visible during background updates, with changes to content included before the new results appear.',
'Made large dashboard counts easier to read, with exact values in tooltips and clearer analysis progress, scheduling, and pause messages.',
'Improved recovery from temporary SVG generation outages with clearer explanations and preserved selections for retrying.',
'Fixed product price placeholders in metadata previews and inherited social sharing tags when using WooCommerce with Yoast SEO.',
'Kept metadata editor fields and actions accessible at high browser zoom and in short windows.',
'Fixed an upgrade issue that could leave updates from very old plugin versions unfinished.',
'Updated translations for nine languages and made bundled JavaScript translations available across plugin updates.',
'Bug Fixes & Maintenance: Fixed 2 minor bugs.',
),
),
array(
'date' => '2026-10-17',
'version' => '2.6.0',
'important' => true,
'updates' => array(
'Added metadata editing and generation for category, tag, and public taxonomy archives, with separate SEO coverage and SEO Autopilot selection.',
'Added support for generating image attributes from validated static SVGs while preserving the original media file, including native WordPress media controls.',
'Added email-confirmed license owner changes and license key rotation for eligible accounts, with recovery when a confirmation result is uncertain.',
'Added separate controls for offers, optional notifications, menu counters, and email preferences, with reliable saving and dismissal across admin pages.',
'Improved SEO Autopilot and bulk generation with clearer queue status, retained jobs when data is unavailable, and safer retries after interruptions.',
'Improved metadata and settings editors to preserve unsaved work, explain unavailable data, and recover from conflicting or incomplete saves.',
'Improved account refresh and offer handling so stale account data or expired offers cannot silently replace current information.',
'Improved plugin upgrades with visible progress, safe retries, and preservation of legacy metadata when an update step cannot finish.',
'Improved synchronization with supported SEO plugins and navigation between filtered content entries, with clearer responsive dialogs and keyboard focus.',
'Simplified taxonomy navigation and Credits Pack dialogs, named the processed content types in Autopilot completion messages, and clarified metadata help and notification labels.',
'Bug Fixes & Maintenance: Fixed 8 minor bugs and addressed 1 security issue.',
),
),
array(
'date' => '2026-10-09',
'version' => '2.5.9',
'important' => false,
'updates' => array(
'Improved SEO coverage analysis so unreadable or duplicate generation history no longer stops scans, with clear warnings and affected entries excluded from SEO Autopilot until resolved.',
'Improved account connection recovery to stop repeated unsuccessful setup attempts while preserving valid connections and allowing manual reconnection.',
'Fixed incorrect unsaved-change warnings after saving metadata that WordPress normalizes, while preserving edits made during saving.',
'Clarified where media titles, alt text, captions, and descriptions are saved and when they appear on your website.',
'Made restoring default settings safer by initially focusing Cancel in the confirmation dialog.',
'Bug Fixes & Maintenance: Fixed 2 minor bugs.',
),
),
array(
'date' => '2026-10-04',
'version' => '2.5.8',
'important' => false,
'updates' => array(
'Reduced memory use when analyzing SEO coverage on larger websites.',
'Improved recognition of older generation history so supported saved values can be included in SEO analysis without changing stored content.',
'Fixed clearing custom instructions for multiple selected entries when the text box is left empty.',
'Improved keyboard and screen-reader navigation in metadata and media editors, settings, and media lists, with clearer field warnings and link descriptions.',
'Kept keyboard focus in the Related Media search field after searching or clearing filters.',
'Bug Fixes & Maintenance: Fixed 1 minor bug and implemented 2 performance improvements.',
),
),
array(
'date' => '2026-09-25',
'version' => '2.5.7',
'important' => false,
'updates' => array(
'Improved image generation reliability by using available local image files when preparing image data, with clearer guidance when an image cannot be processed.',
'Improved account connection recovery to avoid repeated unsuccessful recovery attempts while keeping valid connections usable.',
'Improved generation context by removing unfinished page-builder markup from excerpts while preserving readable text.',
'Clarified when complete entries can be included in generation, with overwrite requirements shown directly in Settings and saved preferences retained.',
'Added clear, accessible notices when custom instructions exceed the character limit, including the number of characters removed.',
'Improved keyboard navigation in metadata and media editors, preserved unsaved edits when closing image previews, and added editor links for image context from unpublished content.',
'Bug Fixes & Maintenance: Fixed 3 minor bugs and implemented 1 performance improvement.',
),
),
array(
'date' => '2026-09-18',
'version' => '2.5.6',
'important' => false,
'updates' => array(
'Added recovery options for duplicate or conflicting saved metadata, with explicit choices for conflicting values and protection for unsaved edits.',
'Improved generation context with cleaner visible page content, better Elementor support, and more accurate matching of images to their surrounding text.',
'Added confirmation before overwriting existing metadata or media attributes, showing the affected fields and generation cost.',
'Added dismissal of resolved SEO Autopilot warnings and automatic acknowledgement after successful generation or saving, while retaining activity history.',
'Improved navigation with a Back control in Related Media that preserves parent edits, direct Dashboard links to missing SEO fields, and a shortcut to Deep Search settings.',
'Expanded the Help page post inspector to make saved-data and metadata-recovery problems easier to diagnose.',
'Improved Help headings and custom-instruction tooltips for clearer navigation and accessibility.',
'Bug Fixes & Maintenance: Fixed 1 minor bug and implemented 2 performance improvements.',
),
),
array(
'date' => '2026-09-14',
'version' => '2.5.5',
'important' => false,
'updates' => array(
'Improved SEO coverage displays with details for filled, missing, and excluded fields, clearer completion guidance, and highlighted edit buttons for incomplete entries.',
'Added direct SOOZ editor shortcuts to WordPress Posts, Pages, and Media lists.',
'Added an Account option to request existing license details by checkout email, with clearer help when the email does not arrive.',
'Improved editor guidance for using and saving custom instructions, choosing the default editor view, and understanding generation costs.',
'Improved Help navigation with clearer expandable headings, a dedicated support area, and easier access to useful resources.',
'Updated translations for Arabic, Spanish, French, Italian, Japanese, Dutch, Polish, Portuguese, and Swedish.',
'Bug Fixes & Maintenance: Fixed 3 minor bugs.',
),
),
array(
'date' => '2026-09-11',
'version' => '2.5.4',
'important' => false,
'updates' => array(
'Improved metadata saving with clearer recovery guidance and retained edits when saving or refreshing a connected SEO editor fails.',
'Improved SEO coverage analysis with progress reporting, reliable recovery after interruptions, and accurate history for partially generated entries.',
'Improved image selection in WordPress and Elementor media dialogs so generation controls follow the selected image when opening or reopening a dialog.',
'Improved metadata and media editors on small screens, with clearer guidance for empty fields and shared Facebook and WhatsApp previews.',
'Added a three-step welcome for new installations that stays dismissed and does not reappear on established sites after updates.',
'Added a Help tool to inspect saved generated data when troubleshooting, with readable output for long entries.',
'Bug Fixes & Maintenance: Fixed 2 minor bugs and implemented 1 performance improvement.',
),
),
array(
'date' => '2026-09-08',
'version' => '2.5.3',
'important' => false,
'updates' => array(
'Added Settings search to find options by name or description, including advanced settings, without changing saved preferences.',
'Added Next item and Save & edit next controls to move through metadata and media editors while preserving the selected view and detecting edits reliably.',
'Improved image generation so Auto switches to Data after three successful recoveries from failed image URL requests, while respecting a manually selected upload method.',
'Improved account synchronization and credit checkout recovery so interrupted or repeated requests can resume reliably.',
'Added the site timezone and a live clock to SEO Autopilot date controls, with validation that prevents invalid cutoffs from partially saving settings.',
'Added dashboard guidance explaining which settings exclude entries from refreshed statistics.',
'Added selection counts to bulk actions so you can confirm how many entries will be affected.',
'Bug Fixes & Maintenance: Fixed 4 minor bugs and implemented 1 performance improvement.',
),
),
array(
'date' => 'September 3rd, 2026',
'version' => '2.5.2',
'important' => false,
'updates' => array(
'Improved account recovery and purchase setup so license credentials are refreshed safely and subscription or credit checkout starts more reliably.',
'Added clearer Latest Activity details that show which metadata or media fields were generated, with direct WordPress edit links from content lists.',
'Improved the Metadata Editor so drafts can save manual changes and field removals reliably before publication.',
'Improved Settings and bulk-action controls so actions activate only after meaningful changes and valid selections, with a simpler accessible Advanced Settings toggle.',
'Improved automatic repair of legacy generation queues and saved data so older site state no longer interrupts analysis.',
'Bug Fixes & Maintenance: Fixed 4 minor bugs and addressed 2 security issues.',
),
),
array(
'date' => 'August 26th, 2026',
'version' => '2.5.1',
'important' => false,
'updates' => array(
'Added direct SOOZ metadata-editor controls for Elementor and the WordPress Block Editor, with more reliable initialization for dynamically loaded editor fields.',
'Added AVIF support for media attribute generation, including automatic preparation of compatible image data.',
'Improved media attribute saving and coverage tracking so valid existing image text stays intact and complete entries are recognized reliably.',
'Improved role-based access so permitted editors can use SOOZ only for content they are allowed to edit.',
'Bug Fixes & Maintenance: Fixed 5 minor bugs, implemented 1 performance improvement, and addressed 2 security issues.',
),
),
array(
'date' => 'August 17th, 2026',
'version' => '2.5.0',
'important' => true,
'updates' => array(
'Added preview-first Metadata and Media Attributes editors with responsive Google, social, keyword, accessibility, and media appearance previews, field-specific edit shortcuts, and live quality guidance.',
'Added a setting to choose whether Preview or Editor mode opens by default while preserving Editor mode for existing users.',
'Improved "Generate with SOOZ" controls across the WordPress editor, Media Library, frontend page builders, and supported third-party SEO editors so dynamically loaded fields and frames initialize more reliably.',
'Added AVIF support for media attribute generation by preparing compatible image data automatically.',
'Improved SEO Autopilot with consistent new-versus-existing date filters, clearer paused-state feedback, and contextual descriptions for bulk actions.',
'Changed third-party SEO synchronization on fresh installations to opt-in while preserving existing sites\' current synchronization choices.',
'Improved the Get More Credits flow with reliable on-demand access to subscriptions, credit packs, Pay-As-You-Go, and free-credit options.',
'Improved Help and account experiences with accessible FAQ accordions, direct Help-section links, and WordPress-language-aware account synchronization.',
'Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 2 performance improvements.',
),
),
array(
'date' => 'August 10th, 2026',
'version' => '2.4.3',
'important' => false,
'updates' => array(
'Improved third-party SEO workflows with embedded generation controls, two-way metadata synchronization where supported, template-aware values, and live editor refreshes across Yoast SEO, Rank Math, All in One SEO, SEOPress, Slim SEO, SEO Simple Pack, Squirrly SEO, The SEO Framework, and SEOKEY.',
'Improved metadata generation accuracy for Gutenberg and builder-driven pages by analyzing visible local content and avoiding unrelated fallback text on sparse or structural pages.',
'Strengthened role-based access so permitted editors can generate and manage metadata or media attributes only for content they are allowed to edit.',
'Improved metadata editor usability with live length guidance, missing-keyphrase warnings, clearer accessible actions and navigation, and more reliable saved-state feedback.',
'Removed the legacy Blog2Social integration from the supported compatibility list.',
'Bug Fixes & Maintenance: Fixed 6 minor bugs and addressed 2 security issues.',
),
),
array(
'date' => 'July 29th, 2026',
'version' => '2.4.2',
'important' => false,
'updates' => array(
'Improved media attribute generation reliability by automatically recovering with direct image data when a remote image URL cannot be accessed.',
'Improved dashboard and SEO Autopilot status accuracy and performance with incremental background updates and clearer, accessible progress details.',
'Added sticky section navigation to Settings so longer configuration pages are easier to move through.',
'Bug Fixes & Maintenance: Fixed 8 minor bugs, implemented 2 performance improvements, and addressed 1 security issue.',
),
),
array(
'date' => 'July 24th, 2026',
'version' => '2.4.1',
'important' => false,
'updates' => array(
'Added experimental generation-length sliders for meta titles and descriptions, social metadata, and image alt text, available under Advanced Settings.',
'Added bundled translations for Arabic, Brazilian Portuguese, Dutch, French, Italian, Japanese, Polish, Russian, Spanish, and Swedish.',
'Improved the quality and reliability of generated metadata and media attributes with field-by-field validation and targeted retries for incomplete or unsuitable results.',
'Improved Custom Instructions so compatible preferences are applied without overriding configured languages, field formats, prefixes, suffixes, quality limits, factual accuracy, or safety requirements.',
'Improved usability and accessibility across dashboards, editors, settings, tooltips, notifications, and account controls.',
'Bug Fixes & Maintenance: Improved settings saving and error feedback, dashboard refreshes, frontend alt-text handling, selection controls, notifications, and security checks.',
),
),
array(
'date' => 'July 3rd, 2026',
'version' => '2.4.0',
'important' => true,
'updates' => array(
'Improved media context detection for better image attributes by finding featured images, uploaded child media, WooCommerce variation images, galleries, local image URLs, and media stored by page builders or custom fields.',
'Added Metadata prompt sliders so users can tune tone, keyword intensity, focus keyphrase influence, CTA style, social variation, brand context, and existing-value reference strength.',
'Added Attachment Attributes prompt sliders so users can tune visual tone, surrounding context, file name influence, keyword intensity, recognizable entity handling, brand context, and existing-value reference strength.',
'Added custom instruction fields for global generation behavior, metadata, post types, media attributes, and individual editor entries so users can guide future AI generations more precisely.',
'Added WPML language controls so site owners can exclude specific languages from SOOZ dashboards and SEO Autopilot for metadata or media attributes.',
'Improved image attribute generation reliability by retrying with direct image data when an image URL cannot be accessed.',
'Added an "Auto Queue Entries" setting so SEO Autopilot can either automatically queue applicable entries or process only manually queued entries.',
'Added bulk actions to add selected entries to the queue safely, force regeneration, and remove selected entries from the queue.',
'Added bulk actions to add all related images to the queue, force regeneration for related images, or remove related images from the queue.',
'Improved SOOZ post and media lists with status counts, hidden and waiting queue states, WPML language filters, text search, sortable columns, and bulk queue controls.',
'Improved dashboard and list feedback for SEO Autopilot, including clearer queue, processing, insufficient-credit, and manual-queue status messages.',
'Added a "Related Media" workflow that shows media connected to a post, page, or product.',
'Added a General setting to show SOOZ bulk actions in native WordPress post, page, product, and Media Library tables when needed.',
'Added bulk actions to hide selected entries from SOOZ lists or show hidden entries again.',
'Added bulk actions to exclude selected entries from the Auto Queue feature or allow them again.',
'Added bulk actions to mark selected entries as not generated or delete saved SOOZ metadata.',
'Added a bulk action to set or clear custom instructions for selected posts, pages, products, and media files.',
'Added source hints in the Metadata and Media Attributes editors so users can see whether field values were generated by SOOZ, imported from SEO plugins, or edited afterward.',
'Added editor notices for inactive meta tags and media attributes, including a direct link to the settings that can show them again.',
'Added a Metadata Editor warning when an entry has title or description data but no focus keyphrase, helping users generate related metadata together.',
'Improved settings import/export with JSON files, category selection, preview before import, and clearer feedback for skipped or invalid settings.',
'Improved settings imports from older plugin versions so exported settings are migrated more safely into 2.4.0 prompt controls.',
'Improved the Credits Pack selection flow with recommended packs, cost-per-page and cost-per-image estimates, and a custom-plan prompt for large websites.',
'Improved Pay-As-You-Go setup with clearer budget guidance and an explicit confirmation before enabling automatic refills.',
'Improved billing guidance before plugin deactivation, including warnings that deactivation does not cancel subscriptions or Pay-As-You-Go refills.',
'Bug Fixes & Maintenance: Improved API error messages, strengthened AJAX validation and permission checks, optimized large-site background analysis, and fixed minor UI issues.',
),
),
array(
'date' => 'March 9th, 2026',
'version' => '2.3.0',
'important' => true,
'updates' => array(
'Changed branding from "AI for SEO" to "SOOZ - AI for SEO". Visit sooz.ai for more information.',
'Enhanced the quality of alt text and image attribute generation by incorporating a broader context from the surrounding content, resulting in more accurate descriptions.',
'Performance improvements across multiple areas. The plugin should feel more responsive on large sites.',
'Posts and Media lists now show all languages. Entries are labeled and can be filtered by WPML language.',
'New advanced setting: Toggle frontend cache purging after metadata updates.',
'Added a warning when leaving a page or modal with unsaved changes, on various editors and settings pages.',
'Added a feedback modal on plugin deactivation, so users can share why they are leaving.',
'Added a new "Remove License" button on the account page.',
'Added a new setting "Query IDs Chunk Size": Advanced troubleshooting option to adjust chunk size when processing large amounts of entries. Lower values may reduce database load and fix MySQL-related issues. Higher values can improve performance if your database allows it.',
'Bug Fixes & Maintenance: Fixed 21 minor bugs, implemented 9 usability improvements, implemented 14 performance optimizations, and resolved 13 security issues.',
),
),
array(
'date' => 'November 14th, 2025',
'version' => '2.2.0',
'important' => true,
'updates' => array(
'Changed how Credits are consumed. Credits are now charged per generated field instead of per entry. Use the “Active Meta Tags” and “Active Media Attributes” settings to control which fields are generated and how many Credits each action requires.',
'Added Focus Keyphrase generation, editing, and syncing for Yoast SEO and RankMath.',
'Added Meta Keywords generation, editing, and front-end output.',
'Added WooCommerce price inclusion modes for AI-generated metadata (Never, Fixed Price, Dynamic Price).',
'Added additional “Generate with SOOZ” buttons inside the Gutenberg editor when RankMath is active.',
'Added “Generate with SOOZ” buttons for Focus Keyphrase (Yoast SEO) and Focus Keyword (RankMath) inside their editors.',
'Added a filter bar to the Posts and Media views including SEO-status filters and a text search.',
'Added placeholder support for prefixes and suffixes across all syntaxes ({TITLE}, [TITLE], %%TITLE%% and their placeholder variants).',
'Added a setting to include existing values when generating metadata and media attributes (Basic Plan+).',
'Added a setting to enable enhanced entity recognition for media attributes (Pro Plan+).',
'Added a setting to enable advanced celebrity face recognition for media attributes (Premium Plan+).',
'Added configurable meta tag fallback rules to reuse existing values when no generated data is available.',
'Added a toggle to control JavaScript-based alt text injection separately from render-level injection.',
'Added a troubleshooting toggle to pause database refresh operations during debugging.',
'Added the “Active Meta Tags” setting to control which meta tags the plugin should generate.',
'Added the “Active Post Types” setting to define which post types the plugin should process.',
'Added a reminder and one-click removal option for previously generated SEO-relevant data within the SEO Autopilot modal.',
'Added a “Generate Data for X Empty Fields” button in the Metadata and Media Attribute Editors.',
'Added a “Save & edit next” button in the Metadata and Media Attribute Editors for faster sequential editing.',
'Added a “Retry all failed” quick action to the Dashboard when failed entries are detected.',
'Added Credits badges across the plugin UI to indicate the cost of generation actions.',
'Added an “SEO-Expert Concierge” card to the Dashboard with direct contact options.',
'Submit and Abort buttons are now sticky for easier access during editing.',
'Bug Fixes & Maintenance: Fixed 21 minor bugs, implemented 29 usability improvements, implemented 35 stability improvements, and resolved 8 security issues.',
),
),
array(
'date' => 'August 3rd, 2025',
'version' => '2.1.0',
'important' => true,
'updates' => array(
'Added "Generate with SOOZ" buttons in the media section of the Gutenberg editor, allowing users to generate media attributes directly from the editor.',
'Improved context awareness for pages, posts, and products, especially for content with short text. Ensures AI-generated metadata is more relevant and tailored.',
'Added a setting for render-level alt text injection. This checkbox setting (enabled by default) ensures images always have the correct alt text, even if themes or other mechanisms fail to display it.',
'Added a setting for render-level image title injection. Includes a select input to choose what should be injected as the title attribute: Disabled, Inject image title, Inject alt text (default), Inject caption, or Inject image description.',
'Added a setting to the "SEO Autopilot" modal that allows users to customize the reference time used by the "Generate Metadata for" option. This gives more precise control over how new and old entries are distinguished.',
'Added an "Export/Import" button to the plugin settings, enabling users to export their configuration and import it on another website. Useful for SEO and web agencies managing multiple sites.',
'Added a "Restore Default" button to the plugin settings.',
'Added a "Show/Hide Advanced Settings" toggle in the plugin settings. Some advanced settings are now hidden by default to simplify the interface for most users.',
'Made setting descriptions more concise and user-friendly. Rearranged several settings for improved clarity and usability.',
'Private or pending posts, pages, and attachments are now ignored by the plugin, preventing them from being processed.',
// 'The plugin now indicates posts, pages, and attachments correctly when ignored by the SEO Autopilot, fully respecting the user\'s selection and settings.',
'Improved UX: The SOOZ - AI for SEO sidebar is now sticky on desktop, keeping it visible during page scrolling for easier navigation.',
'Changed how plugin notifications are handled. All notifications are now indicated by a red bubble in the admin menu. Detailed notices can be viewed in the SOOZ - AI for SEO dashboard.',
'Added new notifications:
Insufficient credits balance.
Overview of missing entries to generate.
WPML plugin detected.
SEO Autopilot needing attention.
New major plugin updates.
Ongoing promos and discounts.
And others.
',
'Bug Fixes & Maintenance: Fixed 17 minor bugs, added 6 quality-of-life improvements, implemented 3 performance optimizations, and 2 security updates.',
),
),
array(
'date' => 'March 20th, 2025',
'version' => '2.0.0',
'important' => true,
'updates' => array(
'Complete UI/UX Overhaul: The look, feel, design, layout, and navigation of the plugin have been completely redesigned.',
'Enhanced Mobile Experience: Improved usability and user experience for mobile users.',
'New "Account" Page: Users can now manage their license key directly from this page.',
'Incognito Mode: SEO and web agencies can hide the plugin from other users/admins (available in the new "Account" page).',
'White-Label Feature: SEO and web agencies can rebrand the plugin with their own name or further hide it from other users/admins (available in the new "Account" page).',
'Customizable Generator Hints: Added a setting to modify or disable generator hints in the source code for additional privacy (available in the "Account" page).',
'Privacy & Data Policy Update: Moved to the new "Account" page.',
'New Metadata Customization Options: Added settings to apply prefixes and suffixes to metadata and media attributes.',
'Advanced Media Attribute Control: New setting allows users to specify which media attributes the plugin should use.',
'"SEO Autopilot" Feature: Replaces bulk generation checkboxes with a more intuitive and easy-to-use interface, directly accessible from the dashboard.',
'"Recent Activity" Dashboard Section: Track all manual and automatic metadata and media attribute generations in one place.',
'Implemented new ways to get credits:
* Introduced Credit Packs, allowing users to purchase additional credits as needed.
* Added a Pay-As-You-Go option for automatic credit refills when running low.
* All credit purchasing options are now combined in a "Get more Credits" modal, accessible from the dashboard.
Enter your own focus keyphrase or generate one with SOOZ before generating the meta title and meta description. SOOZ uses the keyphrase as guidance when generating those fields. Changing the keyphrase alone does not update existing titles or descriptions. You can also generate all fields together.', 'ai-for-seo' ),
'api-identifier' => 'focus_keyphrase',
'flat-credits-cost' => 2,
),
'meta-title' => array(
'name' => esc_html__( 'Meta Title', 'ai-for-seo' ),
'icon' => 'globe',
'input' => 'textarea',
'hint' => __( 'Best Practice: A unique and concise title for this entry, used for the browser tab and as your preferred search-result title. Search engines such as Google may display a different title based on page content and other signals. A clear title helps users understand your content.
The recommended natural quality window is 45 to 65 characters. Your active Generation Length setting may use a different target.
The meta title is added to the title tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_title',
'output-tag-type' => 'title',
'output-tag-identifier' => '',
'meta-tag-regex' => '/(.*?)<\/title>/is',
'meta-tag-regex-match-index' => 1,
'flat-credits-cost' => 1,
),
'meta-description' => array(
'name' => esc_html__( 'Meta Description', 'ai-for-seo' ),
'icon' => 'globe',
'input' => 'textarea',
'hint' => __( 'Best Practice: A compelling and relevant summary of your page or post, which search engines may use as the description beneath the search-result title. Google may show a different snippet from your page content depending on the search query. A clear description helps users understand your content and decide whether to visit your page.
The recommended natural quality window is 130 to 160 characters. Your active Generation Length setting may use a different target.
The meta description is added to the meta description tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_description',
'output-tag-type' => 'meta name',
'output-tag-identifier' => 'description',
'meta-tag-regex' => '/]*name=(["\'])description\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 2,
),
'keywords' => array(
'name' => esc_html__( 'Keywords', 'ai-for-seo' ),
'icon' => 'hashtag',
'input' => 'textarea',
'hint' => __( 'Best Practice: Provide a concise, comma-separated list of up to 10 relevant keywords for compatibility with tools and content consumers that still read this field. Focus on specific phrases that describe the content and avoid duplicates or keyword stuffing.
Google Search does not use the meta keywords tag for web ranking.', 'ai-for-seo' ),
'api-identifier' => 'meta_keywords',
'output-tag-type' => 'meta name',
'output-tag-identifier' => 'keywords',
'meta-tag-regex' => '/]*name=(["\'])keywords\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 1,
),
'facebook-title' => array(
'name' => esc_html__( 'Facebook Title', 'ai-for-seo' ),
'icon' => 'square-facebook',
'input' => 'textarea',
'hint' => __( 'Best Practice: This field provides the preferred headline for link previews when your content is shared on Facebook. The final preview may differ.
The recommended natural quality window is 45 to 65 characters. Your active Generation Length setting may use a different target.
The Facebook title is added to the og:title tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_facebook_title',
'output-tag-type' => 'meta property',
'output-tag-identifier' => 'og:title',
'meta-tag-regex' => '/]*property=(["\'])og:title\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 1,
),
'facebook-description' => array(
'name' => esc_html__( 'Facebook Description', 'ai-for-seo' ),
'icon' => 'square-facebook',
'input' => 'textarea',
'hint' => __( 'Best Practice: This field provides the preferred summary for link previews when your content is shared on Facebook. The final preview may differ.
The recommended natural quality window is 90 to 120 characters. Your active Generation Length setting may use a different target.
The Facebook description is added to the og:description tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_facebook_description',
'output-tag-type' => 'meta property',
'output-tag-identifier' => 'og:description',
'meta-tag-regex' => '/]*property=(["\'])og:description\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 1,
),
'twitter-title' => array(
'name' => esc_html__( 'Twitter/X Title', 'ai-for-seo' ),
'icon' => 'square-twitter-x',
'input' => 'textarea',
'hint' => __( 'Best Practice: This field provides the preferred headline for link previews when your content is shared on Twitter/X. The final preview may differ.
The recommended natural quality window is 45 to 65 characters. Your active Generation Length setting may use a different target.
The Twitter/X title is added to the twitter:title tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_twitter_title',
'output-tag-type' => 'meta name',
'output-tag-identifier' => 'twitter:title',
'meta-tag-regex' => '/]*name=(["\'])twitter:title\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 1,
),
'twitter-description' => array(
'name' => esc_html__( 'Twitter/X Description', 'ai-for-seo' ),
'icon' => 'square-twitter-x',
'input' => 'textarea',
'hint' => __( 'Best Practice: This field provides the preferred summary for link previews when your content is shared on Twitter/X. The final preview may differ.
The recommended natural quality window is 90 to 125 characters. Your active Generation Length setting may use a different target.
The Twitter/X description is added to the twitter:description tag of your website.', 'ai-for-seo' ),
'api-identifier' => 'meta_twitter_description',
'output-tag-type' => 'meta name',
'output-tag-identifier' => 'twitter:description',
'meta-tag-regex' => '/]*name=(["\'])twitter:description\1[^>]*content=(["\'])(.*?)\2[^>]*>/i',
'meta-tag-regex-match-index' => 3,
'flat-credits-cost' => 1,
),
)
);
define(
'AI4SEO_ATTACHMENT_ATTRIBUTES_DETAILS',
array(
'title' => array(
'name' => esc_html__( 'Title', 'ai-for-seo' ),
'icon' => 'headline',
'mime-type-restrictions' => array(),
'input-type' => 'textarea',
'hint' => __( 'Best Practice: Use a descriptive title to organize and find this item in the WordPress Media Library. This field changes the WordPress media title. The image filename stays unchanged.
Whether the title appears on your website depends on your theme and plugins. SOOZ - AI for SEO can also use it for the HTML image title attribute according to your image-title injection setting.
The AI aims to generate an image title within a natural quality window of 50 to 80 characters.', 'ai-for-seo' ),
'api-identifier' => 'image_title',
'flat-credits-cost' => 1,
),
'alt-text' => array(
'name' => esc_html__( 'Alt Text', 'ai-for-seo' ),
'icon' => 'code',
'mime-type-restrictions' => array(
'image/jpeg',
'image/gif',
'image/png',
'image/bmp',
'image/tiff',
'image/webp',
'image/avif',
'image/x-icon',
'image/heic',
),
'input-type' => 'textarea',
// phpcs:ignore -- Keep this translated registry entry aligned with the neighboring field declarations.
'hint' => __( 'Best Practice: An informative and clear alt text for your image that describes its content and function. This text is used by screen readers to assist visually impaired users and is displayed in place of the image if it cannot be loaded. It also contributes to SEO by providing context to search engines.
This field saves alt text in the WordPress Media Library. Whether it appears in an image\'s HTML alt attribute depends on how your theme or page builder uses that value. Images already inserted into pages can keep their own alt text. If the saved text is missing on your website, review the Alt Text Injection setting under Troubleshooting & Experimental.', 'ai-for-seo' ),
'api-identifier' => 'image_alt_text',
'flat-credits-cost' => 2,
),
'caption' => array(
'name' => esc_html__( 'Caption', 'ai-for-seo' ),
'icon' => 'subtitle',
'mime-type-restrictions' => array(),
'input-type' => 'textarea',
'hint' => __( 'Best Practice: A brief and engaging caption for your image that provides additional context or credit information. Captions are typically displayed below the image on your website and can help enhance user engagement and provide useful information.
The AI aims to generate a caption within a natural quality window of 130 to 160 characters.
This field saves the caption in the WordPress Media Library. Whether it appears below an image on your website depends on the image block, theme or plugin using the caption. Saving it here does not guarantee a visible caption wherever the image appears.', 'ai-for-seo' ),
'api-identifier' => 'image_caption',
'flat-credits-cost' => 1,
),
'description' => array(
'name' => esc_html__( 'Description', 'ai-for-seo' ),
'icon' => 'subtitles',
'mime-type-restrictions' => array(),
'input-type' => 'textarea',
'hint' => __( "Best Practice: A detailed and informative description of your image, which helps users understand the image's content and context. This description is particularly useful for internal reference and can aid in organizing and managing your media library.
The AI aims to generate a description within a natural quality window of 180 to 240 characters.