{"id":317271,"date":"2026-07-15T16:24:48","date_gmt":"2026-07-15T16:24:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sorank\/"},"modified":"2026-07-15T16:33:18","modified_gmt":"2026-07-15T16:33:18","slug":"sorank","status":"publish","type":"plugin","link":"https:\/\/am.wordpress.org\/plugins\/sorank\/","author":23479374,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.3","stable_tag":"2.1.3","tested":"7.0.1","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Sorank","header_author":"Sorank","header_description":"Official Sorank connector for WordPress. One-click pairing with your Sorank account, secure REST API for article publishing and category sync. Replaces Application Passwords.","assets_banners_color":"f0f2f7","last_updated":"2026-07-15 16:33:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.sorank.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":54,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.3":{"tag":"2.1.3","author":"sorank","date":"2026-07-15 16:33:18"}},"upgrade_notice":{"2.1.3":"<p>Recommended update for sites that do not expose any selectable categories to Sorank. Articles can publish using the site&#039;s default WordPress category.<\/p>","2.1.0":"<p>Adds article editing from Sorank: you can now update an already-published article on your site and unpublish or re-publish it without creating duplicate posts. Recommended update; no breaking change, existing connections keep working.<\/p>","2.0.5":"<p>Strongly recommended update if you have been forced to re-pair the plugin manually over time. The token is now stored with a key that survives WordPress salt rotation by security plugins. Existing tokens migrate automatically on first read.<\/p>","2.0.4":"<p>Recommended update. Sorank can now read back the real permalink of a published post, which avoids broken URLs when a slug clashes with an existing post or media file.<\/p>","2.0.3":"<p>Housekeeping release. No functional change; safe to update.<\/p>","2.0.2":"<p>Adds an Elementor Pro Theme Builder compatibility toggle for &quot;Single Post&quot; templates. No breaking change; existing connections keep working.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3609342,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3609342,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3609457,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3609457,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The Sorank admin page when the site is not yet connected.","2":"The same page after a successful pairing, with the connected Sorank account and site URL.","3":"The Elementor Theme Builder compatibility setting."}},"plugin_section":[],"plugin_tags":[7143,174175,23853,186,2227],"plugin_category":[55],"plugin_contributors":[271727],"plugin_business_model":[],"class_list":["post-317271","plugin","type-plugin","status-publish","hentry","plugin_tags-publishing","plugin_tags-rank-math","plugin_tags-rest-api","plugin_tags-seo","plugin_tags-yoast","plugin_category-seo-and-marketing","plugin_contributors-sorank","plugin_committers-sorank"],"banners":{"banner":"https:\/\/ps.w.org\/sorank\/assets\/banner-772x250.png?rev=3609457","banner_2x":"https:\/\/ps.w.org\/sorank\/assets\/banner-1544x500.png?rev=3609457","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sorank\/assets\/icon-128x128.png?rev=3609342","icon_2x":"https:\/\/ps.w.org\/sorank\/assets\/icon-256x256.png?rev=3609342","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Sorank is the official WordPress connector for the <a href=\"https:\/\/www.sorank.com\">Sorank SEO platform<\/a>. It connects your site to Sorank so you can generate, schedule, publish, and update SEO-focused articles without copying content between tools.<\/p>\n\n<p>Connect in one click from your WordPress admin. No WordPress password, Application Password, or API key needs to be copied into Sorank.<\/p>\n\n<p><strong>A Sorank account is required.<\/strong> Content generation and planning happen in Sorank. This plugin securely delivers the finished content to your WordPress site.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>AI-powered SEO content<\/strong> - Generate articles in Sorank from target keywords, search intent, competitor research, and your business context.<\/li>\n<li><strong>Automatic or draft publishing<\/strong> - Publish directly to WordPress or send articles as drafts for review before they go live.<\/li>\n<li><strong>Content scheduling<\/strong> - Plan your editorial calendar in Sorank and let scheduled articles reach WordPress at the right time.<\/li>\n<li><strong>Complete article delivery<\/strong> - Send the title, slug, formatted body, inline images, featured image, and WordPress category in one workflow.<\/li>\n<li><strong>SEO metadata<\/strong> - Write SEO titles, meta descriptions, and focus keywords for Yoast SEO and Rank Math.<\/li>\n<li><strong>Update existing articles<\/strong> - Push Sorank edits to an already published WordPress article without creating a duplicate or changing its URL.<\/li>\n<li><strong>Publish status control<\/strong> - Move connected articles between draft and published status from Sorank.<\/li>\n<li><strong>Theme and builder compatibility<\/strong> - Preserve rendering for Elementor, Elementor Pro Theme Builder, OceanWP, and standard WordPress themes.<\/li>\n<li><strong>Secure one-click connection<\/strong> - Pair your site without sharing your WordPress credentials or manually creating an API key.<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li>Install and activate the Sorank plugin from WordPress.org.<\/li>\n<li>Open the new <strong>Sorank<\/strong> menu in your WordPress admin and click <strong>Connect to Sorank<\/strong>.<\/li>\n<li>Authorize the site in your Sorank account. No API key needs to be copied.<\/li>\n<li>Generate or schedule an article in Sorank and choose whether it should be published immediately or saved as a draft.<\/li>\n<li>Sorank sends the article, images, category, and SEO metadata directly to your site. Future edits can update the same WordPress post.<\/li>\n<\/ol>\n\n<h4>Built for Reliable WordPress Publishing<\/h4>\n\n<p>Sorank publishes through a dedicated <code>\/wp-json\/sorank\/v1\/*<\/code> REST namespace instead of relying on the standard post endpoints. This keeps the integration isolated and avoids common conflicts with security layers that heavily restrict <code>\/wp-json\/wp\/v2\/*<\/code>.<\/p>\n\n<p>Each publishing request is authenticated with an encrypted bearer token created during pairing. The plugin can receive an article and its images in a single request, reducing partial publications and synchronization errors.<\/p>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Connection and settings actions require a WordPress administrator and are protected by WordPress nonces.<\/li>\n<li>Pairing uses a state value and PKCE-style code verification to prevent intercepted authorization codes from being reused.<\/li>\n<li>The Sorank access token is encrypted with AES-256-CBC using a random secret generated for this WordPress installation.<\/li>\n<li>Every Sorank REST request must present the valid bearer token, which is compared using <code>hash_equals<\/code>.<\/li>\n<li>Disconnecting removes the local token. Uninstalling removes all Sorank plugin options and temporary pairing data.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to Sorank (https:\/\/www.sorank.com), an SEO SaaS that publishes articles to your site. The connection is required for the plugin to function: without it, the <strong>Connect<\/strong> button cannot pair your site and no articles can be published.<\/p>\n\n<h4>Sorank pairing exchange<\/h4>\n\n<p>When you click <strong>Connect to Sorank<\/strong> in the WordPress admin, your browser is redirected to <code>https:\/\/app.sorank.com\/integrations\/wordpress\/pair<\/code> with the following query parameters: your site URL, a random <code>state<\/code> nonce, a PKCE <code>code_challenge<\/code>, the plugin version, and a <code>return_url<\/code> pointing back to your WordPress admin.<\/p>\n\n<p>After you authorize the pairing in Sorank, your browser is redirected back to your WordPress admin with a <code>pairing_code<\/code> and <code>state<\/code>. The plugin then makes a server-to-server POST request to <code>https:\/\/app.sorank.com\/api\/v1\/cms-integrations\/wordpress-plugin\/exchange<\/code> containing your site URL, the pairing code, the state nonce, the PKCE code verifier, and the plugin version. Sorank responds with a long-lived bearer token and the email address of the Sorank account that authorized the pairing.<\/p>\n\n<h4>Sorank disconnect notification<\/h4>\n\n<p>When you click <strong>Disconnect<\/strong> in the WordPress admin, the plugin makes a best-effort POST request to <code>https:\/\/app.sorank.com\/api\/v1\/cms-integrations\/wordpress-plugin\/notify-disconnect<\/code> containing your site URL and the bearer token. The plugin then deletes the local copy of the token regardless of whether Sorank could be reached.<\/p>\n\n<h4>No other outbound calls<\/h4>\n\n<p>The plugin does not send analytics, telemetry, error reports, or any other data to Sorank or to any third party. All other Sorank communications are inbound (Sorank calling your site's <code>\/wp-json\/sorank\/v1\/*<\/code> routes with a bearer token).<\/p>\n\n<h4>Terms and privacy<\/h4>\n\n<p>Sorank Terms of Use: https:\/\/www.sorank.com\/terms-of-use\nSorank Privacy Policy: https:\/\/www.sorank.com\/privacy-policy<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin stores the following on your WordPress site:<\/p>\n\n<ul>\n<li><code>sorank_access_token<\/code>: the bearer token issued by Sorank during pairing, encrypted at rest.<\/li>\n<li><code>sorank_encryption_secret<\/code>: a random 256-bit secret generated at first pairing and used to encrypt the access token. Never leaves the site.<\/li>\n<li><code>sorank_authkey_fingerprint<\/code>: a one-way SHA-256 fingerprint of <code>AUTH_KEY<\/code> taken at install time. Used to detect (and report anonymously to Sorank) whether a security plugin rotated your salts, since salt rotation was the leading cause of disconnections before 2.0.5. The first 8 hex characters of the fingerprint are anonymized for the diagnostic.<\/li>\n<li><code>sorank_connected_email<\/code>: the email address of the Sorank account that authorized the pairing.<\/li>\n<li><code>sorank_connected_site_url<\/code>: the site URL recorded at pairing time.<\/li>\n<li><code>sorank_connected_at<\/code>: the Unix timestamp of the pairing.<\/li>\n<li><code>sorank_theme_builder_compat<\/code>: the on\/off value of the Elementor Theme Builder compatibility option.<\/li>\n<li>Short-lived transients prefixed with <code>sorank_pairing_<\/code> containing the PKCE verifier during an in-progress pairing (auto-expire after 10 minutes).<\/li>\n<\/ul>\n\n<p>All of these are removed when the plugin is uninstalled through the standard WordPress uninstall flow.<\/p>\n\n<p>The plugin does not set cookies and does not track site visitors.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Sign up for a free Sorank account at https:\/\/www.sorank.com if you do not already have one.<\/li>\n<li>Install the plugin from the WordPress.org plugin directory or by uploading the ZIP archive from your WordPress admin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>In your WordPress admin, click the new <strong>Sorank<\/strong> menu in the sidebar.<\/li>\n<li>Click <strong>Connect to Sorank<\/strong>. You will be redirected to Sorank to authorize this WordPress site.<\/li>\n<li>After authorization, you are redirected back to your WordPress admin and the page now shows <strong>Connected<\/strong>.<\/li>\n<li>In your Sorank dashboard, pick the WordPress site you just connected as a publishing destination.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20sorank%20account%3F\"><h3>Do I need a Sorank account?<\/h3><\/dt>\n<dd><p>Yes. This plugin is a connector to the Sorank SEO platform. Without a Sorank account, the <strong>Connect<\/strong> button cannot complete the pairing. You can create a free account at https:\/\/www.sorank.com.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20my%20password%3F\"><h3>Does the plugin store my password?<\/h3><\/dt>\n<dd><p>No. The pairing flow never transmits your WordPress password to Sorank. Sorank only receives a bearer token issued specifically for this connection. The local copy is encrypted with a random per-install secret stored in your WordPress database with autoload disabled.<\/p><\/dd>\n<dt id=\"how%20do%20i%20disconnect%3F\"><h3>How do I disconnect?<\/h3><\/dt>\n<dd><p>Two options:<\/p>\n\n<ul>\n<li>In your WordPress admin, open the <strong>Sorank<\/strong> page and click <strong>Disconnect<\/strong>. The plugin notifies Sorank and deletes the stored token.<\/li>\n<li>In your Sorank dashboard, open the WordPress integration and click <strong>Disconnect<\/strong>. Sorank notifies the plugin and the token is removed from your site.<\/li>\n<\/ul>\n\n<p>If your WordPress site is temporarily unreachable when Sorank tries to disconnect, Sorank still removes the integration from its side; the stored token on your WordPress site can be deleted by clicking <strong>Disconnect<\/strong> again from the Sorank admin page once your site is back online.<\/p><\/dd>\n<dt id=\"i%20see%20%22could%20not%20encrypt%20the%20sorank%20token%22\"><h3>I see \"Could not encrypt the Sorank token\"<\/h3><\/dt>\n<dd><p>This means PHP's <code>openssl<\/code> extension or <code>random_bytes<\/code> function is unavailable on your host. Check with your hosting provider that the OpenSSL extension is enabled. If you previously upgraded from 2.0.4 or earlier and your <code>AUTH_KEY<\/code> was empty, paste a fresh set of keys from https:\/\/api.wordpress.org\/secret-key\/1.1\/salt\/ into <code>wp-config.php<\/code> and try pairing again.<\/p><\/dd>\n<dt id=\"why%20does%20the%20plugin%20keep%20disconnecting%20every%20few%20days%3F\"><h3>Why does the plugin keep disconnecting every few days?<\/h3><\/dt>\n<dd><p>Pre-2.0.5 versions of the plugin encrypted the token with a key derived from your site <code>AUTH_KEY<\/code>. Some security plugins (iThemes Security, Wordfence, ...) rotate the WordPress salts on a schedule, which made the encrypted token unreadable and forced you to re-pair. Update to 2.0.5+ to switch to a per-install secret that survives salt rotations. After updating, your existing token is migrated transparently on the next API call; no action required.<\/p><\/dd>\n<dt id=\"my%20seo%20meta%20description%20%2F%20focus%20keyword%20is%20empty%20after%20publishing\"><h3>My SEO meta description \/ focus keyword is empty after publishing<\/h3><\/dt>\n<dd><p>The plugin writes both Yoast SEO and Rank Math meta keys on every publish, but you need the corresponding SEO plugin (Yoast or Rank Math) to be active and at least one of them to be selected in your Sorank publishing settings.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20elementor%3F\"><h3>Does the plugin work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. The plugin includes Elementor compatibility: published posts render correctly both on Elementor-powered blog pages and on sites using Elementor Pro Theme Builder \"Single Post\" templates. The behavior is controlled by the <strong>Elementor Theme Builder compatibility<\/strong> option on the Sorank settings page.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20anything%20when%20i%20am%20not%20publishing%3F\"><h3>Does the plugin send anything when I am not publishing?<\/h3><\/dt>\n<dd><p>No. Outbound calls to Sorank only happen during pairing (initiated by you) and disconnect (initiated by you). Article publishing requests are inbound calls from Sorank to your site, not the other way around.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Allow Sorank to publish when no category is selected. WordPress now assigns the site's default category, while an explicitly selected category is still validated before publishing.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Fix retroactive link edits not appearing on Elementor-built posts: after Sorank updates an already-published article, the plugin now purges Elementor's cached render (compiled CSS and cached element markup) so the refreshed content, including newly added editorial links, shows on the live page instead of a stale version. The update endpoint also reports whether the post is Elementor-managed.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Make plugin version detection robust to security and optimization layers that strip response headers (SiteGround Security Optimizer's \"Hide WordPress version\", Wordfence, Cloudflare). The plugin version is now included in the JSON body of every <code>\/wp-json\/sorank\/v1\/*<\/code> response, so Sorank can connect, sync categories and publish without any hosting change even when the <code>X-Sorank-Plugin-Version<\/code> header is removed. The header is still emitted for backward compatibility.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Add support for editing already-published articles from Sorank. A new <code>\/wp-json\/sorank\/v1\/articles\/update<\/code> endpoint re-sideloads new images, rewrites in-body URLs and refreshes the post (title, content, slug, category, featured image, Yoast and Rank Math meta, Elementor data) in place via <code>wp_update_post<\/code>.<\/li>\n<li>Add a <code>\/wp-json\/sorank\/v1\/articles\/status<\/code> endpoint so Sorank can unpublish an article (revert it to draft) or re-publish it later without creating a duplicate post or changing its URL.<\/li>\n<li>The publishing endpoint now honors a <code>status<\/code> field, enabling Sorank's \"publish as draft\" option so generated articles can be reviewed before going live.<\/li>\n<\/ul>\n\n<h4>2.0.5<\/h4>\n\n<ul>\n<li>Fix recurring disconnections caused by WordPress salt rotation (notably from security plugins like iThemes Security). The token is now encrypted with a per-install secret stored in <code>wp_options<\/code> instead of <code>AUTH_KEY<\/code>, so rotating salts no longer invalidates the stored token. Existing 2.0.x tokens are migrated transparently on first read after upgrade; no re-pairing required for users on a non-rotated site.<\/li>\n<li>Add an anonymized diagnostic ping sent to Sorank when the plugin detects that <code>AUTH_KEY<\/code> has changed since the install fingerprint was recorded. Only the first 8 hex characters of the old and new SHA-256 fingerprints are sent; <code>AUTH_KEY<\/code> itself never leaves the site.<\/li>\n<\/ul>\n\n<h4>2.0.4<\/h4>\n\n<ul>\n<li>Add <code>GET \/sorank\/v1\/articles\/by-slug<\/code> endpoint so Sorank can fetch a post's real permalink instead of synthesizing one. Fixes an edge case where the displayed published URL pointed to the wrong location after a slug collision.<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Remove the optional Plugin URI header from the main plugin file.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Add \"Elementor Theme Builder compatibility\" option in the Sorank settings page. When enabled, articles are saved as plain WordPress posts so a Single Post Theme Builder template (Elementor Pro) applies via its display conditions.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fix Elementor Pro Theme Builder \"Single Post\" templates not applying to articles published via Sorank. Posts now use the default page template so Theme Builder display conditions can match.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>One-click pairing flow from your WordPress admin (no more Application Passwords).<\/li>\n<li>Custom REST API under <code>\/wp-json\/sorank\/v1\/<\/code> that avoids the rate limits of security plugins on <code>\/wp-json\/wp\/v2\/<\/code>.<\/li>\n<li>Single-request publishing: article and all images are handled in one call.<\/li>\n<li>Long-lived bearer token, encrypted at rest with your site <code>AUTH_KEY<\/code>.<\/li>\n<li>Disconnect from either side (WordPress admin or Sorank dashboard).<\/li>\n<li>Publishing preserves Yoast SEO, Rank Math, Elementor and OceanWP compatibility.<\/li>\n<\/ul>","raw_excerpt":"Connect WordPress to Sorank and publish SEO-optimized AI articles with images, metadata, categories, drafts, and scheduled workflows.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/317271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=317271"}],"author":[{"embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sorank"}],"wp:attachment":[{"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=317271"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=317271"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=317271"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=317271"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=317271"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/am.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=317271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}