
WordPress.com: 下書き記事作成
WordPress.com: Create Draft Post
この工程は、WordPress.com 上に下書き状態の記事(投稿)を作成します。
Basic Configs
- 工程名
- メモ
Configs for this Auto Step
- conf_Auth
- C1: OAuth2 設定 *
- conf_Domain
- C2: WordPress.com サイトのドメイン *
- conf_Title
- C3: タイトル#{EL}
- conf_Content
- C4: 本文 *#{EL}
- conf_Excerpt
- C5: 抜粋#{EL}
- conf_Slug
- C6: スラッグ#{EL}
- conf_FeaturedImage
- C7: アイキャッチ画像のメディア ID
- conf_Categories
- C8: カテゴリ ID(文字型データ項目の場合、1 行に 1 つ)
- conf_Tags
- C9: タグ ID(文字型データ項目の場合、1 行に 1 つ)
- conf_PostId
- C10: 投稿 ID を保存するデータ項目
- conf_PostUrl
- C11: 投稿の URL を保存するデータ項目
Notes
- WordPress.com(Automattic 社の提供する、WordPress サイトをホストするサービス)で使用できる自動工程です
- OAuth2 設定は、1 ユーザ 1 サイトにつき、1 つ作成してください
- 同じユーザが複数の WordPress.com サイトを扱う場合、それぞれのサイトについて OAuth2 設定を作成してください
- メディア、カテゴリ、タグの ID は WordPress.com の Web UI には表示されないため、下記の自動工程を使用して ID を取得してください
- アップロード済みのメディアの ID は、以下の手順で取得できます
- WordPress.com の Web UI で、メディアライブラリを開く
- クラシック表示に変更する
- メディアを選択すると、メディア ID は以下のような形式で URL に含まれています
- ?item={メディア ID}
- ?post={メディア ID}
- 存在しないメディア ID、カテゴリ ID、タグ ID を指定した場合、その ID は無視されます
Capture

See Also
Script (click to open)
- 次のスクリプトが記述されている XML ファイルをダウンロードできます
- wordpress-post-create.xml (C) Questetra, Inc. (MIT License)
- Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます
// OAuth2 config sample at [OAuth 2.0 Setting]
// - Authorization Endpoint URL: https://public-api.wordpress.com/oauth2/authorize
// - Token Endpoint URL: https://public-api.wordpress.com/oauth2/token
// - Scope: posts
// - Client ID: (Get by https://developer.wordpress.com/apps/)
// - Client Secret: (Get by https://developer.wordpress.com/apps/)
const API_VERSION = 'v1.1';
const main = () => {
////// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
const auth = configs.getObject('conf_Auth');
const domain = configs.get('conf_Domain');
const title = configs.get('conf_Title');
const content = configs.get('conf_Content');
if (content === '') {
throw new Error('Content is blank.');
}
const excerpt = configs.get('conf_Excerpt');
const slug = configs.get('conf_Slug');
const featuredImage = retrieveId('conf_FeaturedImage', 'Media ID for Featured Image');
const categoryIds = retrieveIdsAsList('conf_Categories', 'Category ID');
const tagIds = retrieveIdsAsList('conf_Tags', 'Tag ID');
////// == 演算 / Calculating ==
const {postId, postUrl} = createPost(auth, domain, title, content, excerpt, slug, featuredImage, categoryIds, tagIds);
////// == ワークフローデータへの代入 / Data Updating ==
saveData('conf_PostId', postId);
saveData('conf_PostUrl', postUrl);
};
/**
* config に設定された ID を読み出す
* @param {String} confName 設定名
* @param {String} label エラーメッセージ用ラベル
* @return {String} id
*/
const retrieveId = (confName, label) => {
const dataDef = configs.getObject(confName);
if (dataDef === null) {
return null;
}
// 文字型データ項目の場合
if (dataDef.matchDataType('STRING_TEXTFIELD')) {
const id = engine.findData(dataDef);
if (id === null) {
return null;
}
validateId(id, label);
return id;
}
// 選択型データ項目の場合
const selects = engine.findData(dataDef);
if (selects === null || selects.size() === 0) {
return null;
}
const id = selects.get(0).getValue(); // 選択肢 ID
validateId(id, label);
return id;
};
/**
* ID の値をチェックする
* 非負整数でない場合はエラー
* @param {String} id
* @param {String} label エラーメッセージ用ラベル
*/
const validateId = (id, label) => {
const idReg = new RegExp('^(0|[1-9][0-9]*)$');
if (!idReg.test(id)) {
throw new Error(`${label} must be a non-negative integer.`);
}
};
/**
* config に設定された ID の一覧を読み出す
* @param {String} confName 設定名
* @param {String} label エラーメッセージ用ラベル
* @return {Array<String>} ids
*/
const retrieveIdsAsList = (confName, label) => {
const dataDef = configs.getObject(confName);
if (dataDef === null) {
return [];
}
// 文字型データ項目の場合
if (dataDef.matchDataType('STRING')) {
const dataObj = engine.findData(dataDef);
if (dataObj === null) {
return [];
}
const ids = dataObj.split('\n')
.filter(id => id !== '');
validateIds(ids, label);
return ids;
}
// 選択型データ項目の場合
const selects = engine.findData(dataDef);
if (selects === null || selects.size() === 0) {
return [];
}
const ids = [];
selects.forEach(item => {
ids.push(item.getValue()); // 選択肢 ID を格納
});
validateIds(ids, label);
return ids;
};
/**
* ID の一覧をチェックする
* 非負整数でない場合はエラー
* @param {Array<String>} ids
* @param {String} label エラーメッセージ用ラベル
*/
const validateIds = (ids, label) => {
ids.forEach(id => validateId(id, label));
};
/**
* 投稿を作成する
* @param {AuthSettingWrapper} auth
* @param {String} domain
* @param {String} title
* @param {String} content
* @param {String} excerpt
* @param {String} slug
* @param {String} featuredImage
* @param {Array<String>} categories
* @param {Array<String>} tags
* @return {String} postId
*/
const createPost = (auth, domain, title, content, excerpt, slug, featuredImage, categories, tags) => {
const url = `https://public-api.wordpress.com/rest/${API_VERSION}/sites/${encodeURIComponent(domain)}/posts/new`;
const payload = { title, content, excerpt, slug, featured_image: featuredImage, categories, tags, status: 'draft' };
const response = httpClient.begin().authSetting(auth)
.queryParam('fields', 'ID,URL')
.body(JSON.stringify(payload), 'application/json')
.post(url);
const status = response.getStatusCode();
const responseStr = response.getResponseAsString();
if (status !== 200) {
engine.log(responseStr);
throw new Error(`Failed to create post. status: ${status}`);
}
const postObj = JSON.parse(responseStr);
return {
postId: String(postObj.ID),
postUrl: postObj.URL
};
};
/**
* データ項目への保存
* @param configName
* @param data
*/
const saveData = (configName, data) => {
const def = configs.getObject(configName);
if (def === null) {
return;
}
engine.setData(def, data);
};