{"id":280104,"date":"2026-02-18T14:50:11","date_gmt":"2026-02-18T14:50:11","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/recognyze-ai\/"},"modified":"2026-05-26T13:52:26","modified_gmt":"2026-05-26T13:52:26","slug":"recognyze-client","status":"publish","type":"plugin","link":"https:\/\/cor.wordpress.org\/plugins\/recognyze-client\/","author":23447680,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.52","stable_tag":"1.3.52","tested":"6.9.4","requires":"5.0","requires_php":"7.0","requires_plugins":null,"header_name":"Recognyze.AI","header_author":"Recognyze.AI","header_description":"Dashboard for managing posts and submitting them to an external API. Your content powers AI \u2013 earn from it. Register your site, track AI usage and set your fee.","assets_banners_color":"","last_updated":"2026-05-26 13:52:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.recognyze.ai\/publishers\/wordpress\/","header_author_uri":"https:\/\/recognyze.ai","rating":0,"author_block_rating":0,"active_installs":0,"downloads":478,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.47":{"tag":"1.3.47","author":"recognyze","date":"2026-02-24 12:12:05"},"1.3.48":{"tag":"1.3.48","author":"recognyze","date":"2026-02-24 12:15:45"},"1.3.49":{"tag":"1.3.49","author":"recognyze","date":"2026-03-20 22:11:16"},"1.3.50":{"tag":"1.3.50","author":"recognyze","date":"2026-04-06 23:56:41"},"1.3.51":{"tag":"1.3.51","author":"recognyze","date":"2026-05-11 12:42:49"},"1.3.52":{"tag":"1.3.52","author":"recognyze","date":"2026-05-26 13:52:26"}},"upgrade_notice":{"1.3.52":"<p>New: Automatic API key rotation before expiration (14-day buffer) plus manual &quot;Rotate now&quot; in Essentials settings. Existing connections will sync key metadata on the next admin visit or daily cron.<\/p>","1.3.51":"<p>New: Optional softmax IP + UA attribution for Bot Wall with argmax decisioning and UI status visibility.\nReliability: Automatic fallback to current UA\/category policy when <code>ipVerification<\/code> data is not available.\nSecurity: When softmax is on and a bot lists official IP ranges, spoofed user agents are not treated as that bot unless the client IP matches those ranges.<\/p>","1.3.50":"<p>New: Agents &amp; Bot Access tab with rules-driven Bot Wall, category-level bot controls, per-bot overrides, and unified HTML\/Markdown protection powered by portal Bot Rules. Recommended for all users who want fine-grained control over AI agent access.\nSecurity\/Enhancement: Bot Wall advanced JSON override input is now more robustly sanitized before it is parsed.\nEnhancement: Recognyze Dashboard now warns administrators when WordPress Permalink structure is set to &quot;Plain&quot; (e.g. <code>?p=ID<\/code>), which breaks plugin behavior.<\/p>","1.3.49":"<p>New: Markdown for Agents \u2014 serve content as Markdown for AI agents (.md URLs or Accept: text\/markdown). Includes token estimator and frontmatter with verify URL and usage fee in points. Tooltip now shows &quot;Price: N points&quot;.<\/p>","1.3.48":"<p>Fix: recognyze.txt now shows content names with correct quotes (no more &quot;). Recommended if you use or verify recognyze.txt.<\/p>","1.3.47":"<p>WordPress.org compliance: Callback escaping, input sanitization for debug logging, and escape-late for echoed variables. Recommended for all users.<\/p>","1.3.46":"<p>Bugfix: WordPress admin footer now properly displays on all plugin pages.<\/p>","1.3.45":"<p>WordPress.org compliance update: Attribution now requires admin opt-in. Fixed PHP 8.1+ compatibility issue. Recommended for all users.<\/p>","1.3.44":"<p>Critical security update: Fixed callback escaping issues in filter and shortcode callbacks. All callback return values now properly escaped. Recommended for all users.<\/p>","1.3.43":"<p>WordPress.org compliance update: Fixed CSS enqueue issue in protection page. Now uses wp_enqueue_style() for proper asset loading. Recommended for all users preparing for WordPress.org submission.<\/p>","1.3.42":"<p>Critical security update: Comprehensive output escaping fixes for WordPress.org compliance. All dynamic content now properly escaped. Recommended for all users.<\/p>","1.3.41":"<p>Improved admin notice behavior for better user experience. Notices now only appear on plugin pages and dashboard. OpenSSL notice is now dismissible.<\/p>","1.3.39.0":"<p>Admin menu and settings URLs updated: dashboard is now wp-recognyze-client, settings is recognyze-client-settings. Report and Access Logs subpage slugs unchanged.<\/p>","1.3.38.0":"<p>WordPress code conventions and style updates. No functional changes.<\/p>","1.3.37.0":"<p>Improved auth error handling and connection UX. Clean disconnects on API key failure with reconnect banner. Prevents conflicts by auto-deactivating older plugin instances.<\/p>","1.3.36.0":"<p>Migration runs on update with status notice. Fixes &#039;link expired&#039; during dashboard submissions. If duplicate plugins appear, keep only the latest.<\/p>","1.3.35.0":"<p>Migration improvements: Added diagnostic tools and on-demand migration functionality. Fixed migration to correctly handle already-migrated data. Administrators can now monitor and manually trigger migrations from the diagnostic page.<\/p>","1.3.34.0":"<p>Code quality improvement: Removed unused functions and prepared for upcoming refactoring. No functional changes.<\/p>","1.3.33.0":"<p>Critical security update: Fixes all output escaping issues for WordPress.org compliance. \nRecommended for all users.<\/p>","1.3.31.0":"<p>Initial release of Recognyze.AI plugin. Protect your content and track AI usage today!<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3468600,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"wprc\/http-post-request":{"name":"wprc\/http-post-request","title":"Wprc Http Post Request"}},"tagged_versions":["1.3.47","1.3.48","1.3.49","1.3.50","1.3.51","1.3.52"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Dashboard - Overview of signed posts and bulk management tools","2":"Settings (Essentials) - API connection, key expiration, rotation, and AutoRecognyze","3":"Agents &amp; Bot Access - Bot Wall and bot\/category rule configuration","4":"Access Logs - Detailed tracking of signed content access","5":"Unsigned Access Logs - Tracking of unsigned content access and bot detection","6":"Post Meta Box - Quick post signing from the edit screen"}},"plugin_section":[262246],"plugin_tags":[2353,89213,5282,18193,11954],"plugin_category":[],"plugin_contributors":[256104],"plugin_business_model":[],"class_list":["post-280104","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-ai","plugin_tags-api-integration","plugin_tags-content-monetization","plugin_tags-content-protection","plugin_tags-signatures","plugin_contributors-recognyze","plugin_committers-recognyze"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/recognyze-client\/assets\/icon-128x128.png?rev=3468600","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Recognyze.AI is a WordPress plugin for publishers who want to protect content, monetize AI usage, and control how agents access their site. Use the dashboard to sign posts in bulk, connect securely to the Recognyze Publisher API, and monitor signed and unsigned access-including Bot Wall blocks and optional Markdown for AI agents.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Content Protection<\/strong>: Cryptographic signatures that verify authenticity and register content with Recognyze<\/li>\n<li><strong>Post Management Dashboard<\/strong>: Overview of recognized, pending, and bulk sign\/sync actions<\/li>\n<li><strong>AutoRecognyze<\/strong>: Optionally recognize new Posts and Pages automatically on publish (Essentials settings)<\/li>\n<li><strong>API Integration<\/strong>: Connect with your Recognyze account; API keys are encrypted at rest (AES-256-GCM when OpenSSL is available)<\/li>\n<li><strong>API Key Rotation<\/strong>: Automatic rotation before expiry (14-day buffer), manual \"Rotate now\", and visible key ID\/expiration in Essentials<\/li>\n<li><strong>Bot Wall (Agents &amp; Bot Access)<\/strong>: Rules-driven blocking for AI crawlers with per-bot and per-category controls (HTML\/Markdown), powered by portal Bot Rules<\/li>\n<li><strong>AI Bot Detection<\/strong>: Track signed and unsigned visits, including blocked Bot Wall requests and bot attribution metadata<\/li>\n<li><strong>Access Logs<\/strong>: Logging for signed content access with event-based export and retention cleanup<\/li>\n<li><strong>Unsigned Access Logs<\/strong>: Track unsigned content access and bot-like traffic separately<\/li>\n<li><strong>Bulk Operations<\/strong>: Sign or synchronize many posts at once<\/li>\n<li><strong>Encrypted Storage<\/strong>: API keys stored encrypted; Basic Auth credentials used only once to obtain a key and are never saved<\/li>\n<li><strong>Export Functionality<\/strong>: Export access logs to Recognyze when batch size or time-based conditions are met<\/li>\n<li><strong>Markdown for Agents<\/strong>: Serve content as Markdown via <code>.md<\/code> URLs or <code>Accept: text\/markdown<\/code>, with Recognyze frontmatter, verify URLs, usage fees in points, and token estimates<\/li>\n<\/ul>\n\n<h4>Use Cases<\/h4>\n\n<ul>\n<li>Content creators who want to protect their intellectual property<\/li>\n<li>Publishers who want to monetize AI usage of their content<\/li>\n<li>Bloggers who want to track which AI systems access their content<\/li>\n<li>News organizations managing content licensing for AI training<\/li>\n<li>Any WordPress site owner concerned about AI crawler access<\/li>\n<\/ul>\n\n<h4>Technical Features<\/h4>\n\n<ul>\n<li>Supports multiple post types (posts, pages, and configurable types)<\/li>\n<li>RESTful Publisher API integration with optional dev-mode custom endpoint URL<\/li>\n<li>API key lifecycle (<code>includes\/api-key-rotation.php<\/code>): metadata sync via GET <code>\/account\/publisher\/api-keys\/current\/<\/code>, scheduled and manual PUT rotate<\/li>\n<li>Bot Rules cache with daily refresh from the Recognyze portal<\/li>\n<li>Optional softmax IP + User-Agent attribution for Bot Wall when portal <code>ipVerification<\/code> data is available<\/li>\n<li>Comprehensive access logging with event-based export and cleanup<\/li>\n<li>Scheduled tasks for log cleanup, export, API key metadata sync, and Bot Rules refresh<\/li>\n<li>Developer-friendly with hooks and filters (e.g. <code>wprc_api_key_rotation_buffer_days<\/code>)<\/li>\n<li>WordPress Coding Standards compliant<\/li>\n<li><strong>Markdown for Agents<\/strong> (<code>includes\/markdown-for-agents.php<\/code>): Content negotiation for <code>text\/markdown<\/code>, YAML frontmatter with Recognyze id, verify_url, usage_fee (points), content_length, markdown_tokens; optional signed-only mode; Link header for alternate type<\/li>\n<li><strong>Token estimator<\/strong> (<code>includes\/token-estimator.php<\/code>): In-plugin token count for Markdown body (word\/char heuristic), exposed as <code>X-Markdown-Tokens<\/code> header and in frontmatter<\/li>\n<\/ul>\n\n<h4>Privacy &amp; Data<\/h4>\n\n<p>This plugin collects access logs that may include IP addresses, user agents, and timestamps. \nThese logs are stored in your WordPress database and automatically exported and cleaned up based on export conditions (batch size or time interval). \nSee the Privacy Policy section in Settings for more details.<\/p>\n\n<h4>Support &amp; Documentation<\/h4>\n\n<p>For detailed documentation, API information, and support, visit <a href=\"https:\/\/recognyze.ai\">Recognyze.AI<\/a><\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>Recognyze.AI collects and stores the following data:<\/p>\n\n<p><strong>Access Logs<\/strong>: When visitors access your signed content, the plugin may log:\n* IP address\n* User agent\n* Timestamp\n* Referrer URL\n* Post ID accessed<\/p>\n\n<p><strong>Unsigned \/ Bot Wall logs<\/strong>: When enabled, the plugin may also log unsigned visits and Bot Wall blocks (including bot identity metadata where configured).<\/p>\n\n<p><strong>API key metadata<\/strong>: Key ID, name, status, and expiration date (not the secret) are stored locally to support rotation scheduling.<\/p>\n\n<p><strong>Storage<\/strong>: All data is stored in your WordPress database on your server.<\/p>\n\n<p><strong>Retention<\/strong>: Logs are automatically exported and cleaned up from the database based on export conditions (batch size reached or 120-minute fallback interval). \nExported logs are removed immediately after successful export.<\/p>\n\n<p><strong>Export<\/strong>: If configured, access logs may be exported to external systems via API.<\/p>\n\n<p><strong>User Rights<\/strong>: Site administrators can manually delete logs at any time from the Access Logs pages.<\/p>\n\n<p><strong>Third Party Services<\/strong>: When you sign content, metadata is sent to the Recognyze.AI API. \nSee the <a href=\"https:\/\/recognyze.ai\/privacy\">Recognyze.AI Privacy Policy<\/a> for details on how this data is handled.<\/p>\n\n<h3>Support<\/h3>\n\n<p>For support, documentation, and feature requests:<\/p>\n\n<ul>\n<li>Website: <a href=\"https:\/\/recognyze.ai\">https:\/\/recognyze.ai<\/a><\/li>\n<li>Documentation: <a href=\"https:\/\/www.recognyze.ai\/publishers\/wordpress\/\">https:\/\/www.recognyze.ai\/publishers\/wordpress\/<\/a><\/li>\n<li>Support: <a href=\"https:\/\/www.recognyze.ai\/contact-us\/\">https:\/\/www.recognyze.ai\/contact-us\/<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Log in to your WordPress admin panel<\/li>\n<li>Navigate to Plugins &gt; Add New<\/li>\n<li>Search for \"Recognyze.AI\"<\/li>\n<li>Click \"Install Now\" and then \"Activate\"<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Upload the <code>recognyze-client<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Navigate to Recognyze &gt; Settings to configure the plugin<\/li>\n<\/ol>\n\n<h4>Initial Setup<\/h4>\n\n<ol>\n<li><strong>Register<\/strong>: Create a publisher account at <a href=\"https:\/\/recognyze.ai\">Recognyze.AI<\/a><\/li>\n<li><strong>Connect<\/strong>: Go to Recognyze &gt; Settings &gt; Essentials, click <strong>Connect<\/strong>, and sign in with your Recognyze email and password (credentials are not stored; only the API key is saved encrypted)<\/li>\n<li><strong>Optional - Bot Wall<\/strong>: Open <strong>Agents &amp; Bot Access<\/strong> to enable Bot Wall and configure bot\/category rules<\/li>\n<li><strong>Optional - Export<\/strong>: Configure batch size and fallback interval for automatic access log export<\/li>\n<li><strong>Protect content<\/strong>: Use the Dashboard to sign posts (or enable AutoRecognyze in Essentials)<\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.0 or higher<\/li>\n<li>PHP 7.0 or higher (7.4+ recommended)<\/li>\n<li>OpenSSL PHP extension (required for encryption features)<\/li>\n<li>MySQL 5.6 or higher \/ MariaDB 10.0 or higher<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20recognyze.ai%3F\"><h3>What is Recognyze.AI?<\/h3><\/dt>\n<dd><p>Recognyze.AI is a service that helps content creators protect their work and earn from AI usage. \nThe WordPress plugin integrates your site with the Recognyze platform to track AI access and manage content signatures.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>Yes. Register at <a href=\"https:\/\/recognyze.ai\">Recognyze.AI<\/a>, then connect from <strong>Recognyze &gt; Settings &gt; Essentials<\/strong>. The plugin obtains an API key using your account credentials once; only the encrypted API key is stored in WordPress.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20rotate%20api%20keys%20automatically%3F\"><h3>Does the plugin rotate API keys automatically?<\/h3><\/dt>\n<dd><p>Yes. After you connect, the plugin syncs key metadata (ID and expiration) and schedules rotation <strong>14 days before expiry<\/strong>. You can also click <strong>Rotate now<\/strong> in Essentials at any time. If rotation fails, you will see an admin notice; the plugin does not remove your key unless the API reports it is invalid.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20collect%3F\"><h3>What data does the plugin collect?<\/h3><\/dt>\n<dd><p>The plugin stores access logs in your WordPress database, including IP addresses, user agents, timestamps, and referrer information for content visits. Signed access logs cover successful GET requests to protected content. Unsigned access logs and Bot Wall can record blocked or unsigned visits (including bot attribution metadata when Bot Wall is enabled). Logs may be exported to Recognyze based on your export settings.<\/p><\/dd>\n<dt id=\"what%20is%20bot%20wall%3F\"><h3>What is Bot Wall?<\/h3><\/dt>\n<dd><p>Bot Wall (Agents &amp; Bot Access) lets you block or allow AI crawlers using rules from your Recognyze portal, with per-bot and per-category settings for HTML and Markdown. Blocked visits can be logged in Unsigned Access Logs. Bot Wall is off by default until you enable it in settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20sign%20my%20existing%20posts%3F\"><h3>How do I sign my existing posts?<\/h3><\/dt>\n<dd><p>Go to Recognyze &gt; Dashboard, select the posts you want to sign, and use the bulk sign action. \nYou can also sign individual posts from the post edit screen or from the dashboard.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>If you deactivate the plugin, your content signatures remain in the post metadata but the tracking and protection features will be disabled. \nIf you uninstall the plugin, all data including signatures, logs, and settings will be removed.<\/p><\/dd>\n<dt id=\"is%20my%20api%20key%20stored%20securely%3F\"><h3>Is my API key stored securely?<\/h3><\/dt>\n<dd><p>Yes. API keys are encrypted with OpenSSL (AES-256-GCM) when the extension is available, then stored in the WordPress options table. Your Recognyze account password is never saved-only used temporarily during <strong>Connect<\/strong> to issue the API key.<\/p><\/dd>\n<dt id=\"can%20i%20export%20my%20access%20logs%3F\"><h3>Can I export my access logs?<\/h3><\/dt>\n<dd><p>Yes, the plugin includes export functionality to send access logs to external systems, provided by recognyze.ai<\/p><\/dd>\n<dt id=\"how%20often%20are%20logs%20cleaned%20up%3F\"><h3>How often are logs cleaned up?<\/h3><\/dt>\n<dd><p>Logs are automatically exported and cleaned up when export conditions are met: either when the configured batch size is reached OR when the fallback interval (120 minutes) has elapsed since the last export. \nLogs are removed from the database immediately after successful export.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.52<\/h4>\n\n<ul>\n<li>New: Proactive Publisher API key rotation - syncs key metadata (ID, expiration), rotates automatically 14 days before expiry, and adds a manual \"Rotate now\" control in Essentials.<\/li>\n<li>Enhancement: Essentials connection panel shows key name, masked key ID, and expiration date.<\/li>\n<li>Reliability: Scheduled rotation uses stored key ID with fallback; daily metadata sync for sites with limited WP-Cron.<\/li>\n<\/ul>\n\n<h4>1.3.51<\/h4>\n\n<ul>\n<li>New: Added optional softmax-based IP + User-Agent bot attribution for Bot Wall with per-site weights (<code>alpha<\/code>, <code>beta<\/code>) and argmax selection.<\/li>\n<li>Enhancement: Agents &amp; Bot Access now shows IP softmax mode status and fallback state when <code>ipVerification<\/code> data is unavailable.<\/li>\n<li>Enhancement: Bot Wall blocked-visit logs now include softmax decision metadata (selected bot, probability, UA\/IP match indicators, and decision source).<\/li>\n<li>Reliability: When IP softmax is enabled but <code>ipVerification<\/code> is missing\/invalid, Bot Wall automatically falls back to current UA\/category policy behavior.<\/li>\n<li>Security: With IP softmax enabled and published <code>ipRanges<\/code> for a bot, UA-only matches no longer grant that bot identity unless the visitor IP is in those ranges (reduces User-Agent spoofing).<\/li>\n<\/ul>\n\n<h4>1.3.50<\/h4>\n\n<ul>\n<li>New: AutoRecognyze in Essentials to automatically recognize published Posts\/Pages.<\/li>\n<li>Enhancement: Access Logs now support configurable optional file logging.<\/li>\n<li>New: Cleanup option added for Unsigned Access Logs.<\/li>\n<li>Bot Wall update: improved AI bot classification, Agents &amp; Bot Access tab, and per-bot\/category controls (HTML\/Markdown).<\/li>\n<li>Export\/security: blocked visits export as <code>403<\/code> with bot metadata, plus safer JSON override parsing and i18n label cleanup.<\/li>\n<\/ul>\n\n<h4>1.3.49<\/h4>\n\n<ul>\n<li>New: Markdown for Agents \u2014 serve content as Markdown for AI agents via <code>.md<\/code> URLs or <code>Accept: text\/markdown<\/code> on post URLs.<\/li>\n<li>New: <code>includes\/markdown-for-agents.php<\/code> \u2014 frontmatter (id, registry_date, usage_fee in points, verify_url to Recognyze portal, content_length, markdown_tokens), content negotiation, Link header for alternate type, optional signed-only and log-requests settings.<\/li>\n<li>New: <code>includes\/token-estimator.php<\/code> \u2014 in-plugin token estimate for Markdown (word\/char heuristic), no external deps; exposed as <code>X-Markdown-Tokens<\/code> header and in frontmatter.<\/li>\n<li>Enhancement: Tooltip price display now shows \"Price: N points\" (e.g. \"1000 points\").<\/li>\n<\/ul>\n\n<h4>1.3.48<\/h4>\n\n<ul>\n<li>Fix: recognyze.txt no longer HTML-escapes the content name. The name value was incorrectly passed through esc_html() when serving the recognyze.txt file, causing double quotes to appear as &quot; in the output. Serving now outputs plain text only; download and URL-served recognyze.txt both show correct name=\"...\" values.<\/li>\n<\/ul>\n\n<h4>1.3.47<\/h4>\n\n<ul>\n<li>Security: WordPress.org compliance \u2014 callback return values must be escaped. the_title filter callback wprc_add_icon_to_title now escapes date_i18n() output with esc_html(), sanitizes tooltip fragment with wp_kses_post(), and returns icon\/tooltip HTML through wp_kses_post() for safe output.<\/li>\n<li>Security: Data must be sanitized before use. Debug log calls no longer pass raw $_POST, $_GET, or $_REQUEST. Added wprc_sanitize_for_debug_log() in utilities; admin.php now logs sanitized copies (and sanitized array_keys for $_REQUEST).<\/li>\n<li>Security: Variables must be escaped when echoed. Access logs table pagination now escapes $output at echo time with wp_kses_post() (escape late) in class-wprc-access-logs-table.php.<\/li>\n<\/ul>\n\n<h4>1.3.46<\/h4>\n\n<ul>\n<li>Enhancement: Moved wprc_ensure_admin_footer() to use current_screen hook instead of admin_init for proper screen object availability.<\/li>\n<\/ul>\n\n<h4>1.3.45<\/h4>\n\n<ul>\n<li>Compliance: Added admin opt-in control for \"Powered by Recognyze\" attribution on protection page.<\/li>\n<li>Enhancement: Attribution is now hidden by default and only displays when admin explicitly opts in via settings checkbox.<\/li>\n<li>Enhancement: Added \"Show attribution\" setting in Functionality section of settings page.<\/li>\n<li>Fix: Fixed PHP 8.1+ deprecation warning in wprc_sanitize_api_key() function (null parameter handling).<\/li>\n<li>Compliance: Now fully compliant with WordPress.org Guideline 12 (attribution requires explicit opt-in).<\/li>\n<\/ul>\n\n<h4>1.3.44<\/h4>\n\n<ul>\n<li>Security: Fixed callback escaping issues for WordPress.org compliance.<\/li>\n<li>Security: Added esc_html() to wprc_add_icon_to_title filter callback to escape title parameter.<\/li>\n<li>Security: Added sanitize_text_field() and sanitize_html_class() to wprc_http_post_shortcode.<\/li>\n<li>Security: Added sanitization to wprc_render_http_post_block attribute extraction.<\/li>\n<li><\/li>\n<\/ul>\n\n<h4>1.3.43<\/h4>\n\n<ul>\n<li>Compliance: Fixed CSS enqueue issue in protection page for WordPress.org compliance.<\/li>\n<li>Enhancement: Converted external CSS link to use wp_enqueue_style() in wprc_render_protection_page().<\/li>\n<li>Enhancement: Added wprc_enqueue_protection_page_styles() function for proper asset loading.<\/li>\n<li>Enhancement: Added wp_head() and wp_footer() hooks to protection page template.<\/li>\n<\/ul>\n\n<h4>1.3.42<\/h4>\n\n<ul>\n<li>Security: Comprehensive output escaping improvements for WordPress.org compliance.<\/li>\n<li>Security: Applied esc_html() to pagination display sprintf() results.<\/li>\n<li>Security: Replaced <strong>() with esc_attr<\/strong>() for all HTML title attributes <\/li>\n<li>Security: Replaced <strong>() with esc_html<\/strong>() for all text content in HTML tags.<\/li>\n<\/ul>\n\n<h4>1.3.41<\/h4>\n\n<ul>\n<li>Compliance: Improved admin notice behavior to comply with WordPress.org Guideline 11.<\/li>\n<li>Enhancement: Limited admin notices to plugin pages and dashboard only (no more notice spam on unrelated pages).<\/li>\n<li>Enhancement: Made OpenSSL extension notice dismissible with persistent user preference.<\/li>\n<li>Enhancement: Added wprc_should_show_admin_notice() helper function for consistent notice scope checking.<\/li>\n<li>UX: Improved admin experience by reducing intrusive notices while maintaining critical error visibility.<\/li>\n<\/ul>\n\n<h4>1.3.40<\/h4>\n\n<ul>\n<li>Fix: Resolved 'Offloaded Content' issue by bundling remote assets (logo image).<\/li>\n<li>Refactor: Renamed text domain from wp-recognyze-client to recognyze-client.<\/li>\n<li>Fix: Added missing text domain to internationalization functions in post-meta.php for WordPress.org compliance.<\/li>\n<\/ul>\n\n<h4>1.3.39.0<\/h4>\n\n<ul>\n<li>Refactor: Renamed admin menu slug wp-manage-objects to wp-recognyze-client.<\/li>\n<li>Refactor: Renamed settings page slug wp-manage-objects-settings to recognyze-client-settings.<\/li>\n<\/ul>\n\n<h4>1.3.38.0<\/h4>\n\n<ul>\n<li>Code: Applied WordPress code conventions and style updates across the plugin.<\/li>\n<li>Code: Removed unneeded code and aligned with WordPress coding standards.<\/li>\n<li>Code: WordPress plug and code conventions update.<\/li>\n<\/ul>\n\n<h4>1.3.37.0<\/h4>\n\n<ul>\n<li>Auth UX: Automatically disconnect and prompt to reconnect when the API key fails (401\/403) during sync or connection tests.<\/li>\n<li>Auth UX: Added a clear \\\"Recognyze: Connection lost\\\" admin notice with a direct \\\"Reconnect Recognyze\\\" button.<\/li>\n<li>Auth UX: Improved \\\"Test Connection\\\" to update connection status when the key is invalid, not just show a warning.<\/li>\n<li>Compatibility: When activating this plugin, automatically deactivate any other active \\\"Recognyze.AI\\\" plugin instance (old folder) to avoid conflicts.<\/li>\n<\/ul>\n\n<h4>1.3.36.0<\/h4>\n\n<ul>\n<li>Migration: Run migration automatically on plugin update (version check on admin load), not only on activation<\/li>\n<li>Migration: Show migration status after update (admin notice with link to Migration Diagnostic)<\/li>\n<\/ul>\n\n<h4>1.3.35.0<\/h4>\n\n<ul>\n<li>Migration: Added admin-only migration diagnostic page for monitoring migration status<\/li>\n<li>Migration: Added on-demand migration functionality accessible from diagnostic page<\/li>\n<li>Migration: Fixed migration function to correctly handle already-migrated post meta (prevents false error reports)<\/li>\n<li>Migration: Improved migration error handling and verification logic<\/li>\n<li>Admin: Added migration actions section with force re-run option for administrators<\/li>\n<\/ul>\n\n<h4>1.3.34.0<\/h4>\n\n<ul>\n<li>Code Maintenance: Removed 4 unused\/dead functions to improve code quality<\/li>\n<li>Code Maintenance: Removed wprc_show_recognyze_url_info (never called)<\/li>\n<li>Code Maintenance: Removed wprc_register_unsigned_access_logs_menu (backward compatibility stub)<\/li>\n<li>Code Maintenance: Removed wprc_bot_wall_testing_notice (moved to settings, not cleaned up)<\/li>\n<li>Code Maintenance: Removed wprc_test_next_export_functions (debug function not in use)<\/li>\n<\/ul>\n\n<h4>1.3.33.0<\/h4>\n\n<ul>\n<li>Security: Fixed all unescaped output issues to meet WordPress.org security standards<\/li>\n<li>Security: Added proper escaping to pagination display (absint for integers)<\/li>\n<li>Security: Added proper escaping to URLs in sortable column headers (esc_url)<\/li>\n<li>Security: Added proper escaping to dashboard metrics (esc_html, absint, esc_attr)<\/li>\n<li>Security: Added proper escaping to access log file information display<\/li>\n<\/ul>\n\n<h4>1.3.31.0<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<li>Content signature management<\/li>\n<li>AI bot detection and tracking<\/li>\n<li>Access logging with event-based export and cleanup<\/li>\n<li>Encrypted credential storage<\/li>\n<li>Bulk signing operations<\/li>\n<li>Export functionality for logs<\/li>\n<li>Comprehensive settings panel<\/li>\n<li>WordPress Coding Standards compliance<\/li>\n<\/ul>","raw_excerpt":"Protect your content and earn from AI usage. Sign posts, control AI bot access, rotate API keys, and track crawlers with Recognyze.AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/280104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=280104"}],"author":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/recognyze"}],"wp:attachment":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=280104"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=280104"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=280104"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=280104"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=280104"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=280104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}