{"id":335585,"date":"2026-07-05T18:41:40","date_gmt":"2026-07-05T18:41:40","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/contentsops-ai-humanizer-content-writer\/"},"modified":"2026-07-05T18:41:29","modified_gmt":"2026-07-05T18:41:29","slug":"contentsops-ai-humanizer-content-writer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/contentsops-ai-humanizer-content-writer\/","author":23526629,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.6","stable_tag":"1.0.6","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"ContentsOps \u2013 AI Humanizer & Content Writer","header_author":"ContentsOps","header_description":"Connects this WordPress site to ContentsOps to publish AI-written, human-sounding long-form blog posts \u2014 complete with inline images and SEO meta \u2014 directly from your ContentsOps workspace. Pairs securely with a private site key.","assets_banners_color":"","last_updated":"2026-07-05 18:41:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/contentsops.io","header_author_uri":"https:\/\/www.voxinity.io\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":22,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.6":{"tag":"1.0.6","author":"voxinity","date":"2026-07-05 18:41:29"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3597024,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3597024,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.6"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,323,142387,270240,186],"plugin_category":[55],"plugin_contributors":[270241],"plugin_business_model":[],"class_list":["post-335585","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-blog","plugin_tags-content-writer","plugin_tags-humanizer","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-voxinity","plugin_committers-voxinity"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/contentsops-ai-humanizer-content-writer\/assets\/icon-128x128.png?rev=3597024","icon_2x":"https:\/\/ps.w.org\/contentsops-ai-humanizer-content-writer\/assets\/icon-256x256.png?rev=3597024","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>ContentsOps is an AI content platform that writes human-sounding, long-form articles. This companion plugin lets ContentsOps publish those posts (with inline and featured images and SEO meta) to this site over a private REST API authenticated with a site key.<\/p>\n\n<p>It exposes three endpoints under <code>\/wp-json\/contaihu\/v1\/<\/code>:<\/p>\n\n<ul>\n<li><code>GET \/verify<\/code> \u2014 pairing probe returning the site identity.<\/li>\n<li><code>POST \/media<\/code> \u2014 upload one image binary, returns its attachment id + URL.<\/li>\n<li><code>POST \/posts<\/code> \u2014 create a post with inline\/featured images and SEO meta.<\/li>\n<\/ul>\n\n<p>All endpoints require <code>Authorization: Bearer &lt;site key&gt;<\/code>. The site key is verified with a hashed copy (<code>wp_check_password<\/code>), so the plaintext key is only ever shown on the Settings \u2192 ContentsOps screen.<\/p>\n\n<p>SEO meta is written for Yoast SEO, Rank Math, and a native fallback so whatever is active picks it up.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> (or upload the zip via Plugins \u2192 Add New \u2192 Upload Plugin).<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Go to <strong>Settings \u2192 ContentsOps<\/strong>.<\/li>\n<li>Copy the <strong>Site URL<\/strong> and <strong>Site Key<\/strong> and paste them into ContentsOps to pair the site.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20rotate%20the%20site%20key%3F\"><h3>How do I rotate the site key?<\/h3><\/dt>\n<dd><p>Go to Settings \u2192 ContentsOps \u2192 Regenerate key. The previous key stops working immediately; reconnect ContentsOps with the new key.<\/p><\/dd>\n<dt id=\"who%20is%20credited%20as%20the%20author%20of%20published%20posts%3F\"><h3>Who is credited as the author of published posts?<\/h3><\/dt>\n<dd><p>The user selected under \"Author user\". Defaults to the first user who can edit posts.<\/p><\/dd>\n<dt id=\"which%20category%20are%20posts%20published%20to%3F\"><h3>Which category are posts published to?<\/h3><\/dt>\n<dd><p>The category selected under \"Default category\" in Settings \u2192 ContentsOps. If none is selected, the WordPress default category is used. A category sent explicitly by ContentsOps takes precedence.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Add a \"Default category\" setting: pick the category ContentsOps posts are filed under. An explicit category list in the publish request takes precedence; with nothing configured the WordPress default category applies as before.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Rename all functions, classes, constants, options, script handles, post meta keys and the settings page slug to the unique <code>contaihu<\/code> prefix per the WordPress.org prefixing guidelines. Options stored under the old names are migrated automatically, so paired sites keep working.<\/li>\n<li>Move the REST API to the <code>contaihu\/v1<\/code> namespace; the previous namespace keeps working as a deprecated alias for already-paired sites.<\/li>\n<li>Load <code>wp-admin\/includes\/image.php<\/code> only right before generating attachment metadata and stop loading <code>wp-admin\/includes\/file.php<\/code>, which was not needed.<\/li>\n<li>Update the Contributors list to the plugin owner account.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Declare compatibility with WordPress 7.0 (Tested up to).<\/li>\n<li>Match the text domain to the wordpress.org plugin slug (contentsops-ai-humanizer-content-writer).<\/li>\n<li>Restore real PHP 7.4 compatibility by removing PHP 8-only union type declarations.<\/li>\n<li>Reject non-raster image uploads (e.g. SVG) on the media endpoint.<\/li>\n<li>Sanitize incoming Authorization header and admin query flags.<\/li>\n<li>Make the Reveal\/Hide\/Copied button labels translatable.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix WordPress.org plugin review rejection: Author URI pointed to the same URL as Plugin URI. Author URI now points to https:\/\/www.voxinity.io\/.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix featured image not appearing in blog lists: detect the real image type from the binary and store it with the correct extension\/MIME so the thumbnail renders and image sub-sizes are generated.<\/li>\n<li>Fall back to the first inline image as the featured image when no featured media id is supplied.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: site-key auth, verify\/media\/posts endpoints, SEO meta (Yoast, Rank Math, native), Settings screen.<\/li>\n<\/ul>","raw_excerpt":"Publish AI-written, human-sounding long-form blog posts from ContentsOps to this site, with inline images and SEO meta.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335585","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=335585"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/voxinity"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335585"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335585"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335585"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335585"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335585"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}