Search.../

createDraftPost( )

Creates a draft post.

Description

The draft post's memberId is required for third-party apps.

Admin Method

This function requires elevated permissions to run. This function is not universal and runs only on the backend.

Authorization

Request

This endpoint does not take any parameters

Response Object

NAME
TYPE
DESCRIPTION
draftPost
DraftPost

Created draft post info.

Status/Error Codes

Was this helpful?

Create a draft post (export from the backend code)

Copy Code
1import { draftPosts } from 'wix-blog-backend';
2import { webMethod, Permissions } from 'wix-web-module';
3import { elevate } from 'wix-auth';
4
5 /* Sample draftPost value:
6 * {
7 * "categoryIds": [],
8 * "commentingEnabled": true,
9 * "excerpt": "Knowing nothing of the early movement, it was a chase in the dark.",
10 * "featured": true,
11 * "language": "en",
12 * "media": {
13 * "custom": false,
14 * "displayed": true
15 * },
16 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
17 * "previewTextParagraph": 2,
18 * "pricingPlanIds": [],
19 * "relatedPostIds": [],
20 * "richContent": {
21 * "nodes": [
22 * {
23 * "type": "PARAGRAPH",
24 * "id": "pvirv1",
25 * "nodes": [
26 * {
27 * "type": "TEXT",
28 * "id": "",
29 * "nodes": [],
30 * "textData": {
31 * "text": "Hello world",
32 * "decorations": []
33 * }
34 * }
35 * ],
36 * "paragraphData": {}
37 * }
38 * ],
39 * }
40 * "seoData": {
41 * "tags": []
42 * "},
43 * "seoSlug": "on-our-side-1",
44 * "tagIds": [],
45 * "title": "On our side.",
46 * }
47 */
48
49const elevatedCreateDraftPost = elevate(draftPosts.createDraftPost);
50
51export const myCreateDraftPostFunction = webMethod(
52 Permissions.Admin,
53 async (draftPost) => {
54 try {
55 const createdDraftPost = await elevatedCreateDraftPost(draftPost);
56 console.log("Successfully created the following draft post":", createdDraftPost);
57 return createdDraftPost;
58 } catch (error) {
59 console.error(error);
60 // Handle the error
61 }
62 }
63);
64
65/* Promise resolves to:
66 * {
67 * "_id": "9bf5b0c2-3e06-499f-9c35-7e1b2ba91ae8",
68 * "_createdDate": "2024-01-23T10":53":19.658Z",
69 * "categoryIds": [],
70 * "changeOrigin": "MANUAL_SAVE",
71 * "commentingEnabled": true,
72 * "contentId": "65af9a9ff178881294652e92",
73 * "editedDate": "2024-01-23T10":53":19.658Z",
74 * "editingSessionId": "7e79aa62-c68a-4b24-b9be-ae07f5ada751",
75 * "excerpt": "Knowing nothing of the early movement, it was a chase in the dark.",
76 * "featured": true,
77 * "hashtags": [],
78 * "hasUnpublishedChanges": true,
79 * "language": "en",
80 * "media": {
81 * "custom": false,
82 * "displayed": true
83 * },
84 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
85 * "minutesToRead": 0,
86 * "mostRecentContributorId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
87 * "paidContentParagraph": 2,
88 * "pricingPlanIds": [],
89 * "previewTextParagraph": 2,
90 * "relatedPostIds": [],
91 * "richContent": {
92 * "nodes": [
93 * {
94 * "type": "PARAGRAPH",
95 * "id": "pvirv1",
96 * "nodes": [
97 * {
98 * "type": "TEXT",
99 * "id": "",
100 * "nodes": [],
101 * "textData": {
102 * "text": "Hello world",
103 * "decorations": []
104 * }
105 * }
106 * ],
107 * "paragraphData": {}
108 * }
109 * ],
110 * }
111 * "seoData": {
112 * "settings": {
113 * "keywords": [],
114 * "preventAutoRedirect": false
115 * },
116 * "tags": []
117 * },
118 * "seoSlug": "on-our-side-1",
119 * "slugs": [],
120 * "status": "UNPUBLISHED",
121 * "tagIds": [],
122 * "title": "On our side.",
123 * "translations": []
124 * }
125 */
Create a draft post using options (export from backend code)

Copy Code
1import { draftPosts } from 'wix-blog-backend';
2import { webMethod, Permissions } from 'wix-web-module';
3import { elevate } from 'wix-auth';
4
5/* Sample draftPost value:
6 * {
7 * "categoryIds": [
8 * "c8780752-f517-4cf9-9c18-0f9a22d00926",
9 * "590635d7-cc7c-48cb-970c-f8339daa1cfe"
10 * ],
11 * "commentingEnabled": true,
12 * "editingSessionId": "session1",
13 * "excerpt": "Let"s begin with Philo, a first century Egyptian.",
14 * "featured": false,
15 * "firstPublishedDate": "2024-01-01",
16 * "hashtags": [
17 * "vacation",
18 * "dream",
19 * "summer",
20 * "hashtag"
21 * ],
22 * "heroImage": "https"://example.com/hero-image.jpg",
23 * "language": "en",
24 * "media": {},
25 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
26 * "moderationDetails": {},
27 * "previewTextParagraph": 2,
28 * "pricingPlanIds": [],
29 * "relatedPostIds": [
30 * "57194b39-c4bc-45a6-a30d-f8e860a020b2",
31 * "d655251a-74eb-467d-9beb-1962984b8d94"
32 * ],
33 * "richContent": {
34 * "nodes": [
35 * {
36 * "type": "PARAGRAPH",
37 * "id": "pvirv1",
38 * "nodes": [
39 * {
40 * "type": "TEXT",
41 * "id": "",
42 * "nodes": [],
43 * "textData": {
44 * "text": "Hello world",
45 * "decorations": []
46 * }
47 * }
48 * ],
49 * "paragraphData": {}
50 * }
51 * ],
52 * },
53 * "seoData": {},
54 * "seoSlug": "rocket-man",
55 * "tagIds": [
56 * "a55b2c06-cbec-4d01-a8bb-cd7029056c75",
57 * "d2b0c02b-72c1-45af-ba58-3520cec9abe3"
58 * ],
59 * "title": "Rocket Man",
60 * };
61 *
62 * Sample options value":
63 * {
64 * "fieldsets": ["URL"],
65 * "publish": false
66 * };
67 */
68
69const elevatedCreateDraftPost = elevate(draftPosts.createDraftPost);
70
71export const myCreateDraftPostFunction = webMethod(
72 Permissions.Admin,
73 async (draftPost) => {
74 try {
75 const createdDraftPost = await elevatedCreateDraftPost(draftPost);
76 console.log("Successfully created the following draft post":", createdDraftPost);
77 return createdDraftPost;
78 } catch (error) {
79 console.error(error);
80 // Handle the error
81 }
82 }
83);
84
85/* Promise resolves to":
86 * {
87 * "_id": "9124f6ef-a537-4bdd-bca3-e7306947deeb",
88 * "_createdDate": "2024-01-16T10":22":50.071Z",
89 * "categoryIds": [],
90 * "changeOrigin": "PUBLISH",
91 * "commentingEnabled": true,
92 * "contentId": "65a658fb28062c88564addfa",
93 * "editingSessionId": "95091d24-7d76-45d1-920b-6dc0b0b45eaa",
94 * "editedDate": "2024-01-16T10":22":50.071Z",
95 * "excerpt": "Let"s begin with Philo, a first century Egyptian.",
96 * "featured": false,
97 * "firstPublishedDate": "2024-01-16T10":22":50.139Z",
98 * "hashtags": [],
99 * "hasUnpublishedChanges": false,
100 * "language": "en",
101 * "media": {
102 * "custom": false,
103 * "displayed": true
104 * },
105 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
106 * "minutesToRead": 10,
107 * "mostRecentContributorId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
108 * "paidContentParagraph": 2,
109 * "pricingPlanIds": [],
110 * "previewTextParagraph": 2,
111 * "relatedPostIds": [
112 * "57194b39-c4bc-45a6-a30d-f8e860a020b2",
113 * "d655251a-74eb-467d-9beb-1962984b8d94"
114 * ],
115 * "richContent": {
116 * "nodes": [
117 * {
118 * "type": "PARAGRAPH",
119 * "id": "pvirv1",
120 * "nodes": [
121 * {
122 * "type": "TEXT",
123 * "id": "",
124 * "nodes": [],
125 * "textData": {
126 * "text": "Hello world",
127 * "decorations": []
128 * }
129 * }
130 * ],
131 * "paragraphData": {}
132 * }
133 * ],
134 * },
135 * "seoData": {
136 * "tags": []
137 * },
138 * "seoSlug": "on-our-side",
139 * "slugs": [
140 * "on-our-side"
141 * ],
142 * "status": "PUBLISHED",
143 * "tagIds": [],
144 * "title": "Rocket Man",
145 * "translations": []
146 * }
147 */
Create a draft post (dashboard page code)

Copy Code
1import { draftPosts } from 'wix-blog-backend';
2
3/* Sample draftPost value:
4 * {
5 * "categoryIds": [],
6 * "commentingEnabled": true,
7 * "excerpt": "Knowing nothing of the early movement, it was a chase in the dark.",
8 * "featured": true,
9 * "language": "en",
10 * "media": {
11 * "custom": false,
12 * "displayed": true
13 * },
14 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
15 * "previewTextParagraph": 2,
16 * "pricingPlanIds": [],
17 * "relatedPostIds": [],
18 * "richContent": {
19 * "nodes": [
20 * {
21 * "type": "PARAGRAPH",
22 * "id": "pvirv1",
23 * "nodes": [
24 * {
25 * "type": "TEXT",
26 * "id": "",
27 * "nodes": [],
28 * "textData": {
29 * "text": "Hello world",
30 * "decorations": []
31 * }
32 * }
33 * ],
34 * "paragraphData": {}
35 * }
36 * ],
37 * }
38 * "seoData": {
39 * "tags": []
40 * "},
41 * "seoSlug": "on-our-side-1",
42 * "tagIds": [],
43 * "title": "On our side.",
44 * }
45 */
46
47export async function myCreateDraftPostFunction(draftPost) {
48 try {
49 const createdDraftPost = await draftPosts.createDraftPost(draftPost);
50 console.log('Successfully created the following draft post:', createdDraftPost);
51 return createdDraftPost;
52 } catch (error) {
53 console.error(error);
54 // Handle the error
55 }
56 }
57
58/* Promise resolves to:
59 * {
60 * "_id": "9bf5b0c2-3e06-499f-9c35-7e1b2ba91ae8",
61 * "_createdDate": "2024-01-23T10":53":19.658Z",
62 * "categoryIds": [],
63 * "changeOrigin": "MANUAL_SAVE",
64 * "commentingEnabled": true,
65 * "contentId": "65af9a9ff178881294652e92",
66 * "editedDate": "2024-01-23T10":53":19.658Z",
67 * "editingSessionId": "7e79aa62-c68a-4b24-b9be-ae07f5ada751",
68 * "excerpt": "Knowing nothing of the early movement, it was a chase in the dark.",
69 * "featured": true,
70 * "hashtags": [],
71 * "hasUnpublishedChanges": true,
72 * "language": "en",
73 * "media": {
74 * "custom": false,
75 * "displayed": true
76 * },
77 * "memberId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
78 * "minutesToRead": 0,
79 * "mostRecentContributorId": "c00e8a5c-322b-4e77-8813-002e3ea7e811",
80 * "paidContentParagraph": 2,
81 * "pricingPlanIds": [],
82 * "previewTextParagraph": 2,
83 * "relatedPostIds": [],
84 * "richContent": {
85 * "nodes": [
86 * {
87 * "type": "PARAGRAPH",
88 * "id": "pvirv1",
89 * "nodes": [
90 * {
91 * "type": "TEXT",
92 * "id": "",
93 * "nodes": [],
94 * "textData": {
95 * "text": "Hello world",
96 * "decorations": []
97 * }
98 * }
99 * ],
100 * "paragraphData": {}
101 * }
102 * ],
103 * }
104 * "seoData": {
105 * "settings": {
106 * "keywords": [],
107 * "preventAutoRedirect": false
108 * },
109 * "tags": []
110 * },
111 * "seoSlug": "on-our-side-1",
112 * "slugs": [],
113 * "status": "UNPUBLISHED",
114 * "tagIds": [],
115 * "title": "On our side.",
116 * "translations": []
117 * }
118 */
Create a post and send an email notification to subscribers

This example uses triggered emails. Create a triggered email before trying this example.

Copy Code
1/*****************************************
2 * Backend code - my-backend-file.web.js *
3 *****************************************/
4
5import { draftPosts } from 'wix-blog-backend';
6import { contacts, triggeredEmails } from 'wix-crm-backend';
7import { webMethod, Permissions } from 'wix-web-module';
8import { elevate } from 'wix-auth';
9
10// Create a draft post
11
12export const myCreateDraftPostFunction = webMethod(
13 Permissions.Anyone,
14 async (draftPost, options) => {
15 try {
16 const elevatedCreateDraftPost = elevate(draftPosts.createDraftPost);
17 const createdDraftPost = await elevatedCreateDraftPost(draftPost, options);
18 return createdDraftPost;
19 } catch (error) {
20 console.error(error);
21 // Handle the error
22 }
23 }
24);
25
26// Send an email notification to all subscribers
27
28export const mySendEmailToContactFunction = webMethod(
29 Permissions.Anyone,
30 async (postLink) => { // Pass the post URL from the onPostCreated event in events.js code
31 let contactsInfo = []; // An array to contain the IDs and names of all subscribers
32 const queryResults = await contacts.queryContacts()
33 .eq("info.extendedFields.emailSubscriptions.subscriptionStatus", "SUBSCRIBED") // Retrieve all subscribers
34 .find();
35 const subscribedContacts = queryResults.items;
36
37 if (subscribedContacts.length >= 1) {
38 for(let i=0; i < subscribedContacts.length; i++) {
39 const contactId = subscribedContacts[i]._id;
40 const contactName = subscribedContacts[i].info.name.first;
41 const contactObject = {
42 id: contactId,
43 name: contactName
44 }; // Loop through the subscribedContacts object. Retrieve the ID and name of each contact from the object. Save each contact as a separate object, so the contact can be added to an array.
45 contactsInfo.push(contactObject); // Push object to an array
46 }
47 } else {
48 console.log('No contacts found');
49 // Handle when no contacts are found
50 }
51
52 const triggeredEmailTemplate = 'myEmail'; // Use your email template name from Triggered Emails
53
54 for (const contact of contactsInfo) { // Send each contact a notification email
55 const options = {
56 "variables": {
57 "name": contact.name, // Save the contact name to use it in the triggered email template
58 "link": postLink // Save the post URL to use it in the triggered template
59 }
60 };
61
62 try {
63 await triggeredEmails.emailContact(triggeredEmailTemplate, contact.id, options);
64 console.log('Email sent to a contact');
65 } catch (error) {
66 console.error(error);
67 // Handle the error
68 }
69 }
70 });
71
72/*****************************************
73 * Backend code - events.js *
74 *****************************************/
75
76import { mySendEmailToContactFunction } from 'backend/my-backend-file.web.js'
77
78export function wixBlog_onPostCreated(event) { // set the event that fires when a post is created
79 const postLink = event.entity.url // save the post URL from the event payload
80 mySendEmailToContactFunction(postLink) // send an email notification when a post is created
81}
82
83/*************
84 * Page code *
85 *************/
86
87import { myCreateDraftPostFunction } from 'backend/my-backend-file.web.js'
88
89const post = {
90 "title": "Hello, world!",
91 "commentingEnabled": true,
92 "featured": true,
93 "language": "en",
94 "memberId": "8a8b9b73-4da8-47a5-8268-4396e68a0605",
95 "richContent": {
96 "nodes": [
97 {
98 "type": "PARAGRAPH",
99 "id": "pvirv1",
100 "nodes": [
101 {
102 "type": "TEXT",
103 "id": "",
104 "nodes": [],
105 "textData": {
106 "text": "Hello, world.",
107 "decorations": []
108 }
109 }
110 ],
111 "paragraphData": {}
112 }
113 ]
114 }
115}
116
117const options = {
118 "publish": true, // Publish a post right after creating it
119 "fieldsets": ["URL"] // Define this fieldset to receive the URL in the payload
120}
121
122$w.onReady(function () {
123
124myCreateDraftPostFunction(post, options).then(() => {
125 console.log("Created post") // create a post
126 })
127
128})
129
130