diff --git a/packages/backend/src/apps/wordpress/actions/create-post/index.js b/packages/backend/src/apps/wordpress/actions/create-post/index.js
new file mode 100644
index 00000000..da32678a
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/actions/create-post/index.js
@@ -0,0 +1,262 @@
+import defineAction from '../../../../helpers/define-action.js';
+import isEmpty from 'lodash/isEmpty.js';
+import omitBy from 'lodash/omitBy.js';
+
+export default defineAction({
+ name: 'Create post',
+ key: 'createPost',
+ description: 'Creates a new post.',
+ arguments: [
+ {
+ label: 'Title',
+ key: 'title',
+ type: 'string',
+ required: true,
+ description: '',
+ variables: true,
+ },
+ {
+ label: 'Content',
+ key: 'content',
+ type: 'string',
+ required: false,
+ description: '',
+ variables: true,
+ },
+ {
+ label: 'Excerpt',
+ key: 'excerpt',
+ type: 'string',
+ required: false,
+ description: '',
+ variables: true,
+ },
+ {
+ label: 'Password',
+ key: 'password',
+ type: 'string',
+ required: false,
+ description: 'A password to protect access to the content and excerpt.',
+ variables: true,
+ },
+ {
+ label: 'Author',
+ key: 'author',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listUsers',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Featured Media',
+ key: 'featuredMedia',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listMedia',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Comment Status',
+ key: 'commentStatus',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ options: [
+ { label: 'Open', value: 'open' },
+ { label: 'Closed', value: 'closed' },
+ ],
+ },
+ {
+ label: 'Ping Status',
+ key: 'pingStatus',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ options: [
+ { label: 'Open', value: 'open' },
+ { label: 'Closed', value: 'closed' },
+ ],
+ },
+ {
+ label: 'Format',
+ key: 'format',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ options: [
+ { label: 'Standard', value: 'standard' },
+ { label: 'Aside', value: 'aside' },
+ { label: 'Chat', value: 'chat' },
+ { label: 'Gallery', value: 'gallery' },
+ { label: 'Link', value: 'link' },
+ { label: 'Image', value: 'image' },
+ { label: 'Quote', value: 'quote' },
+ { label: 'Status', value: 'status' },
+ { label: 'Status', value: 'status' },
+ { label: 'Video', value: 'video' },
+ { label: 'Audio', value: 'audio' },
+ ],
+ },
+ {
+ label: 'Sticky',
+ key: 'sticky',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ options: [
+ { label: 'False', value: 'false' },
+ { label: 'True', value: 'true' },
+ ],
+ },
+ {
+ label: 'Categories',
+ key: 'categoryIds',
+ type: 'dynamic',
+ required: false,
+ description: '',
+ fields: [
+ {
+ label: 'Category',
+ key: 'categoryId',
+ type: 'dropdown',
+ required: false,
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listCategories',
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: 'Tags',
+ key: 'tagIds',
+ type: 'dynamic',
+ required: false,
+ description: '',
+ fields: [
+ {
+ label: 'Tag',
+ key: 'tagId',
+ type: 'dropdown',
+ required: false,
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listTags',
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: 'Status',
+ key: 'status',
+ type: 'dropdown',
+ required: false,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listStatuses',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Date',
+ key: 'date',
+ type: 'string',
+ required: false,
+ description: "Post publish date in the site's timezone",
+ variables: true,
+ },
+ ],
+
+ async run($) {
+ const {
+ title,
+ content,
+ excerpt,
+ password,
+ author,
+ featuredMedia,
+ commentStatus,
+ pingStatus,
+ format,
+ sticky,
+ categoryIds,
+ tagIds,
+ status,
+ date,
+ } = $.step.parameters;
+
+ const allCategoryIds = categoryIds
+ ?.map((categoryId) => categoryId.categoryId)
+ .filter(Boolean);
+
+ const allTagIds = tagIds?.map((tagId) => tagId.tagId).filter(Boolean);
+
+ let body = {
+ title,
+ content,
+ excerpt,
+ password,
+ author,
+ featured_media: featuredMedia,
+ comment_status: commentStatus,
+ ping_status: pingStatus,
+ format,
+ sticky,
+ categories: allCategoryIds,
+ tags: allTagIds,
+ status,
+ date,
+ };
+
+ body = omitBy(body, isEmpty);
+
+ const response = await $.http.post('?rest_route=/wp/v2/posts', body);
+
+ $.setActionItem({ raw: response.data });
+ },
+});
diff --git a/packages/backend/src/apps/wordpress/actions/index.js b/packages/backend/src/apps/wordpress/actions/index.js
new file mode 100644
index 00000000..6f717545
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/actions/index.js
@@ -0,0 +1,3 @@
+import createPost from './create-post/index.js';
+
+export default [createPost];
diff --git a/packages/backend/src/apps/wordpress/dynamic-data/index.js b/packages/backend/src/apps/wordpress/dynamic-data/index.js
index ce289b38..9069e4a0 100644
--- a/packages/backend/src/apps/wordpress/dynamic-data/index.js
+++ b/packages/backend/src/apps/wordpress/dynamic-data/index.js
@@ -1,3 +1,7 @@
+import listCategories from './list-categories/index.js';
+import listMedia from './list-media/index.js';
import listStatuses from './list-statuses/index.js';
+import listTags from './list-tags/index.js';
+import listUsers from './list-users/index.js';
-export default [listStatuses];
+export default [listCategories, listMedia, listStatuses, listTags, listUsers];
diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js
new file mode 100644
index 00000000..cc0edc7a
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js
@@ -0,0 +1,40 @@
+export default {
+ name: 'List categories',
+ key: 'listCategories',
+
+ async run($) {
+ const categories = {
+ data: [],
+ };
+
+ const params = {
+ page: 1,
+ per_page: 100,
+ order: 'desc',
+ };
+
+ let totalPages = 1;
+ do {
+ const { data, headers } = await $.http.get(
+ '?rest_route=/wp/v2/categories',
+ {
+ params,
+ }
+ );
+
+ params.page = params.page + 1;
+ totalPages = Number(headers['x-wp-totalpages']);
+
+ if (data) {
+ for (const category of data) {
+ categories.data.push({
+ value: category.id,
+ name: category.name,
+ });
+ }
+ }
+ } while (params.page <= totalPages);
+
+ return categories;
+ },
+};
diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js
new file mode 100644
index 00000000..e5505e6d
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js
@@ -0,0 +1,37 @@
+export default {
+ name: 'List media',
+ key: 'listMedia',
+
+ async run($) {
+ const media = {
+ data: [],
+ };
+
+ const params = {
+ page: 1,
+ per_page: 100,
+ order: 'desc',
+ };
+
+ let totalPages = 1;
+ do {
+ const { data, headers } = await $.http.get('?rest_route=/wp/v2/media', {
+ params,
+ });
+
+ params.page = params.page + 1;
+ totalPages = Number(headers['x-wp-totalpages']);
+
+ if (data) {
+ for (const medium of data) {
+ media.data.push({
+ value: medium.id,
+ name: medium.slug,
+ });
+ }
+ }
+ } while (params.page <= totalPages);
+
+ return media;
+ },
+};
diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js
new file mode 100644
index 00000000..0bcfb63b
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js
@@ -0,0 +1,37 @@
+export default {
+ name: 'List tags',
+ key: 'listTags',
+
+ async run($) {
+ const tags = {
+ data: [],
+ };
+
+ const params = {
+ page: 1,
+ per_page: 100,
+ order: 'desc',
+ };
+
+ let totalPages = 1;
+ do {
+ const { data, headers } = await $.http.get('?rest_route=/wp/v2/tags', {
+ params,
+ });
+
+ params.page = params.page + 1;
+ totalPages = Number(headers['x-wp-totalpages']);
+
+ if (data) {
+ for (const tag of data) {
+ tags.data.push({
+ value: tag.id,
+ name: tag.name,
+ });
+ }
+ }
+ } while (params.page <= totalPages);
+
+ return tags;
+ },
+};
diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js
new file mode 100644
index 00000000..8558e3a3
--- /dev/null
+++ b/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js
@@ -0,0 +1,37 @@
+export default {
+ name: 'List users',
+ key: 'listUsers',
+
+ async run($) {
+ const users = {
+ data: [],
+ };
+
+ const params = {
+ page: 1,
+ per_page: 100,
+ order: 'desc',
+ };
+
+ let totalPages = 1;
+ do {
+ const { data, headers } = await $.http.get('?rest_route=/wp/v2/users', {
+ params,
+ });
+
+ params.page = params.page + 1;
+ totalPages = Number(headers['x-wp-totalpages']);
+
+ if (data) {
+ for (const user of data) {
+ users.data.push({
+ value: user.id,
+ name: user.name,
+ });
+ }
+ }
+ } while (params.page <= totalPages);
+
+ return users;
+ },
+};
diff --git a/packages/backend/src/apps/wordpress/index.js b/packages/backend/src/apps/wordpress/index.js
index 6a95024c..825fc76e 100644
--- a/packages/backend/src/apps/wordpress/index.js
+++ b/packages/backend/src/apps/wordpress/index.js
@@ -4,6 +4,7 @@ import setBaseUrl from './common/set-base-url.js';
import auth from './auth/index.js';
import triggers from './triggers/index.js';
import dynamicData from './dynamic-data/index.js';
+import actions from './actions/index.js';
export default defineApp({
name: 'WordPress',
@@ -18,4 +19,5 @@ export default defineApp({
auth,
triggers,
dynamicData,
+ actions,
});
diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js
index 219a1d51..61655253 100644
--- a/packages/docs/pages/.vitepress/config.js
+++ b/packages/docs/pages/.vitepress/config.js
@@ -518,6 +518,7 @@ export default defineConfig({
collapsible: true,
collapsed: true,
items: [
+ { text: 'Actions', link: '/apps/wordpress/actions' },
{ text: 'Triggers', link: '/apps/wordpress/triggers' },
{ text: 'Connection', link: '/apps/wordpress/connection' },
],
diff --git a/packages/docs/pages/apps/wordpress/actions.md b/packages/docs/pages/apps/wordpress/actions.md
new file mode 100644
index 00000000..9a5d2b59
--- /dev/null
+++ b/packages/docs/pages/apps/wordpress/actions.md
@@ -0,0 +1,12 @@
+---
+favicon: /favicons/wordpress.svg
+items:
+ - name: Create post
+ desc: Creates a new post.
+---
+
+
+
+