{"id":315624,"date":"2026-05-24T14:02:03","date_gmt":"2026-05-24T14:02:03","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/outscoreagent-publisher\/"},"modified":"2026-05-26T14:34:36","modified_gmt":"2026-05-26T14:34:36","slug":"outscoreagent","status":"publish","type":"plugin","link":"https:\/\/cs.wordpress.org\/plugins\/outscoreagent\/","author":23487534,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.5","stable_tag":"1.5.5","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"OutscoreAgent Publisher","header_author":"OutscoreAgent","header_description":"Connect your WordPress site to OutscoreAgent for automated AI-powered article publishing.","assets_banners_color":"0d0b37","last_updated":"2026-05-26 14:34:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/outscoreagent.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":56,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.3":{"tag":"1.5.3","author":"outscoreagent","date":"2026-05-24 14:00:49"},"1.5.5":{"tag":"1.5.5","author":"outscoreagent","date":"2026-05-26 14:34:36"}},"upgrade_notice":{"1.5.5":"<p>Fixes a bug where revoking the API token did not persist correctly, leaving the old token active. Upgrade if you have ever used token revocation.<\/p>","1.5.4":"<p>Adds 19 bundled translations, fixes IndexNow on Multisite subdirectory installs, adds Cloudflare Flexible SSL support, and improves the settings page with a Quick Setup guide. Plugin action links now include &quot;Get Pro&quot; and &quot;Support&quot;. Existing settings and tokens are preserved.<\/p>","1.5.3":"<p>Adds a verifiable <code>wp_kses_post()<\/code> escape at the featured-image credit&#039;s <code>the_content<\/code> filter callback to satisfy the wordpress.org review checklist. No functional change; the rendered credit block is visually identical.<\/p>","1.5.2":"<p>Renames the plugin text domain to <code>outscoreagent<\/code> (matches the WordPress.org slug), sanitizes the programmatically-written <code>site_id<\/code> setting, and reduces the unauthenticated response from <code>GET \/status<\/code> to only the plugin version. Stored settings and tokens are preserved.<\/p>","1.5.1":"<p>Removes the duplicate <code>Plugin URI:<\/code> header so the plugin passes the WordPress.org submission check. No functional change.<\/p>","1.5.0":"<p>Renames the plugin text domain and distribution folder to <code>outscoreagent-publisher<\/code> to match the WordPress.org slug. Stored settings and tokens are preserved. The admin settings page URL changes from <code>?page=outscoreagent<\/code> to <code>?page=outscoreagent-publisher<\/code> \u2014 refresh any direct bookmarks.<\/p>","1.4.0":"<p>Adds an IndexNow route self-test and advisory warnings for plugins that commonly interfere with the key route. No configuration change required; existing keys keep working unchanged.<\/p>","1.3.1":"<p>Image-credit mode setting is now applied at save time too, so the chosen mode is reflected in the block editor, REST API, and feeds \u2014 not just the rendered front-end. No configuration change required.<\/p>","1.3.0":"<p>Resolves a 403 &quot;Wrong number of segments&quot; error for sites that also run a JWT auth plugin. Update strongly recommended if you use OutscoreAgent alongside any plugin in the JWT Authentication family.<\/p>","1.2.1":"<p>Compatibility release. Plugin behaviour is unchanged; bump is published in lockstep with a server-side fix so support diagnostics stay aligned.<\/p>","1.2.0":"<p>Featured images are now downloaded into the WP media library by default, so themes and the block editor pick them up automatically. The previous external-URL behaviour is available as an opt-out toggle in Settings \u2192 OutscoreAgent. Minimum PHP version raised to 8.1.<\/p>","1.1.0":"<p>Security hardening: HTTPS enforcement on outbound callbacks and API rate limiting.<\/p>","1.0.0":"<p>Initial release. No upgrade steps required.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3546309,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3546309,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3546309,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3546309,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.3","1.5.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3546309,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3546309,"resolution":"2","location":"assets","locale":"","width":1280,"height":658},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3546309,"resolution":"3","location":"assets","locale":"","width":1280,"height":800}},"screenshots":[]},"plugin_section":[],"plugin_tags":[195933,2016,181641,13175,186],"plugin_category":[55],"plugin_contributors":[264214],"plugin_business_model":[],"class_list":["post-315624","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-content","plugin_tags-auto-publish","plugin_tags-content-automation","plugin_tags-content-generator","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-outscoreagent","plugin_committers-outscoreagent"],"banners":{"banner":"https:\/\/ps.w.org\/outscoreagent\/assets\/banner-772x250.png?rev=3546309","banner_2x":"https:\/\/ps.w.org\/outscoreagent\/assets\/banner-1544x500.png?rev=3546309","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/outscoreagent\/assets\/icon-128x128.png?rev=3546309","icon_2x":"https:\/\/ps.w.org\/outscoreagent\/assets\/icon-256x256.png?rev=3546309","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/outscoreagent\/assets\/screenshot-1.png?rev=3546309","caption":""},{"src":"https:\/\/ps.w.org\/outscoreagent\/assets\/screenshot-2.png?rev=3546309","caption":""},{"src":"https:\/\/ps.w.org\/outscoreagent\/assets\/screenshot-3.png?rev=3546309","caption":""}],"raw_content":"<!--section=description-->\n<p>OutscoreAgent is an AI content generator that creates SEO-optimized articles and publishes them directly to your WordPress site. It handles the entire content lifecycle \u2014 from keyword research and topic clustering through SERP competitor analysis, article generation, and ongoing content refresh to combat SEO decay.<\/p>\n\n<p>This plugin is the WordPress-side bridge: it creates a secure REST API endpoint that the OutscoreAgent platform uses to push finished articles. Once configured, articles are automatically published to your site with their correct title, content, featured image, and metadata.<\/p>\n\n<p><strong>What OutscoreAgent brings to your WordPress site:<\/strong><\/p>\n\n<ul>\n<li>AI content generation \u2014 topic research, competitor analysis, and publish-ready articles<\/li>\n<li>SEO optimization \u2014 keyword targeting informed by SERP analysis and topic clusters<\/li>\n<li>Content refresh \u2014 detect SEO decay (ranking drops, outdated content) and automatically update articles<\/li>\n<li>Scheduled publishing \u2014 set a daily publish time and articles go live on your schedule<\/li>\n<li>Featured images with proper photographer attribution (Pexels \/ Unsplash)<\/li>\n<li>IndexNow integration \u2014 notify search engines the moment an article is published<\/li>\n<\/ul>\n\n<p><strong>What the plugin handles:<\/strong><\/p>\n\n<ul>\n<li>Secure bearer token authentication \u2014 only OutscoreAgent can publish to your site<\/li>\n<li>HTTPS enforcement \u2014 tokens are never transmitted over plain HTTP<\/li>\n<li>Per-site configuration \u2014 each WordPress site has its own independent token<\/li>\n<li>Featured image sideloading into the WordPress media library<\/li>\n<li>Structured error logging \u2014 detailed logs available in the admin panel<\/li>\n<li>Clean uninstall \u2014 removing the plugin deletes all its data from your database<\/li>\n<\/ul>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li>Install and activate the plugin<\/li>\n<li>Generate an API token from the OutscoreAgent settings page<\/li>\n<li>Enter the token and your site's REST API URL in the OutscoreAgent platform<\/li>\n<li>Articles are published automatically when they finish generating<\/li>\n<\/ol>\n\n<p>OutscoreAgent offers a free tier with core features included, so you can connect your site and start publishing without a paid subscription. A free trial of premium features is available for new accounts.<\/p>\n\n<p><strong>Third-party service requirement:<\/strong><\/p>\n\n<p>This plugin is the WordPress-side companion of the <a href=\"https:\/\/outscoreagent.com\/\">OutscoreAgent<\/a> platform and requires an active OutscoreAgent account to be useful. The plugin itself does nothing on its own \u2014 it exposes a secure REST endpoint that the OutscoreAgent platform calls to publish generated articles, and it sends post-status updates back to the platform so article state stays in sync. Without an OutscoreAgent account, no data is ever sent anywhere; the plugin simply remains idle.<\/p>\n\n<p><strong>Data transmitted to OutscoreAgent:<\/strong><\/p>\n\n<p>When you configure a callback URL in the plugin settings (provided to you by the OutscoreAgent platform), the plugin will transmit the following information to OutscoreAgent each time a post it originally published changes status (draft \u2192 publish, publish \u2192 trash, etc.):<\/p>\n\n<ul>\n<li>The post's WordPress ID<\/li>\n<li>The post's public permalink and WP admin edit link<\/li>\n<li>The new post status (e.g. <code>publish<\/code>, <code>draft<\/code>, <code>trash<\/code>)<\/li>\n<li>The OutscoreAgent external article ID the post is linked to<\/li>\n<li>A UTC timestamp<\/li>\n<\/ul>\n\n<p>No post content, user personal data, or WordPress credentials are ever sent. See the <strong>External services<\/strong> section below for the full disclosure. By using this plugin you agree to the OutscoreAgent <a href=\"https:\/\/outscoreagent.com\/terms\">Terms of Service<\/a> and <a href=\"https:\/\/outscoreagent.com\/privacy\">Privacy Policy<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the OutscoreAgent platform at <strong>https:\/\/outscoreagent.com\/<\/strong> to function. An OutscoreAgent account is required \u2014 without one, the plugin stays idle and no data leaves your site.<\/p>\n\n<p><strong>Service used:<\/strong> OutscoreAgent (operated by OutscoreAgent, the plugin author).<\/p>\n\n<p><strong>What the service does:<\/strong> Generates SEO-optimised articles with AI on OutscoreAgent's servers, then publishes them to your WordPress site via the REST endpoint this plugin exposes. Tracks the post-status lifecycle (draft \/ published \/ trashed) for its own content dashboard.<\/p>\n\n<p><strong>When data is sent to the service:<\/strong> Whenever a WordPress post that was originally published by OutscoreAgent changes status (e.g. the editor moves it from draft to publish, or trashes it). Sending is triggered by WordPress's <code>transition_post_status<\/code> hook. No data is sent for posts the plugin did not create. No data is sent before you configure the callback URL in <strong>Settings \u2192 OutscoreAgent Publisher<\/strong>.<\/p>\n\n<p><strong>What data is sent:<\/strong> A single JSON payload containing:<\/p>\n\n<ul>\n<li><code>event<\/code> \u2014 the literal string <code>post_status_changed<\/code><\/li>\n<li><code>external_id<\/code> \u2014 the OutscoreAgent article ID this post is linked to<\/li>\n<li><code>wp_post_id<\/code> \u2014 the numeric WordPress post ID<\/li>\n<li><code>wp_post_url<\/code> \u2014 the public permalink of the post<\/li>\n<li><code>wp_post_status<\/code> \u2014 the new WordPress post status (e.g. <code>publish<\/code>, <code>draft<\/code>, <code>trash<\/code>)<\/li>\n<li><code>wp_edit_url<\/code> \u2014 the WordPress admin edit URL for the post<\/li>\n<li><code>timestamp<\/code> \u2014 ISO-8601 UTC timestamp of the transition<\/li>\n<\/ul>\n\n<p>No post content, user personal data, comments, WordPress credentials, or IP addresses are transmitted.<\/p>\n\n<p><strong>Transport:<\/strong> HTTPS POST to the callback URL the OutscoreAgent platform configures in the plugin settings. The plugin refuses to send callbacks over plain HTTP (localhost is exempt for development only).<\/p>\n\n<p><strong>Terms and Privacy:<\/strong> The OutscoreAgent service is governed by its <a href=\"https:\/\/outscoreagent.com\/terms\">Terms of Service<\/a> and <a href=\"https:\/\/outscoreagent.com\/privacy\">Privacy Policy<\/a>. By connecting this plugin to your OutscoreAgent account you agree to both.<\/p>\n\n<!--section=installation-->\n<p><strong>Install the plugin:<\/strong><\/p>\n\n<ol>\n<li>In your WordPress admin panel, go to <strong>Plugins \u2192 Add New<\/strong> and search for \"OutscoreAgent\", or download the ZIP from <a href=\"https:\/\/outscoreagent.com\/downloads\/outscoreagent-publisher.zip\">outscoreagent.com\/downloads\/outscoreagent-publisher.zip<\/a> and upload it via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate Plugin<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>Connect to OutscoreAgent:<\/strong><\/p>\n\n<ol>\n<li>Log in to your OutscoreAgent account at <a href=\"https:\/\/outscoreagent.com\/\">outscoreagent.com<\/a> and open <strong>Dashboard \u2192 <a href=\"https:\/\/outscoreagent.com\/dashboard\/integrations\">Integrations<\/a><\/strong>.<\/li>\n<li>Click <strong>Add WordPress Site<\/strong> and follow the setup wizard \u2014 enter your site URL and proceed to the token step.<\/li>\n<li>In your WordPress admin, go to <strong>Settings \u2192 OutscoreAgent Publisher<\/strong> and click <strong>Generate Token<\/strong>.<\/li>\n<li>Copy the token (it is shown only once) and paste it into the OutscoreAgent setup wizard, then click <strong>Connect<\/strong>.<\/li>\n<\/ol>\n\n<p>That's it \u2014 your site is now connected and you can publish articles directly from the OutscoreAgent content pipeline.<\/p>\n\n<p>For a detailed walkthrough with screenshots, see the <a href=\"https:\/\/outscoreagent.com\/docs\/wordpress-setup\">WordPress setup guide<\/a>.<\/p>\n\n<p><strong>Manual installation:<\/strong><\/p>\n\n<ol>\n<li>Unzip the plugin archive.<\/li>\n<li>Upload the <code>outscoreagent<\/code> folder to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin from the WordPress admin <strong>Plugins<\/strong> screen.<\/li>\n<li>Follow the \"Connect to OutscoreAgent\" steps above.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20outscoreagent%20account%3F\"><h3>Do I need an OutscoreAgent account?<\/h3><\/dt>\n<dd><p>Yes. This plugin is the WordPress-side component of the OutscoreAgent platform. You need an active OutscoreAgent account and at least one connected site to use this plugin.<\/p><\/dd>\n<dt id=\"is%20https%20required%3F\"><h3>Is HTTPS required?<\/h3><\/dt>\n<dd><p>Yes. All API requests from the OutscoreAgent platform must be made over HTTPS to protect your bearer token in transit. The plugin will reject requests made over plain HTTP in production environments.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20store%3F\"><h3>What data does the plugin store?<\/h3><\/dt>\n<dd><p>The plugin stores:<\/p>\n\n<ul>\n<li>Your API token (as a SHA-256 hash \u2014 the raw token is shown once and never stored)<\/li>\n<li>Plugin settings (debug mode, platform site ID)<\/li>\n<li>A publish log for auditing article sync activity<\/li>\n<li>Per-post metadata for synced articles<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20send%20to%20outscoreagent%3F\"><h3>What data does the plugin send to OutscoreAgent?<\/h3><\/dt>\n<dd><p>Only post-status change notifications, and only for posts that OutscoreAgent itself originally published. See the <strong>External services<\/strong> section for the exact payload and triggers. No user personal data or post content is transmitted.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20error%20logs%3F\"><h3>Where can I find error logs?<\/h3><\/dt>\n<dd><p>Error logs are stored in two places:<\/p>\n\n<ol>\n<li>The WordPress <code>wp-content\/debug.log<\/code> file (requires <code>WP_DEBUG_LOG<\/code> to be enabled in <code>wp-config.php<\/code>)<\/li>\n<li>The OutscoreAgent settings page in the WordPress admin panel, which shows the last 20 error entries<\/li>\n<\/ol><\/dd>\n<dt id=\"how%20do%20i%20revoke%20the%20api%20token%3F\"><h3>How do I revoke the API token?<\/h3><\/dt>\n<dd><p>Go to <strong>Settings \u2192 OutscoreAgent Publisher<\/strong> and click <strong>Revoke Token<\/strong>. This immediately invalidates the current token. Generate a new token and update your OutscoreAgent platform settings to resume publishing.<\/p><\/dd>\n<dt id=\"is%20there%20a%20free%20plan%3F\"><h3>Is there a free plan?<\/h3><\/dt>\n<dd><p>Yes. OutscoreAgent has a free tier that includes core AI content generation and publishing features, so you can try the full workflow without a credit card. New accounts also receive a free trial of premium features. Visit <a href=\"https:\/\/outscoreagent.com\/\">outscoreagent.com<\/a> for current plan details.<\/p><\/dd>\n<dt id=\"what%20is%20content%20refresh%20and%20seo%20decay%3F\"><h3>What is content refresh and SEO decay?<\/h3><\/dt>\n<dd><p>SEO decay happens when published articles gradually lose rankings due to outdated information, increased competition, or changing search intent. OutscoreAgent monitors your content performance and can automatically refresh declining articles \u2014 updating facts, improving structure, and republishing through this plugin \u2014 so your rankings stay competitive without manual effort.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20wordpress%20multisite%3F\"><h3>Does this work with WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in a multisite network has its own independent token and settings. There are no network-level settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>Fixed: token revocation now persists correctly. The <code>sanitize_settings<\/code> callback used truthiness checks to distinguish programmatic writes from form submissions; when <code>revoke_token()<\/code> set <code>token_hash<\/code> to an empty string the sanitizer treated it as absent and silently restored the old hash. Switched to <code>array_key_exists()<\/code> so an explicitly-set empty value is persisted.<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>Added: bundled translations for 19 locales (German, French, Spanish, Italian, Dutch, Swedish, Danish, Norwegian Bokm\u00e5l, Finnish, Arabic, Indonesian, Russian, Brazilian Portuguese, Japanese, Filipino, Vietnamese, Turkish, Thai, Korean). All 103 user-facing strings are translated.<\/li>\n<li>Fixed: bundled translations under <code>languages\/<\/code> are now loaded explicitly via <code>load_plugin_textdomain()<\/code> on <code>init<\/code>. WordPress' just-in-time loader only checks the global <code>wp-content\/languages\/plugins\/<\/code> directory, so without this call the bundled .mo files were never picked up.<\/li>\n<li>Fixed: PO file <code>Project-Id-Version<\/code> headers updated from 1.5.3 to 1.5.4; typographic quote escaping corrected in de_DE, da_DK, and nl_NL translations.<\/li>\n<li>Added: Quick Setup guide on the settings page when no token is configured, with numbered steps and a direct link to the Integrations page.<\/li>\n<li>Added: \"Get OutscoreAgent Pro\" and \"Support\" action links on the Plugins page alongside the existing \"Settings\" link.<\/li>\n<li>Fixed: IndexNow key route now works on Multisite subdirectory installs by stripping the site's base path from REQUEST_URI before regex matching.<\/li>\n<li>Fixed: <code>autoload<\/code> set to <code>false<\/code> on publish log and IndexNow route health options to prevent alloptions cache invalidation storms on sites with persistent object caching (Redis\/Memcached).<\/li>\n<li>Fixed: AIOSEO v4 Models API call wrapped in try\/catch so a missing table no longer blocks article publishing.<\/li>\n<li>Added: <code>X-Forwarded-Proto<\/code> detection in HTTPS enforcement for Cloudflare Flexible SSL and other reverse-proxy TLS termination setups.<\/li>\n<li>Added: WP-Cron status detection on the Diagnostics tab with a warning when <code>DISABLE_WP_CRON<\/code> is true.<\/li>\n<li>Changed: <code>callback_url<\/code> and <code>callback_token<\/code> fields are now editable after initial setup (previously required DB intervention to change).<\/li>\n<li>Changed: replaced network admin settings page with an informational notice directing super-admins to per-site configuration.<\/li>\n<li>Improved: readme description, tags, and FAQ optimized for discoverability (AI content generation, SEO decay, content refresh keywords).<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Hardened: the <code>the_content<\/code> filter callback that prepends the featured-image credit now passes its returned HTML through <code>wp_kses_post()<\/code> before concatenation. The credit block was already built from escaped fragments (<code>esc_html<\/code> \/ <code>esc_url<\/code> \/ <code>esc_attr<\/code> around the photographer name, URL, and source label), but the wordpress.org review process requires the escape to be visible at the filter callback's return site, not only inside the helpers that assemble the string.<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Fixed: plugin text domain renamed from <code>outscoreagent-publisher<\/code> to <code>outscoreagent<\/code> to match the WordPress.org plugin slug. All translation strings, the language template (<code>languages\/outscoreagent.pot<\/code>), and the distribution zip's top-level folder are updated. Internal storage keys (<code>outscoreagent_settings<\/code>, <code>outscoreagent_publish_log<\/code>) are unchanged, so existing installs preserve their token and configuration.<\/li>\n<li>Hardened: <code>register_setting()<\/code> sanitize callback now runs <code>sanitize_text_field()<\/code> on the programmatically-written <code>site_id<\/code> and <code>token_hash<\/code> values before persisting them.<\/li>\n<li>Hardened: the public <code>GET \/status<\/code> REST endpoint now returns only <code>{ success, plugin_version }<\/code> to unauthenticated callers. WordPress\/PHP versions, site name, post types, categories, and token state are returned only when the request carries a valid API token. The endpoint remains public so the OutscoreAgent platform can detect the plugin before a token is configured.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fixed: removed the <code>Plugin URI:<\/code> header from the main plugin file. It pointed to the same URL as <code>Author URI:<\/code>, which the WordPress.org reviewer flagged. <code>Author URI:<\/code> is retained so users can find the plugin author; a dedicated plugin page can be added back later via <code>Plugin URI:<\/code> once one exists.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Renamed: the plugin text domain and distribution folder are now <code>outscoreagent-publisher<\/code> to match the WordPress.org slug. Internal storage keys (settings, publish log) and the brand prefix on functions\/classes are unchanged, so existing installs keep their token and configuration after upgrading.<\/li>\n<li>Renamed: the admin settings page slug is now <code>?page=outscoreagent-publisher<\/code> (was <code>?page=outscoreagent<\/code>). The \"Settings\" link on the Plugins page is updated automatically; refresh any direct bookmarks.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: IndexNow route self-test on the Diagnostics tab. Click \"Run probe now\" to hit the plugin's own <code>\/&lt;key&gt;.txt<\/code> URL from inside WordPress and classify the result (<code>ok<\/code>, <code>not_found<\/code>, <code>forbidden<\/code>, <code>wrong_body<\/code>, <code>redirected<\/code>, <code>server_error<\/code>, <code>loopback_failed<\/code>). Each status comes with a one-line remediation hint so a customer can tell whether a route failure is local (cache, WAF, hijacked hook) or external (CDN, DNS, reverse proxy).<\/li>\n<li>Added: non-blocking advisories on the Settings tab for active plugins that frequently interfere with the IndexNow route without owning IndexNow themselves \u2014 page caches (WP Super Cache, W3 Total Cache, WP Rocket, LiteSpeed, Cache Enabler) and security\/WAF plugins (Wordfence, iThemes Security, Sucuri, NinjaFirewall).<\/li>\n<li>Added: detection of other plugins\/themes hooked on <code>template_redirect<\/code> at priority &lt;= 1, which could short-circuit the request before the IndexNow handler runs. Surfaced only when the loopback probe is failing, to keep the page calm in the happy path.<\/li>\n<li>Added: route-health signal. If <code>flush_rewrite_rules()<\/code> cannot install our rule (<code>.htaccess<\/code> unwritable, mod_rewrite disabled, nginx misconfigured), a clear notice now appears on the Settings tab instead of failing silently.<\/li>\n<li>Hardened: stored IndexNow key value is validated on read; a corrupted option no longer produces a confusing \"another key is being served\" symptom in the loopback probe.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: the \"Text only \u2014 no clickable links\" and \"Disabled\" image-credit modes now also rewrite the credit in the stored post content, not only at front-end render time. Previously the linked credit remained visible in the block editor, REST API, and any theme\/feed that bypasses the_content filter. Articles whose figure-level marker class survived a Gutenberg edit are transformed at save time on the next publish\/update.<\/li>\n<li>Note: with this change, switching from \"Text only\" or \"Disabled\" to \"Active links\" or \"Active links (nofollow)\" no longer takes effect retroactively \u2014 anchors stripped at save time cannot be restored by the render-time filter. Re-publish the article from the dashboard to restore links under the new mode.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Authenticated REST endpoints now accept a namespaced <code>X-OutscoreAgent-Token<\/code> header in addition to <code>Authorization: Bearer<\/code>. The custom header sidesteps third-party JWT auth plugins (e.g. \"JWT Authentication for WP-API\") which intercept any <code>Authorization: Bearer \u2026<\/code> value and reject our <code>osk_<\/code> tokens with <code>jwt_auth_invalid_token<\/code> \/ \"Wrong number of segments\" before our route handler can run. The OutscoreAgent platform now sends the new header by default; the Bearer fallback is retained for backwards compatibility.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Compatibility release tracking server-side fixes. Multi-organization users editing site integrations and IndexNow keys are now correctly authorized via any of their org memberships (previously could see \"Site not found or access denied\" when their first listed org did not own the site). Plugin behaviour is unchanged \u2014 the fix lives entirely on the OutscoreAgent platform \u2014 but the version bump is published in lockstep so plugin and platform stay aligned in support diagnostics.<\/li>\n<li>Bumped Tested up to header to track the latest stable WordPress release.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Featured images are now downloaded into the WordPress media library by default and set as the post's native featured image. Themes and the block editor pick them up automatically \u2014 no theme changes required.<\/li>\n<li>Added a \"Download featured image to media library\" toggle in the settings page. When disabled, the previous behaviour (remote URL stored in <code>_thumbnail_ext_url<\/code> post meta) is retained.<\/li>\n<li>Repeat syncs of the same article reuse the existing media library attachment instead of re-downloading.<\/li>\n<li>Sideload failures fall back to the external-URL path so posts never end up without an image reference.<\/li>\n<li>Added External services disclosure and privacy details to readme (WordPress.org submission compliance).<\/li>\n<li>Raised minimum PHP version to 8.1.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added HTTPS enforcement for outbound callback URLs (defense-in-depth).<\/li>\n<li>Added per-token rate limiting (30 requests\/minute) on all authenticated REST endpoints.<\/li>\n<li>Added \"Settings\" link on the Plugins page for quick access.<\/li>\n<li>Added Plugin URI and Author URI linking to outscoreagent.com.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Secure bearer token authentication.<\/li>\n<li>REST API endpoint for article publishing.<\/li>\n<li>Structured admin error log.<\/li>\n<li>Full uninstall cleanup.<\/li>\n<\/ul>","raw_excerpt":"Connect your WordPress site to OutscoreAgent for automated AI-powered article publishing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315624"}],"author":[{"embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/outscoreagent"}],"wp:attachment":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315624"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315624"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315624"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315624"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315624"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}