WordPress.com: Upload Media

WordPress.com: Upload Media

WordPress.com: メディアアップロード

This item uploads media files to WordPress.com.

Basic Configs
Step Name
Note
Auto Step icon
Configs for this Auto Step
conf_Auth
C1: OAuth2 Setting *
conf_Domain
C2: Domain of the WordPress.com site *
conf_Files
C3: Data item whose attached files will be uploaded *
conf_Ids
C4: Data item to save Media IDs
conf_Urls
C5: Data item to save Media URLs

Notes

  • This Auto Step is for WordPress.com (a service that hosts WordPress sites, provided by Automattic itself)
  • OAuth2 settings should be created per user per site
    • When the same user handles multiple WordPress.com sites, create an OAuth2 setting for each site

Capture

See Also

Script (click to open)
  • An XML file that contains the code below is available to download
    • wordpress-media-upload.xml (C) Questetra, Inc. (MIT License)
    • If you are using Professional, you can modify the contents of this file and use it as your own add-on auto step

// 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: media
// - 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 files = engine.findData(configs.getObject('conf_Files'));
    const idDef = configs.getObject('conf_Ids');
    const urlDef = configs.getObject('conf_Urls');

    ////// == 演算 / Calculating ==
    if (files === null) {
        saveData(idDef, []);
        saveData(urlDef, []);
        return;
    }
    checkFiles(files, idDef, urlDef);
    const {ids, urls} = uploadMedia(auth, domain, files);

    ////// == ワークフローデータへの代入 / Data Updating ==
    saveData(idDef, ids);
    saveData(urlDef, urls);
};

/**
 * アップロードしようとするファイルの数が適切かどうかチェックする
 * @param {Array<QfileView>} files  アップロードしようとするファイルの配列
 * @param {ProcessDataDefinitionView} idDataDef  ID を保存するデータ項目の ProcessDataDefinitionView
 * @param {ProcessDataDefinitionView} urlDataDef  URL を保存するデータ項目の ProcessDataDefinitionView
 */
function checkFiles(files, idDataDef, urlDataDef) {
    const fileNum = files.size();
    checkFileNum(idDataDef, 'Media IDs', fileNum);
    checkFileNum(urlDataDef, 'Media URLs', fileNum);
}

/**
 * アップロードするファイルが複数で パス・URL 出力先のデータ項目が単一行ならエラーにする
 * @param {ProcessDataDefinitionView} dataDef  データ項目の ProcessDataDefinitionView
 * @param {String} label  エラー出力用ラベル
 * @param {Number} fileNum  アップロードしようとするファイルの個数
 */
function checkFileNum(dataDef, label, fileNum) {
    if (dataDef !== null && dataDef.matchDataType('STRING_TEXTFIELD') && fileNum > 1) {
        throw new Error(`Multiple files are set while the data item to save ${label} is Single-line.`);
    }
}

/**
 * メディアをアップロードする
 * @param {AuthSettingWrapper} auth
 * @param {String} domain
 * @param {Array<QfileView>} files
 * @return {Object} result
 * @return {Array<String>} result.ids  アップロードしたメディアの ID の配列
 * @return {Array<String>} result.urls  アップロードしたメディアの URL の配列
 */
const uploadMedia = (auth, domain, files) => {
    const url = `https://public-api.wordpress.com/rest/${API_VERSION}/sites/${encodeURIComponent(domain)}/media/new`;
    let request = httpClient.begin().authSetting(auth)
        .queryParam('fields', 'ID,URL');
    files.forEach(file => {
        request = request.multipart('media[]', file);
    });
    const response = request.post(url);
    const status = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    if (status !== 200) {
        engine.log(responseStr);
        throw new Error(`Failed to upload media. status: ${status}`);
    }
    const {errors, media} = JSON.parse(responseStr);
    if (errors !== undefined) {
        engine.log(JSON.stringify(errors));
        throw new Error('Some files failed to be uploaded.');
    }
    return {
        ids: media.map(media => media.ID),
        urls: media.map(media => media.URL)
    };
};

/**
 * データ項目への保存
 * @param {ProcessDataDefinitionView} dataDef
 * @param {Array<String>} dataList
 */
const saveData = (dataDef, dataList) => {
    if (dataDef === null) {
        return;
    }
    engine.setData(dataDef, dataList.join('\n'));
};

    

Discover more from Questetra Support

Subscribe now to keep reading and get access to the full archive.

Continue reading