@jskit-ai/connectors-catalog 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
# WordPress.com
|
|
2
|
+
|
|
3
|
+
Import `wordpressComProvider` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/server/wordpress-com`. This fragment uses an own
|
|
5
|
+
OAuth web registration for profile/site reads, post/page publishing and media management. It is distinct from
|
|
6
|
+
self-hosted WordPress Application Password authentication.
|
|
7
|
+
|
|
8
|
+
## Register and configure
|
|
9
|
+
|
|
10
|
+
1. Sign into WordPress.com. Open the [Applications Manager](https://developer.wordpress.com/apps/)
|
|
11
|
+
and choose **Create New Application**.
|
|
12
|
+
2. Enter its name and description and the exact backend **Redirect URL**, then
|
|
13
|
+
choose **Create**. Retain the Client ID and store the Client Secret privately.
|
|
14
|
+
[Provider's registration walkthrough](https://github.com/Automattic/rest-api-console#configuring-the-console).
|
|
15
|
+
3. Put the secret in `WORDPRESS_COM_CLIENT_SECRET` and the full callback URL in
|
|
16
|
+
`WORDPRESS_COM_CALLBACK_URL`. Enter the ID and these references in the editor.
|
|
17
|
+
4. Keep `users` for verification. Select `sites` for site listing and `posts` for
|
|
18
|
+
post reads and publishing. Save configuration, then start consent through the runtime.
|
|
19
|
+
|
|
20
|
+
Server-to-server requests do not require each editor VM to be a JavaScript
|
|
21
|
+
origin. Browser API access instead has its own configured-origin requirements;
|
|
22
|
+
this fragment keeps provider tokens on the backend.
|
|
23
|
+
[Browser access](https://developer.wordpress.com/docs/api/rest-api-javascript/).
|
|
24
|
+
|
|
25
|
+
The OAuth flow uses `public-api.wordpress.com/oauth2/authorize` and
|
|
26
|
+
`/oauth2/token`, with an exact registered redirect URI. It requests granular
|
|
27
|
+
permissions rather than `global`; provider selection limits site access. The
|
|
28
|
+
`posts` permission allows both reads and management; the application must authorize each publishing action.
|
|
29
|
+
[OAuth and scopes](https://developer.wordpress.com/docs/api/oauth2/).
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"schemaVersion": 1,
|
|
34
|
+
"registrations": {
|
|
35
|
+
"wordpress": {
|
|
36
|
+
"source": "own",
|
|
37
|
+
"clientId": "YOUR_ASSIGNED_CLIENT_ID",
|
|
38
|
+
"clientSecretRef": "env:WORDPRESS_COM_CLIENT_SECRET",
|
|
39
|
+
"callbackUrlRef": "env:WORDPRESS_COM_CALLBACK_URL"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"integrations": {
|
|
43
|
+
"publishing": {
|
|
44
|
+
"provider": "wordpress-com",
|
|
45
|
+
"displayName": "Publishing account",
|
|
46
|
+
"accountMode": "per-user",
|
|
47
|
+
"scopes": ["users", "sites", "posts"],
|
|
48
|
+
"authentication": { "method": "oauth2", "registrationRef": "wordpress" }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The editor offers shared, per-user and assistant ownership. Choose per-user
|
|
55
|
+
when each application user connects independently. Select media permission to upload and manage attachments. Comments enables discussion and moderation operations. Stats provides the site summary; taxonomy provides category/tag management.
|
|
56
|
+
Batch enables bounded read batches; each underlying resource remains subject to provider permissions.
|
|
57
|
+
All five optional permission families default off. Configuration
|
|
58
|
+
does not itself grant access or implement login.
|
|
59
|
+
|
|
60
|
+
## Runtime and AI composition
|
|
61
|
+
|
|
62
|
+
Use the [OAuth file-connection pattern](../patterns/oauth-connection/PATTERN.md).
|
|
63
|
+
The provider adapter and connection lifecycle are imported JSKIT code. CLI and
|
|
64
|
+
editor use the same JSON, with encrypted text runtime files outside source;
|
|
65
|
+
no editor, database or generator is needed.
|
|
66
|
+
|
|
67
|
+
Verification reads `/rest/v1.1/me` with a limited fields selection, including
|
|
68
|
+
`token_scope`, `token_client_id` and `token_site_id`. These fields describe the
|
|
69
|
+
issued token's permissions and ownership.
|
|
70
|
+
[Profile response](https://developer.wordpress.com/docs/api/1.1/get/me/).
|
|
71
|
+
The adapter rejects a mismatched client and retains only permissions present
|
|
72
|
+
in the request, token response when supplied, and verified profile. Missing
|
|
73
|
+
`users` permission fails verification without replacing an existing grant.
|
|
74
|
+
It does not use a successful public post listing to authenticate the account.
|
|
75
|
+
|
|
76
|
+
The runtime sends comma-separated scopes following the provider examples.
|
|
77
|
+
It sends state and PKCE parameters; provider-side PKCE enforcement has not been
|
|
78
|
+
established by these local tests. The documented code-token example has no
|
|
79
|
+
expiry or refresh token. This adapter does not invent either: an explicit
|
|
80
|
+
expiry without refresh or a later 401 requires consent again. An absent expiry
|
|
81
|
+
does not promise permanent access. Local disconnect does not revoke the
|
|
82
|
+
provider grant; manage provider access separately.
|
|
83
|
+
|
|
84
|
+
`sites.list` accepts `site_visibility` (all/visible/hidden) and `site_activity`
|
|
85
|
+
(all/active/inactive), both defaulting to all. It returns the accessible `sites`
|
|
86
|
+
array in its provider envelope; no all-sites `global` grant is requested.
|
|
87
|
+
[Sites](https://developer.wordpress.com/docs/api/1.1/get/me/sites/).
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
const sites = await connections.invoke({ context, integrationId: "publishing", operation: "sites.list" });
|
|
91
|
+
const page = await connections.invoke({
|
|
92
|
+
context, integrationId: "publishing", operation: "posts.list",
|
|
93
|
+
input: { siteId: 81, number: 20, status: "publish", context: "display" }
|
|
94
|
+
});
|
|
95
|
+
// If page.meta.next_page is present, pass it as page_handle on an explicit next call.
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`posts.list` accepts a numeric site ID, `number` (1–100, default 20), an opaque
|
|
99
|
+
`page_handle`, `search`, `status` and display/edit `context`. The result retains
|
|
100
|
+
`found`, `posts` and `meta.next_page`; no next page is fetched automatically.
|
|
101
|
+
[Post listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/posts/).
|
|
102
|
+
The fragment bounds cursor length to 4096 and search to 500 characters. Site
|
|
103
|
+
domains/URLs are deliberately excluded from operation input. All authenticated
|
|
104
|
+
requests stay on `public-api.wordpress.com`, redirects fail, and returned site
|
|
105
|
+
URLs remain data. Applications own authorization and safe rendering of HTML.
|
|
106
|
+
|
|
107
|
+
## Application ownership, callbacks and capacity
|
|
108
|
+
|
|
109
|
+
An AI can prepare configuration, callback wiring and library composition.
|
|
110
|
+
The reviewed registration instructions establish a dashboard flow, not a
|
|
111
|
+
supported public API for provisioning OAuth clients. Initial registration and
|
|
112
|
+
provider consent remain owner steps; do not invent a client-creation endpoint.
|
|
113
|
+
|
|
114
|
+
The application owner creates the provider registration and stores its secret
|
|
115
|
+
in the application's private Env. Public Vibe64, Vibe64 Online and CLI users use
|
|
116
|
+
this same ownership model. The configuration file holds the client ID and Env
|
|
117
|
+
references; the editor does not own the application's grants.
|
|
118
|
+
|
|
119
|
+
Register the exact callback implemented by the application. For a hosted project,
|
|
120
|
+
start with its assigned application URL and append the implemented callback path.
|
|
121
|
+
Save that same URL through the application's callback Env reference. On a domain
|
|
122
|
+
or host change, update both the provider registration and callback Env if the URL
|
|
123
|
+
changes. Preserve the application's identity and persistent grant store when
|
|
124
|
+
moving it; neither a new editor URL nor a new hosting address creates a new owner.
|
|
125
|
+
See the [callback guide](../../connectors-core/docs/oauth-callbacks.md) and
|
|
126
|
+
[application setup command](../../connectors-core/docs/setup-command.md).
|
|
127
|
+
|
|
128
|
+
Separate client IDs distinguish registration ownership and revocation. They do
|
|
129
|
+
not prove independent quota pools: provider limits can include shared user/site
|
|
130
|
+
or infrastructure boundaries. Automattic's guidelines prohibit excessive API
|
|
131
|
+
traffic and allow access limits.
|
|
132
|
+
[API usage guidance](https://developer.wordpress.com/docs/api/guidelines-for-responsible-use-of-automattics-apis/).
|
|
133
|
+
|
|
134
|
+
## Focused evidence
|
|
135
|
+
|
|
136
|
+
Six provider tests use simulated HTTP and real encrypted JSON files. They cover
|
|
137
|
+
client verification, reduced scopes, cancellation, replay, persistence, owner
|
|
138
|
+
isolation, post paging, malformed replies and reconnect/error behavior. The
|
|
139
|
+
shared OAuth test additionally proves that refresh cannot restore permissions
|
|
140
|
+
removed during verification. Editor proof covers registration references,
|
|
141
|
+
permission selections and reload. No live signup, consent, provider calls or
|
|
142
|
+
sample-app generation are included. Login is not supplied. Publishing, media, comments, statistics, taxonomy and bounded batches have additional controlled fixtures; final package/UI acceptance is recorded separately.
|
|
143
|
+
|
|
144
|
+
## Post and page publishing
|
|
145
|
+
|
|
146
|
+
`posts.get` retrieves one numeric `siteId`/`postId`, defaulting to `context: edit`.
|
|
147
|
+
`posts.create` takes a title plus optional content, excerpt, slug, status, type,
|
|
148
|
+
parent, featured_image and publicize. Creation explicitly defaults to `draft`,
|
|
149
|
+
`type: post` and `publicize: false`; `type: page` creates a page. `posts.list` can
|
|
150
|
+
filter either type. The same update/delete/restore operations apply to both.
|
|
151
|
+
|
|
152
|
+
`posts.update` requires a post ID and at least one changed field. It sends only
|
|
153
|
+
the supplied changes, preserving empty content/excerpts and an empty
|
|
154
|
+
`featured_image` to clear the attachment. Supply the attachment ID as a string
|
|
155
|
+
to set it. Scheduling/custom types and combined upload-and-publish are not yet
|
|
156
|
+
supplied. Publishing is explicit; the application owns who may publish and
|
|
157
|
+
whether publicizing through external services is allowed.
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
const draft = await connections.invoke({
|
|
161
|
+
context, integrationId: "publishing", operation: "posts.create",
|
|
162
|
+
input: { siteId: 81, type: "page", title: "Opening hours", content: "<p>9–5</p>" }
|
|
163
|
+
});
|
|
164
|
+
// After the application obtains the author's approval:
|
|
165
|
+
await connections.invoke({
|
|
166
|
+
context, integrationId: "publishing", operation: "posts.update",
|
|
167
|
+
input: { siteId: 81, postId: draft.ID, status: "publish", publicize: false }
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
A native framework makes authenticated form-encoded POSTs to
|
|
172
|
+
`/rest/v1.1/sites/{siteId}/posts/new` and `/posts/{postId}` using the app-owned
|
|
173
|
+
token. It must explicitly choose draft status at creation: the provider's own
|
|
174
|
+
default is publish. Preserve text/HTML exactly in transport and apply suitable
|
|
175
|
+
HTML handling in the application UI.
|
|
176
|
+
[Create](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/new/),
|
|
177
|
+
[edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/).
|
|
178
|
+
|
|
179
|
+
`posts.delete` requires `confirmDeletion: true`. This is deliberately called
|
|
180
|
+
delete, not trash: with trash enabled it normally trashes a post, but a second
|
|
181
|
+
call can permanently delete it; sites without trash can delete immediately.
|
|
182
|
+
Inspect the returned status and never blindly repeat an uncertain request.
|
|
183
|
+
`posts.restore` returns a trashed post to its previous status, which may be
|
|
184
|
+
published. The runtime performs no automatic write retries or rollback.
|
|
185
|
+
[Delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/delete/),
|
|
186
|
+
[restore](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/restore/).
|
|
187
|
+
|
|
188
|
+
## Media workflow
|
|
189
|
+
|
|
190
|
+
Select `media` before consent (reconnect if the current grant lacks it).
|
|
191
|
+
`media.list` supports bounded `number`, opaque `page_handle`, `search`, `post_ID`
|
|
192
|
+
and `mime_type`. It retains the provider envelope and `meta.next_page`; pass that
|
|
193
|
+
value as a cursor, never fetch it as a URL. `post_ID: 0` finds unattached items.
|
|
194
|
+
`media.get` takes a numeric mediaId. Returned media URLs are data, not automatically
|
|
195
|
+
downloaded. The app owns access checks and safe image/HTML presentation.
|
|
196
|
+
[Media listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/media/).
|
|
197
|
+
|
|
198
|
+
`media.upload` accepts one filename, MIME type and canonical `contentBase64`
|
|
199
|
+
(up to 5 MiB decoded), plus title, caption, description, alt and parent_id. It
|
|
200
|
+
encodes `media[0]` and `attrs[0][field]` multipart fields. It does not fetch file
|
|
201
|
+
paths or supplied URLs. The provider enforces allowed types, account storage and
|
|
202
|
+
upload permissions; this limit is the helper's memory bound, not a provider limit.
|
|
203
|
+
A native framework can use its multipart HTTP client with these same field names
|
|
204
|
+
and its app-owned Bearer token.
|
|
205
|
+
|
|
206
|
+
```js
|
|
207
|
+
const result = await connections.invoke({
|
|
208
|
+
context, integrationId: "publishing", operation: "media.upload",
|
|
209
|
+
input: { siteId: 81, filename: "hours.png", mimeType: "image/png",
|
|
210
|
+
contentBase64: imageBytes.toString("base64"), alt: "Opening hours" }
|
|
211
|
+
});
|
|
212
|
+
// Persist returned media IDs before any later operation, and present errors.
|
|
213
|
+
if (Object.keys(result.media_errors ?? {}).length || result.media.length !== 1) {
|
|
214
|
+
// Let the author review partial results; do not automatically upload again.
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
await connections.invoke({
|
|
218
|
+
context, integrationId: "publishing", operation: "posts.update",
|
|
219
|
+
input: { siteId: 81, postId: draft.ID, featured_image: String(result.media[0].ID) }
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The result keeps `media` and `media_errors`, including a failed upload represented
|
|
224
|
+
by an empty media array. A valid HTTP response alone does not mean every file
|
|
225
|
+
was uploaded. If attachment succeeds and updating the draft fails, the app can
|
|
226
|
+
retry only the post update or explicitly remove the orphan attachment; no
|
|
227
|
+
automatic rollback is performed.
|
|
228
|
+
[Upload](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/new/).
|
|
229
|
+
|
|
230
|
+
`media.update` edits metadata sparsely; an empty alt/caption clears it and
|
|
231
|
+
parent_id changes the attached post. `media.delete` requires
|
|
232
|
+
`confirmDeletion: true` and permanently removes the item. It is not a trash
|
|
233
|
+
action. No automatic retry, binary download, URL sideloading, multiple-file
|
|
234
|
+
request or video-specific settings are supplied. The app may compose repeated
|
|
235
|
+
explicit uploads and inspect each outcome.
|
|
236
|
+
[Edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/$media_ID/),
|
|
237
|
+
[delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/$media_ID/delete/).
|
|
238
|
+
|
|
239
|
+
## Comments and moderation
|
|
240
|
+
|
|
241
|
+
Select `comments` and reconnect if an existing grant lacks it. The provider
|
|
242
|
+
still enforces the site's commenting and moderation permissions. The app owns
|
|
243
|
+
its discussion screen, spam policy and which people can act as the connected
|
|
244
|
+
account. A shared account does not identify every app user as a WordPress author.
|
|
245
|
+
|
|
246
|
+
`comments.list` supports number (1–100), page, order and approved/unapproved/spam/
|
|
247
|
+
trash/all status, returning the provider's count and comment records.
|
|
248
|
+
`comments.get` reads one commentId. `comments.create` takes postId/content;
|
|
249
|
+
`comments.reply` takes commentId/content. Both send the exact content using
|
|
250
|
+
form encoding, and return the resulting moderation status. Creation may become
|
|
251
|
+
public immediately under the site's rules; there is no local draft queue.
|
|
252
|
+
[Listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/comments/),
|
|
253
|
+
[post reply](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/replies/new/),
|
|
254
|
+
[comment reply](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/replies/new/).
|
|
255
|
+
|
|
256
|
+
`comments.update` requires an explicit status even when editing content, because
|
|
257
|
+
the provider defaults to approval. Use unapproved to keep a comment under review,
|
|
258
|
+
approved to publish, spam/unspam or trash/untrash for moderation. Unspam/untrash
|
|
259
|
+
can restore visibility. `comments.delete` requires confirmDeletion: true; inspect
|
|
260
|
+
the returned status because deletion may be permanent. Neither operation retries
|
|
261
|
+
automatically. Author identity edits, hierarchical listing and likes are not
|
|
262
|
+
supplied. The native-framework equivalent uses the same comments routes and
|
|
263
|
+
form fields with the application's token.
|
|
264
|
+
[Edit/moderate](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/),
|
|
265
|
+
[delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/delete/).
|
|
266
|
+
|
|
267
|
+
```js
|
|
268
|
+
const queue = await connections.invoke({
|
|
269
|
+
context, integrationId: "publishing", operation: "comments.list",
|
|
270
|
+
input: { siteId: 81, status: "unapproved", number: 20, page: 1 }
|
|
271
|
+
});
|
|
272
|
+
// After an authorized moderator selects a comment:
|
|
273
|
+
await connections.invoke({
|
|
274
|
+
context, integrationId: "publishing", operation: "comments.update",
|
|
275
|
+
input: { siteId: 81, commentId: selectedCommentId, status: "approved" }
|
|
276
|
+
});
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Statistics and taxonomy
|
|
280
|
+
|
|
281
|
+
Select `stats` and reconnect to read `stats.read({siteId})`. It preserves the
|
|
282
|
+
provider's date, statistics and visits structures, including zero counts. The
|
|
283
|
+
app should label the returned reporting date and render the returned metric
|
|
284
|
+
keys; this is not live tracking, a scheduled collector or an analytics dashboard.
|
|
285
|
+
Site/account entitlements still apply. Native frameworks use an authenticated
|
|
286
|
+
GET to `/rest/v1.1/sites/{siteId}/stats`.
|
|
287
|
+
[Site statistics](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/stats/).
|
|
288
|
+
|
|
289
|
+
Select `taxonomy` for `categories` and `tags` operations. Each supports list, get,
|
|
290
|
+
create, update and delete. Lists accept number (1–1000), page and search. Get,
|
|
291
|
+
update and delete use the returned termSlug, encoded as one path segment.
|
|
292
|
+
Creation requires name, with optional description and a numeric parent for
|
|
293
|
+
categories. Updates are sparse; deletion requires confirmDeletion: true. The
|
|
294
|
+
provider owns default-category constraints and the effect on existing posts.
|
|
295
|
+
Renaming may change the returned slug; use that new value for later requests.
|
|
296
|
+
No automatic deletion recovery or term synchronization is supplied.
|
|
297
|
+
|
|
298
|
+
```js
|
|
299
|
+
const category = await connections.invoke({
|
|
300
|
+
context, integrationId: "publishing", operation: "categories.create",
|
|
301
|
+
input: { siteId: 81, name: "Opening hours", description: "Business news" }
|
|
302
|
+
});
|
|
303
|
+
await connections.invoke({
|
|
304
|
+
context, integrationId: "publishing", operation: "posts.update",
|
|
305
|
+
input: { siteId: 81, postId: draft.ID, categories: [category.ID] }
|
|
306
|
+
});
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Post create/update accepts existing numeric category/tag IDs, at most 100 each.
|
|
310
|
+
These replace the supplied taxonomy selection; omitted fields stay untouched.
|
|
311
|
+
Empty lists request clearing, subject to the site's default-category behavior.
|
|
312
|
+
The app owns selecting IDs and retaining desired existing assignments. This
|
|
313
|
+
post operation needs posts permission; managing the terms themselves needs
|
|
314
|
+
taxonomy permission. Custom taxonomies are not supplied.
|
|
315
|
+
|
|
316
|
+
Native frameworks use the same category/tag routes, form-encoded writes and
|
|
317
|
+
`slug:{encodedSlug}` targets. Retain successful term creation if a later post
|
|
318
|
+
assignment fails; retry the assignment explicitly instead of creating duplicates.
|
|
319
|
+
[Category list](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/categories/),
|
|
320
|
+
[create](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/categories/new/),
|
|
321
|
+
[edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/categories/slug:$category/),
|
|
322
|
+
[tag and taxonomy reference](https://developer.wordpress.com/docs/api/rest-api-reference/).
|
|
323
|
+
|
|
324
|
+
## Read batches
|
|
325
|
+
|
|
326
|
+
`batch.read` accepts siteId and one to six distinct resources selected from posts,
|
|
327
|
+
media, comments, categories, tags and stats. It builds GET-only endpoint paths for
|
|
328
|
+
one numeric site and requests 20 records per collection. It never accepts a URL,
|
|
329
|
+
write action, arbitrary endpoint or cross-site batch. Use individual list calls
|
|
330
|
+
for pagination/filtering and explicit writes for publishing. No transactional
|
|
331
|
+
write batch exists in this helper.
|
|
332
|
+
|
|
333
|
+
Select `batch` and the permissions for the resources you intend to read, then
|
|
334
|
+
reconnect. Local invocation checks batch permission; WordPress.com checks access
|
|
335
|
+
to each nested resource. The app must also authorize its resource selection and
|
|
336
|
+
siteId; do not expose an unrestricted batch route to app users. The returned
|
|
337
|
+
object keeps each endpoint's result or error. An outer success does not mean all
|
|
338
|
+
reads succeeded, and this operation does not normalize or retry individual errors.
|
|
339
|
+
|
|
340
|
+
```js
|
|
341
|
+
const results = await connections.invoke({
|
|
342
|
+
context, integrationId: "publishing", operation: "batch.read",
|
|
343
|
+
input: { siteId: 81, resources: ["posts", "media"] }
|
|
344
|
+
});
|
|
345
|
+
for (const [endpoint, result] of Object.entries(results)) {
|
|
346
|
+
// Route provider errors to the app's feedback UI and render successful data.
|
|
347
|
+
if (result.error) showResourceError(endpoint, result.error);
|
|
348
|
+
else showResourceData(endpoint, result);
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Native frameworks send authenticated GET `/rest/v1.3/batch/` with repeated
|
|
353
|
+
`urls[]` query values such as `/sites/81/posts?context=edit&number=20`. Paths are
|
|
354
|
+
relative endpoints, not external URLs. The provider client returns results keyed
|
|
355
|
+
by endpoint.
|
|
356
|
+
[Batch API](https://developer.wordpress.com/docs/api/1.1/get/batch/),
|
|
357
|
+
[current client](https://github.com/Automattic/wp-calypso/blob/trunk/packages/wpcom.js/src/lib/batch.js),
|
|
358
|
+
[official archived composition test](https://github.com/Automattic/wpcom.js/blob/master/test/test.wpcom.batch.js).
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# WordPress (self-hosted)
|
|
2
|
+
|
|
3
|
+
Import `wordpressSelfHostedProvider` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/server/wordpress-self-hosted`. It verifies an
|
|
5
|
+
authenticated WordPress user and manages posts, pages, media and users under that
|
|
6
|
+
account. It does not implement
|
|
7
|
+
WordPress.com OAuth or application-user login.
|
|
8
|
+
|
|
9
|
+
## Manual setup
|
|
10
|
+
|
|
11
|
+
1. Sign into the HTTPS site's dashboard. Open **Users**, then edit the intended
|
|
12
|
+
user's profile. Record that user's login name.
|
|
13
|
+
2. Find **Application Passwords**, enter a name such as `my-app-reader`, and
|
|
14
|
+
choose **Add New Application Password**. Copy the displayed password.
|
|
15
|
+
3. Store it as `WORDPRESS_APPLICATION_PASSWORD` in the backend environment.
|
|
16
|
+
In the editor enter **Site URL**, **Username** and **Application password
|
|
17
|
+
reference** (`env:WORDPRESS_APPLICATION_PASSWORD`). Save configuration.
|
|
18
|
+
|
|
19
|
+
Application Passwords authenticate through HTTPS Basic authentication and are
|
|
20
|
+
available in WordPress core from 5.6. Use an Application Password rather than
|
|
21
|
+
the user's interactive login password.
|
|
22
|
+
[Authentication](https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/).
|
|
23
|
+
|
|
24
|
+
The profile shows each password's name and revocation control. Hosting or
|
|
25
|
+
plugins can disable this facility; the administrator must enable the intended
|
|
26
|
+
access if it is unavailable. The owning user's role remains relevant to which
|
|
27
|
+
resources are accessible.
|
|
28
|
+
[Application Passwords integration guide](https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/).
|
|
29
|
+
|
|
30
|
+
## Portable configuration and runtime
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"schemaVersion": 1,
|
|
35
|
+
"registrations": {},
|
|
36
|
+
"integrations": {
|
|
37
|
+
"publishing": {
|
|
38
|
+
"provider": "wordpress-self-hosted",
|
|
39
|
+
"displayName": "Company posts",
|
|
40
|
+
"accountMode": "shared",
|
|
41
|
+
"scopes": [],
|
|
42
|
+
"authentication": {
|
|
43
|
+
"method": "api-key",
|
|
44
|
+
"secretRef": "env:WORDPRESS_APPLICATION_PASSWORD"
|
|
45
|
+
},
|
|
46
|
+
"settings": {
|
|
47
|
+
"siteUrl": "https://publisher.example/blog/",
|
|
48
|
+
"username": "editor"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`api-key` is the common credential-reference configuration method; the provider
|
|
56
|
+
runtime turns this username/password pair into the correct Basic header. It
|
|
57
|
+
never inserts the password into a URL or source file. The site URL includes
|
|
58
|
+
the installation path but excludes `/wp-json`. Usernames reject colons and
|
|
59
|
+
control characters and are limited to 60 characters by this fragment.
|
|
60
|
+
|
|
61
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with
|
|
62
|
+
`providers: [wordpressSelfHostedProvider]`, environment resolution and the file
|
|
63
|
+
connection store. CLI and editor share the same schema and JSON. Runtime state
|
|
64
|
+
uses encrypted text files outside source. No database or editor is required
|
|
65
|
+
by the consuming application.
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
await connections.connectApiKey({ context, integrationId: "publishing" });
|
|
69
|
+
const posts = await connections.invoke({
|
|
70
|
+
context, integrationId: "publishing", operation: "posts.list",
|
|
71
|
+
input: { page: 1, per_page: 20, status: "publish", context: "view" }
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Verification uses `GET /wp-json/wp/v2/users/me`, requiring a user object with
|
|
76
|
+
an ID, name and slug. An unauthenticated public-post response cannot verify
|
|
77
|
+
the account. `users.me` is also callable without input after connection.
|
|
78
|
+
[User endpoints](https://developer.wordpress.org/rest-api/reference/users/).
|
|
79
|
+
|
|
80
|
+
`posts.list` reads `/wp-json/wp/v2/posts`. Its default is ten published posts,
|
|
81
|
+
page 1 and view context. Optional `search` filters results; draft/private reads
|
|
82
|
+
require the owning user's access. Select `context: "edit"` explicitly when
|
|
83
|
+
needed. The response includes provider fields such as rendered titles/content.
|
|
84
|
+
[Posts](https://developer.wordpress.org/rest-api/reference/posts/).
|
|
85
|
+
|
|
86
|
+
This fragment bounds `per_page` to 1–100, `page` to 1–100000 and search to 500
|
|
87
|
+
characters. It accepts statuses publish/future/draft/pending/private and
|
|
88
|
+
contexts view/edit/embed. It returns one array; pagination headers and automatic
|
|
89
|
+
traversal are not exposed. An empty array is valid; malformed records and error
|
|
90
|
+
objects fail validation. Returned HTML and links are data. The application owns
|
|
91
|
+
safe HTML rendering and does not automatically fetch embedded links.
|
|
92
|
+
|
|
93
|
+
The configured destination may be an operator-owned private HTTPS host or use
|
|
94
|
+
a nondefault port. Embedded URL credentials, query strings, fragments and
|
|
95
|
+
parent-path segments are rejected. This validation is not DNS/SSRF filtering:
|
|
96
|
+
the application controls who can edit destinations and its outbound-network
|
|
97
|
+
policy. Operations cannot supply another host; redirects fail instead of
|
|
98
|
+
forwarding credentials. Changing site, path or username requires verification
|
|
99
|
+
again. Updating the environment binding rotates the password. Disconnect
|
|
100
|
+
removes local state; revoke the provider password separately.
|
|
101
|
+
|
|
102
|
+
## Posts and pages publishing
|
|
103
|
+
|
|
104
|
+
Both `posts` and `pages` expose `.get`, `.create`, `.update` and `.trash`.
|
|
105
|
+
`pages.list` accepts the same page/per_page/search/context inputs as posts,
|
|
106
|
+
with publish/draft/pending/private status filters. All requests use the configured
|
|
107
|
+
site and installation path, authenticate with its Application Password and rely
|
|
108
|
+
on WordPress to enforce that user's capabilities. A successful `users.me` check
|
|
109
|
+
does not establish permission to edit or publish.
|
|
110
|
+
|
|
111
|
+
- `.get`: positive integer `id` and optional view/edit/embed `context`.
|
|
112
|
+
- `.create`: nonempty `title`, optional `content`, `excerpt`, `slug`, `status`,
|
|
113
|
+
`featured_media`, `comment_status`; omitted status creates a draft.
|
|
114
|
+
- `.update`: `id` and at least one of those fields. Omitted fields remain
|
|
115
|
+
untouched. Empty content/excerpt clears it; `featured_media: 0` removes the
|
|
116
|
+
featured image. Page operations also accept `parent` (0 for none) and
|
|
117
|
+
`menu_order` (signed integer).
|
|
118
|
+
- `.trash`: `id`; sends DELETE with `force=false`. Permanent deletion cannot be
|
|
119
|
+
requested through this operation. A site with trash disabled can reject it.
|
|
120
|
+
|
|
121
|
+
Supported write statuses are draft/pending/private/publish. Scheduling, custom
|
|
122
|
+
post types/fields, taxonomy editing and permanent deletion are not provided by
|
|
123
|
+
these operations. Raw content and excerpt whitespace is preserved, including
|
|
124
|
+
block markup. The framework must handle authoring/rendering HTML appropriately;
|
|
125
|
+
these methods are not a visual editor or HTML sanitizer.
|
|
126
|
+
[Posts](https://developer.wordpress.org/rest-api/reference/posts/),
|
|
127
|
+
[pages](https://developer.wordpress.org/rest-api/reference/pages/).
|
|
128
|
+
|
|
129
|
+
For a simple publishing workflow, create a draft, show the returned content and
|
|
130
|
+
link to an authorized reviewer, then make an explicit publish request:
|
|
131
|
+
|
|
132
|
+
```js
|
|
133
|
+
const draft = await connections.invoke({ context, integrationId: "publishing",
|
|
134
|
+
operation: "posts.create", input: { title, content } });
|
|
135
|
+
// The application obtains the reviewer's decision and checks their authority.
|
|
136
|
+
await connections.invoke({ context, integrationId: "publishing",
|
|
137
|
+
operation: "posts.update", input: { id: draft.id, status: "publish" } });
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The app must authorize each resource and action before invoking it. Shared
|
|
141
|
+
credentials act as the connected WordPress user for every permitted app caller.
|
|
142
|
+
WordPress may reject creation, editing another author's content, publishing or
|
|
143
|
+
trashing under that user's role. Return that failure; do not reconnect as an
|
|
144
|
+
administrator or silently change roles. Updating published content can take
|
|
145
|
+
effect immediately and may trigger site plugins/notifications. There is no
|
|
146
|
+
transaction spanning multiple calls and no blind retry of an uncertain write;
|
|
147
|
+
inspect the site's content before deciding whether to repeat it.
|
|
148
|
+
|
|
149
|
+
A non-Node framework uses its own HTTPS client, the same site URL/Env username
|
|
150
|
+
and password binding, and these native `/wp-json/wp/v2/posts` or `/pages` routes.
|
|
151
|
+
Use GET for reads, JSON POST for create/update, and DELETE with force=false for
|
|
152
|
+
trash. There is no Vibe64 runtime or JSKIT service requirement for that framework.
|
|
153
|
+
|
|
154
|
+
## Media and user operations
|
|
155
|
+
|
|
156
|
+
`media.list` accepts page/per_page/search/context and an optional `media_type`
|
|
157
|
+
(image/video/text/application/audio). `media.get` takes `id` and optional context.
|
|
158
|
+
Both return metadata, including the media URL; they do not fetch the linked file
|
|
159
|
+
or forward credentials to a CDN. `media.update` accepts `id` and one or more of
|
|
160
|
+
`title`, `caption`, `description`, `alt_text`, `post` (0 detaches the attachment).
|
|
161
|
+
|
|
162
|
+
`media.upload` accepts `filename`, `mimeType`, canonical `contentBase64` and those
|
|
163
|
+
optional metadata fields. The runtime decodes at most **5 MiB** into an ordinary
|
|
164
|
+
multipart `file` upload; WordPress enforces allowed types, upload_files capability
|
|
165
|
+
and any smaller site limit. No filesystem path or source URL is fetched by the
|
|
166
|
+
connector. The framework validates its incoming upload and size before encoding
|
|
167
|
+
it. A Node backend can use `Buffer.from(fileBytes).toString("base64")`; another
|
|
168
|
+
framework can send its native multipart upload to the same media endpoint.
|
|
169
|
+
|
|
170
|
+
```js
|
|
171
|
+
const attachment = await connections.invoke({ context, integrationId: "publishing",
|
|
172
|
+
operation: "media.upload", input: { filename: "cover.png", mimeType: "image/png",
|
|
173
|
+
contentBase64: Buffer.from(fileBytes).toString("base64"), alt_text: "Cover image" } });
|
|
174
|
+
await connections.invoke({ context, integrationId: "publishing",
|
|
175
|
+
operation: "posts.update", input: { id: draft.id, featured_media: attachment.id } });
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
These are separate writes. If attaching the image fails, the uploaded attachment
|
|
179
|
+
can still exist. Show that outcome and allow explicit recovery; do not silently
|
|
180
|
+
repeat uploads or delete the attachment. `media.delete` requires `id` and
|
|
181
|
+
`force: true`, returns WordPress's deletion response, and **permanently removes**
|
|
182
|
+
the attachment/file. It is deliberately different from post/page trash. The app
|
|
183
|
+
must obtain the intended user's confirmation and authorize that exact resource.
|
|
184
|
+
[Media endpoint reference](https://developer.wordpress.org/rest-api/reference/media/).
|
|
185
|
+
|
|
186
|
+
`users.list` takes page/per_page/search/context; `users.get` takes id/context.
|
|
187
|
+
Public view may expose only authors; edit context and full lists require the
|
|
188
|
+
connected account's capabilities. `users.create` requires username, email,
|
|
189
|
+
password and explicit roles; it never uses an implicit site's default role.
|
|
190
|
+
Supported optional profile fields are name, first_name, last_name, nickname and
|
|
191
|
+
description. `users.update` takes id and at least one profile/email/password/roles
|
|
192
|
+
field; omitted fields remain unchanged. Role IDs may be custom site roles;
|
|
193
|
+
WordPress checks whether the actor is allowed to assign them. There is no local
|
|
194
|
+
role elevation or change to the application's own login system.
|
|
195
|
+
|
|
196
|
+
Passwords here are transient **server-side operation input**, not fields in
|
|
197
|
+
integrations.json or the connection store. The framework must keep them out of
|
|
198
|
+
chat, URL parameters, logs and client responses. Prefer the site's own onboarding
|
|
199
|
+
and password-reset flow when an administrator should not handle new passwords.
|
|
200
|
+
Returned user records cannot include a password. Changing the credential owner's
|
|
201
|
+
profile or deleting that owner may interrupt subsequent connector use.
|
|
202
|
+
|
|
203
|
+
`users.delete` requires id, force:true and an explicit positive `reassign` user ID
|
|
204
|
+
for the removed user's content. It is permanent, not a trash action. The app
|
|
205
|
+
must authorize this administrative action; multisite and site plugins may impose
|
|
206
|
+
additional restrictions or trigger notifications. Failures are returned without
|
|
207
|
+
automatic retries. No batch transaction, role provisioning or multisite network
|
|
208
|
+
administration is implemented.
|
|
209
|
+
[Users endpoint reference](https://developer.wordpress.org/rest-api/reference/users/).
|
|
210
|
+
|
|
211
|
+
For read-only public content a framework can make its own unauthenticated REST
|
|
212
|
+
reads. This connector always authenticates; it never falls back to anonymous
|
|
213
|
+
access after denial. Shared-account operations must remain behind application
|
|
214
|
+
permissions even when some records happen to be public.
|
|
215
|
+
|
|
216
|
+
## Automation and application ownership
|
|
217
|
+
|
|
218
|
+
An AI can prepare the files and library composition. An authorized operator
|
|
219
|
+
with shell access can provision a password using
|
|
220
|
+
`wp user application-password create <user> <app-name> --porcelain`.
|
|
221
|
+
The command prints the new credential; an automation must capture it directly
|
|
222
|
+
into the secret store and keep it out of logs.
|
|
223
|
+
[WP-CLI password creation](https://developer.wordpress.org/cli/commands/user/application-password/create/).
|
|
224
|
+
|
|
225
|
+
The REST API also supports creating and deleting passwords at
|
|
226
|
+
`/wp-json/wp/v2/users/{userId}/application-passwords`. It requires an already
|
|
227
|
+
authorized identity, so it does not bootstrap an unknown site's credentials.
|
|
228
|
+
The fragment does not expose these administrative operations.
|
|
229
|
+
[Application Passwords API](https://developer.wordpress.org/rest-api/reference/application-passwords/).
|
|
230
|
+
|
|
231
|
+
These are passwords owned by a user on a particular site, not global OAuth
|
|
232
|
+
registrations. Use a recognizable application name for revocation and
|
|
233
|
+
attribution. Separate passwords do not provide independent site capacity. The
|
|
234
|
+
application selects its private Env binding and enforces its own access policy;
|
|
235
|
+
the connected site remains owned by that customer.
|
|
236
|
+
|
|
237
|
+
Manual authentication has no callback, so editor VM and deployed-app domains
|
|
238
|
+
do not need registration. Use the site's final HTTPS address. Moving that site
|
|
239
|
+
or changing its installation path requires configuration and verification again.
|
|
240
|
+
The adapter does not configure per-password scopes, generate passwords, install
|
|
241
|
+
plugins, change WordPress roles or enable disabled REST routes.
|
|
242
|
+
|
|
243
|
+
## Focused proof and limits
|
|
244
|
+
|
|
245
|
+
The WordPress-family suite uses simulated provider replies and actual encrypted
|
|
246
|
+
JSON persistence. It covers authenticated verification, posts/drafts, Basic
|
|
247
|
+
headers, site paths, field/input validation, rotation, restart, ownership,
|
|
248
|
+
disconnect, changed destinations and failure responses. Editor checks cover
|
|
249
|
+
fields, error feedback, references, setup links and reload. Live administration,
|
|
250
|
+
provider use and sample-app generation are excluded. Post/page writes, exact multipart upload bytes, media management and user
|
|
251
|
+
administration have controlled fixtures. Custom post types, scheduling, taxonomy
|
|
252
|
+
editing, binary downloads and alternative authentication plugins are not supplied.
|