WordPress.com: 下書き記事作成

WordPress.com: 下書き記事作成

WordPress.com: Create Draft Post

この工程は、WordPress.com 上に下書き状態の記事(投稿)を作成します。

Basic Configs
工程名
メモ
Auto Step icon
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 は、以下の手順で取得できます
    1. WordPress.com の Web UI で、メディアライブラリを開く
    2. クラシック表示に変更する
    3. メディアを選択すると、メディア 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);
};

    
上部へスクロール

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む