{"id":329087,"date":"2026-06-23T10:52:49","date_gmt":"2026-06-23T10:52:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gymgrow-connect\/"},"modified":"2026-06-23T10:52:15","modified_gmt":"2026-06-23T10:52:15","slug":"gymgrow-connect","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/gymgrow-connect\/","author":23519906,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.3","stable_tag":"1.0.3","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"GymGrow Connect","header_author":"GymGrow","header_description":"Secure REST endpoints to publish article content, set RankMath SEO fields, and upload images from an external automation pipeline.","assets_banners_color":"","last_updated":"2026-06-23 10:52:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/gymgrow.io","header_author_uri":"https:\/\/github.com\/gymgrow","rating":0,"author_block_rating":0,"active_installs":0,"downloads":28,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.3":{"tag":"1.0.3","author":"gymgrowplugin","date":"2026-06-23 10:52:15"}},"upgrade_notice":{"1.0.3":"<p>Omitting the status parameter now defaults to draft instead of publish, so a post cannot be published without explicitly requesting it.<\/p>","1.0.2":"<p>Hardens the publish permission check so editing an already-published post requires the publish_posts capability even when the status is unchanged.<\/p>","1.0.1":"<p>Hardens the publish permission check so editing an existing post cannot be used to publish without the publish_posts capability.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[569,7143,174174,23853,186],"plugin_category":[55],"plugin_contributors":[268509],"plugin_business_model":[],"class_list":["post-329087","plugin","type-plugin","status-publish","hentry","plugin_tags-automation","plugin_tags-publishing","plugin_tags-rankmath","plugin_tags-rest-api","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-gymgrowplugin","plugin_committers-gymgrowplugin"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/gymgrow-connect.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>GymGrow Connect adds a small set of secure REST API endpoints under the <code>gymgrow\/v1<\/code> namespace so an external system (for example, an AI content pipeline) can:<\/p>\n\n<ul>\n<li>Create or update a post \u2014 title, content, excerpt, slug, categories, tags, schedule date \u2014 in a single request.<\/li>\n<li>Set RankMath SEO fields (SEO title, meta description, focus keyword, canonical URL, robots) on the same request or on an existing post.<\/li>\n<li>Upload an image from a multipart file or a remote URL, set its alt text, and optionally assign it as the featured image.<\/li>\n<\/ul>\n\n<p>It replaces ad-hoc <code>functions.php<\/code> snippets with a versioned, capability-checked plugin.<\/p>\n\n<h4>Endpoints<\/h4>\n\n<ul>\n<li><code>POST \/wp-json\/gymgrow\/v1\/article<\/code> \u2014 publish\/update an article (also sets SEO and featured image).<\/li>\n<li><code>POST \/wp-json\/gymgrow\/v1\/media<\/code> \u2014 upload an image.<\/li>\n<li><code>POST \/wp-json\/gymgrow\/v1\/seo\/{id}<\/code> \u2014 update RankMath SEO fields for a post.<\/li>\n<\/ul>\n\n<p>A backward-compatible alias <code>POST \/wp-json\/custom\/v1\/rankmath\/{id}<\/code> is also registered for pipelines that used the legacy route.<\/p>\n\n<h4>Authentication<\/h4>\n\n<p>Requests are authenticated with WordPress's own user authentication \u2014 use an Application Password (Basic Auth) for a user who can publish posts. Permissions are enforced per route with capability checks (<code>publish_posts<\/code>, <code>upload_files<\/code>, <code>edit_post<\/code>). You may optionally enable a second-factor shared secret (<code>X-GymGrow-Key<\/code> header) from the settings screen.<\/p>\n\n<p>This plugin does not call any external services and stores no personal data.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>gymgrow-connect<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP via Plugins \u2192 Add New \u2192 Upload Plugin.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>(Optional) Visit Settings \u2192 GymGrow Connect to generate an API key, choose a default category, and set a default status.<\/li>\n<li>Create an Application Password for the publishing user under Users \u2192 Profile, and use it as Basic Auth in your pipeline.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20require%20rankmath%3F\"><h3>Does it require RankMath?<\/h3><\/dt>\n<dd><p>No. If RankMath is active the SEO fields take effect immediately. If not, the meta is still stored under the RankMath meta keys and becomes live once RankMath is installed.<\/p><\/dd>\n<dt id=\"how%20are%20the%20endpoints%20secured%3F\"><h3>How are the endpoints secured?<\/h3><\/dt>\n<dd><p>Every route has a capability-based <code>permission_callback<\/code>. Publishing requires <code>publish_posts<\/code>, uploads require <code>upload_files<\/code>, and SEO updates require <code>edit_post<\/code> on the target post. You can additionally require a matching <code>X-GymGrow-Key<\/code> header.<\/p><\/dd>\n<dt id=\"does%20it%20send%20data%20anywhere%3F\"><h3>Does it send data anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin only receives requests; it does not phone home or contact third-party services.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Security: omitting the <code>status<\/code> parameter now creates or updates a draft instead of publishing. Publishing requires explicitly passing <code>status=publish<\/code>, which remains gated by the <code>publish_posts<\/code> capability.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Security: editing an existing post that is already published, private, or scheduled (future) now requires the <code>publish_posts<\/code> capability even when the request does not change the status.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: the article endpoint now requires the <code>publish_posts<\/code> capability when an update changes a post to a published, private, or scheduled (future) status, not just <code>edit_post<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: article publish endpoint, media upload endpoint, RankMath SEO endpoint, optional API key, settings screen.<\/li>\n<\/ul>","raw_excerpt":"Secure REST endpoints to publish article content, set RankMath SEO fields, and upload images from an external automation pipeline.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329087","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=329087"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gymgrowplugin"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329087"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329087"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329087"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329087"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329087"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}