{"id":307724,"date":"2026-05-10T14:44:32","date_gmt":"2026-05-10T14:44:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/contentsage-connector-by-gts\/"},"modified":"2026-05-11T01:41:06","modified_gmt":"2026-05-11T01:41:06","slug":"contentsage-connector-by-gts","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/contentsage-connector-by-gts\/","author":14742673,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"6.9.4","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"ContentSage Connector by GTS","header_author":"Ganda Tech Services Pty Ltd","header_description":"Connect WordPress to the ContentSage SaaS for AI-generated blog posts with verified citations, automatic internal linking, and SEO optimisation.","assets_banners_color":"","last_updated":"2026-05-11 01:41:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/write-gts.cchk.info","header_author_uri":"https:\/\/g-t-s.com.au","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ashishgurprit","date":"2026-05-10 14:44:12"},"1.0.1":{"tag":"1.0.1","author":"ashishgurprit","date":"2026-05-11 01:41:06"}},"upgrade_notice":{"1.0.1":"<p>Security update. Adds SSRF protection on featured-image URLs and a per-key\nrate limit on the publish endpoint. No configuration changes required.<\/p>","1.0.0":"<p>Initial release. No upgrade steps required.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page showing connection status and API key configuration.","2":"Post editor with the ContentSage meta box displaying generation source, timestamp, and job ID.","3":"An AI-generated post in the Gutenberg editor with native block formatting."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[195933,243233,17569,13175,186],"plugin_category":[55],"plugin_contributors":[260232],"plugin_business_model":[],"class_list":["post-307724","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-content","plugin_tags-blog-automation","plugin_tags-citations","plugin_tags-content-generator","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-ashishgurprit","plugin_committers-ashishgurprit"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/contentsage-connector-by-gts.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>ContentSage Connector is the official WordPress companion plugin for the ContentSage SaaS platform operated by Ganda Tech Services Pty Ltd. ContentSage is a hosted service that researches topics, writes long-form blog posts with verified academic citations, and adds relevant internal links by analysing your existing content. This plugin connects your self-hosted WordPress site to your ContentSage account so that posts created in ContentSage are delivered directly into your WordPress editor as native Gutenberg blocks.<\/p>\n\n<p>The plugin itself does not generate content locally. All AI processing, research, citation verification, and internal-link analysis happen on ContentSage servers; the plugin only receives the finished post payload via an authenticated REST endpoint, converts the supplied HTML to Gutenberg blocks, and creates the WordPress post.<\/p>\n\n<p><strong>Key Features<\/strong><\/p>\n\n<ul>\n<li>AI-Powered Content \u2014 Receive SEO-optimised blog posts generated by ContentSage directly into WordPress.<\/li>\n<li>Verified Citations \u2014 Every fact includes a source citation, maintaining editorial integrity.<\/li>\n<li>Auto Internal Linking \u2014 ContentSage analyses your existing content and adds relevant internal links.<\/li>\n<li>Gutenberg Native \u2014 Content arrives as native Gutenberg blocks: paragraphs, headings (H2\u2013H6), lists, blockquotes, code blocks, and images.<\/li>\n<li>SEO Ready \u2014 Automatically populates meta title and description for Yoast SEO, RankMath, and AIOSEO (v4 Models API).<\/li>\n<li>Draft or Publish \u2014 Posts can arrive as drafts for review, publish immediately, or be scheduled for a future date.<\/li>\n<li>Featured Images \u2014 Featured images are automatically downloaded and added to your Media Library.<\/li>\n<li>Author Attribution \u2014 Assign generated posts to any WordPress author on your site.<\/li>\n<li>Connection Status \u2014 Clear dashboard indicator showing whether your site is connected.<\/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>Go to <strong>Settings \u2192 ContentSage Connector<\/strong> and enter your ContentSage API key.<\/li>\n<li>Your site is now connected. ContentSage can publish content directly to your WordPress installation.<\/li>\n<li>Review and edit posts from your WordPress dashboard before publishing (if using draft mode).<\/li>\n<\/ol>\n\n<h3>External Service<\/h3>\n\n<p>This plugin connects WordPress to the <strong>ContentSage<\/strong> service, a third-party SaaS operated by <strong>Ganda Tech Services Pty Ltd<\/strong> (Australia). The service is required for the plugin to function \u2014 without an active ContentSage account and API key, the plugin has no content to deliver.<\/p>\n\n<p><strong>What the service does<\/strong><\/p>\n\n<p>ContentSage performs AI research, long-form blog post generation, academic citation verification, and internal-link analysis. These operations cannot reasonably be performed locally on a self-hosted WordPress server: they require large language models, web research, and a vector index of your existing site content, all hosted on the ContentSage backend.<\/p>\n\n<p><strong>What data is sent to the service<\/strong><\/p>\n\n<p>The plugin makes outbound HTTPS requests to <code>https:\/\/write-gts.cchk.info<\/code> (the live ContentSage backend) under the following circumstances:<\/p>\n\n<ul>\n<li>When you save your API key in <strong>Settings \u2192 ContentSage Connector<\/strong>, the plugin POSTs to <code>\/api\/v1\/verify-plugin-key<\/code> with: the API key, your <code>site_url<\/code>, your WordPress version, and the plugin version. This is used to validate the key and pair your site to your ContentSage account.<\/li>\n<li>When you click <strong>Test Connection<\/strong> in the settings page, the same request is made to confirm the key is still valid.<\/li>\n<\/ul>\n\n<p>The plugin itself does <strong>not<\/strong> send post content, user data, page views, or any other tracking information to the ContentSage service. Posts move in the opposite direction: ContentSage pushes finished posts <em>into<\/em> WordPress via the plugin's authenticated REST endpoint.<\/p>\n\n<p><strong>Service URLs<\/strong><\/p>\n\n<ul>\n<li>Service Provider: Ganda Tech Services Pty Ltd \u2014 <a href=\"https:\/\/g-t-s.com.au\">https:\/\/g-t-s.com.au<\/a><\/li>\n<li>Service Endpoint: <a href=\"https:\/\/write-gts.cchk.info\">https:\/\/write-gts.cchk.info<\/a><\/li>\n<li>Terms of Service: <a href=\"https:\/\/write-gts.cchk.info\/terms\">https:\/\/write-gts.cchk.info\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/write-gts.cchk.info\/privacy\">https:\/\/write-gts.cchk.info\/privacy<\/a><\/li>\n<li>Support: <a href=\"https:\/\/write-gts.cchk.info\/support\">https:\/\/write-gts.cchk.info\/support<\/a><\/li>\n<\/ul>\n\n<p>You must agree to the ContentSage Terms of Service and Privacy Policy before using the service.<\/p>\n\n<h3>Source Code &amp; Development<\/h3>\n\n<p>This plugin's source code is included in the distributed package \u2014 every file under <code>includes\/<\/code>, <code>assets\/css\/<\/code>, and <code>assets\/js\/<\/code> is plain, human-readable PHP, CSS, and JavaScript. There are no minified bundles, build artifacts, or compiled assets shipped in this plugin: what you see in the zip is the canonical source.<\/p>\n\n<p>The plugin is developed and maintained by <strong>Ganda Tech Services Pty Ltd<\/strong>. Source code is shipped with each release in this directory; development takes place in a private repository, and any contributor wishing to study, modify, or fork the plugin may do so directly from the released source under the GPL-2.0-or-later licence.<\/p>\n\n<p>For support, bug reports, or contribution requests, contact us at <a href=\"https:\/\/write-gts.cchk.info\/support\">https:\/\/write-gts.cchk.info\/support<\/a>.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin stores your ContentSage API key (encrypted with AES-256-CBC) in <code>wp_options<\/code>. No personal data, post content, or user activity is transmitted to ContentSage servers by this plugin \u2014 the plugin only <strong>receives<\/strong> content from the service. The full ContentSage privacy policy (covering the SaaS itself) is published at <a href=\"https:\/\/write-gts.cchk.info\/privacy\">https:\/\/write-gts.cchk.info\/privacy<\/a>.<\/p>\n\n<!--section=installation-->\n<p><strong>Automatic Installation<\/strong><\/p>\n\n<ol>\n<li>Log in to your WordPress dashboard.<\/li>\n<li>Navigate to <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Search for \"ContentSage Connector by GTS\".<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Go to <strong>Settings \u2192 ContentSage Connector<\/strong> and enter your API key.<\/li>\n<\/ol>\n\n<p><strong>Manual Installation<\/strong><\/p>\n\n<ol>\n<li>Download the plugin zip.<\/li>\n<li>Upload the <code>contentsage-connector<\/code> directory to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin under <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Go to <strong>Settings \u2192 ContentSage Connector<\/strong> and enter your API key.<\/li>\n<\/ol>\n\n<p><strong>Requirements<\/strong><\/p>\n\n<ul>\n<li>WordPress 6.2 or higher<\/li>\n<li>PHP 8.0 or higher<\/li>\n<li>A ContentSage account \u2014 sign up at <a href=\"https:\/\/write-gts.cchk.info\">https:\/\/write-gts.cchk.info<\/a><\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20find%20my%20contentsage%20api%20key%3F\"><h3>Where do I find my ContentSage API key?<\/h3><\/dt>\n<dd><p>Log in to your ContentSage account at <a href=\"https:\/\/write-gts.cchk.info\">https:\/\/write-gts.cchk.info<\/a>, navigate to <strong>Settings \u2192 API &amp; Integrations<\/strong>, and copy your Plugin API key.<\/p><\/dd>\n<dt id=\"will%20posts%20be%20published%20immediately%3F\"><h3>Will posts be published immediately?<\/h3><\/dt>\n<dd><p>By default, posts arrive as drafts so you can review them first. You can configure this per-generation in ContentSage to publish immediately or schedule for a future date and time.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20yoast%20seo%2C%20rankmath%2C%20or%20aioseo%3F\"><h3>Does this work with Yoast SEO, RankMath, or AIOSEO?<\/h3><\/dt>\n<dd><p>Yes. If any of these plugins is active, ContentSage Connector will automatically populate the SEO title and meta description fields for each post. AIOSEO is supported via its v4 Models API; Yoast and RankMath are supported via their post-meta keys.<\/p><\/dd>\n<dt id=\"can%20i%20assign%20posts%20to%20a%20specific%20author%3F\"><h3>Can I assign posts to a specific author?<\/h3><\/dt>\n<dd><p>Yes. In ContentSage you can specify the WordPress user ID for author attribution. If no author ID is provided, posts are assigned to the first administrator on the site.<\/p><\/dd>\n<dt id=\"is%20the%20api%20key%20stored%20securely%3F\"><h3>Is the API key stored securely?<\/h3><\/dt>\n<dd><p>Yes. Your API key is encrypted using AES-256-CBC (via PHP's OpenSSL extension) before being written to <code>wp_options<\/code>. The encryption key is derived from your site's unique WordPress authentication salts.<\/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>Deactivating the plugin prevents ContentSage from publishing new content to your site (REST endpoints become unavailable). Your existing posts and all plugin settings are preserved and fully restored when you reactivate.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20uninstall%20the%20plugin%3F\"><h3>What happens if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Uninstalling removes all plugin options (including the stored API key) from <code>wp_options<\/code> and removes all <code>_contentsage_*<\/code> post meta entries. Your published posts are <strong>not<\/strong> deleted.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20with%20wordpress%20multisite%3F\"><h3>Does this plugin work with WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. Uninstall cleanup handles all sub-sites automatically.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20require%20woocommerce%20or%20any%20other%20plugin%3F\"><h3>Does this plugin require WooCommerce or any other plugin?<\/h3><\/dt>\n<dd><p>No. ContentSage Connector is fully standalone.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20free%3F%20are%20any%20features%20locked%3F\"><h3>Is this plugin free? Are any features locked?<\/h3><\/dt>\n<dd><p>The WordPress plugin is free and fully functional. No features are gated, restricted, or locked behind a license. The plugin requires an active ContentSage SaaS account because the AI content generation runs on the service's servers \u2014 pricing for the service is published at <a href=\"https:\/\/write-gts.cchk.info\">https:\/\/write-gts.cchk.info<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li><strong>Security:<\/strong> SSRF defense in the featured-image sideloader. Resolves the\nsupplied image host and rejects URLs that resolve to private, loopback,\nlink-local, or otherwise non-public IPs (RFC1918, 169.254.x, ::1, fc00::\/7).\nPrevents an attacker who controls the API key from pivoting through your\nWordPress host to internal services or cloud metadata endpoints.<\/li>\n<li><strong>Security:<\/strong> HEAD pre-check on featured-image URLs validates Content-Type\nand Content-Length before download. Rejects responses larger than 10 MB\nand content types outside the image whitelist (jpeg\/png\/gif\/webp\/avif).\nStops 5 GB-stream DoS and HTML-disguised-as-image abuse.<\/li>\n<li><strong>Security:<\/strong> Per-key rate limit on <code>POST \/wp-json\/contentsage\/v1\/publish<\/code>\n\u2014 60 publishes per hour and 600 per day per stored API key. Returns\nHTTP 429 when exceeded. Caps can be tuned via the\n  gtscs_publish_rate_limit_hour \/ <code>gtscs_publish_rate_limit_day<\/code> filters.<\/li>\n<li>Internal: counter buckets use a SHA-256 hash of the API key so the\nplaintext key never appears in transient option names.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Settings page (Settings \u2192 ContentSage Connector) with API key management, connection status indicator, and test-connection button.<\/li>\n<li>REST endpoint <code>POST \/wp-json\/contentsage\/v1\/publish<\/code> for receiving AI-generated posts.<\/li>\n<li>REST endpoint <code>GET \/wp-json\/contentsage\/v1\/status<\/code> for connection health checks.<\/li>\n<li>HTML-to-Gutenberg block converter (paragraphs, headings H2\u2013H6, lists, blockquotes, code blocks, images, separators).<\/li>\n<li>Automatic featured-image sideloading into the WordPress Media Library.<\/li>\n<li>SEO meta support for Yoast SEO, RankMath, and AIOSEO (v4 Models API).<\/li>\n<li>ContentSage meta box in the post editor showing provenance details.<\/li>\n<li>AES-256-CBC encryption of stored API keys.<\/li>\n<li>WordPress Multisite support in uninstall cleanup.<\/li>\n<\/ul>","raw_excerpt":"Connect WordPress to the ContentSage SaaS to receive AI-generated blog posts with verified citations and automatic internal linking.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/307724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=307724"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ashishgurprit"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=307724"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=307724"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=307724"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=307724"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=307724"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=307724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}