この記事は1年以上編集されていないため、情報が古い可能性がございます。
ご注意ください。

このWordPress pluginを配布しています

この記事はtomita@atuwebがお届けします。

管理画面ログインしないでコマンドラインから記事を投稿してしまう方法をご紹介いたします。
WordPressはメール投稿が可能ですが、自分的にもっと手軽に記事投稿ができれば便利だと思い、ソース読んでカスタマイズしてみようと考えました。

PHPスクリプトを自分で設置できる環境であることが条件です。
割とダーティーかもしれません。

  • バージョン情報
    — PHP 5.6
    — WordPress 4.4.2

何のために

メール投稿以外でも、簡単にWordPressブログに記事を投稿したいというケースのため。

たとえば、、、

  • 手元で記事を書いて、pushしたら記事を投稿する
  • slackやChatWorkなどのチャットツールから記事を投稿する

何をするの

  • ブラウザからのログインなしでWordPressに記事を投稿するスクリプトを作成、設置

設置と解説

ディレクトリ

/path/to/web_directory
 |- command
 |    |- direct_post.php
 |- wordpress
 |    |- wp-admin
 |    :
 :

wordpressディレクトリが、あなたのブログのドキュメントルートというイメージです。

ドキュメントルートと同じ階層にcommandディレクトリを作成し、direct_post.phpを設置してください。
commandディレクトリの名称は何でもOKです。

ソースコード

  • direct_post.php
<?php
// WordPress本体で参照する定数定義と、設定ファイル群をrequireする
define('BASE_DIR',          dirname( __FILE__ ). '/../wordpress/');
define('ADMIN_DIR',         BASE_DIR. 'wp-admin/');
define('WP_ADMIN',          true);
define('WP_NETWORK_ADMIN',  false);
define('WP_USER_ADMIN',     false);
define('WP_BLOG_ADMIN',     true);
define('WP_LOAD_IMPORTERS', true);

require_once(BASE_DIR. 'wp-blog-header.php' );
require_once(BASE_DIR. 'wp-load.php');
require_once(ABSPATH.  'wp-admin/includes/admin.php');

set_time_limit(0);
set_screen_options();
date_default_timezone_set('Asia/Tokyo');

wp_enqueue_script('common');

// ログインを通すためのユーザ情報をグローバルに展開する
loadCurrentUser();

// 記事情報を受け取り、投稿を実行
$postData = makePostData();
postIt($postData);

function makePostData() {
    // TODO実装する
    // getXxx()の部分の処理は環境や連携システムに合わせて実装してください
    // $argcから拾ってくるのが手っ取り早いです
    $postData = array(
        'title'      => getTitle(),
        'content'    => getContent(),
        // カテゴリは登録済みのカテゴリIDを、スカラー配列で指定する。 
        'categories' => getCategories(),
        // タグは" "tagA,tagB"のように複数のタグをカンマで結合してする
        'tags'       => getTags(),
        'date'       => new DateTime(getPostDate()),
    );
}

function postIt($postData) {
    $now = new DateTime();
    // 投稿用配列を生成
    // このとき新しい投稿IDを生成する
    $postTemplate = get_default_post_to_edit('post', true );
    $postData     = array(
        'post_type'     => 'page',
        'user_ID'       => 1,
        'post_author'   => 1,
        'post_ID'       => $postTemplate->ID,
        'post_category' => array(
            $postData['categories'],
        ),
        'tax_input'     => array(
            'post_tag'  => $postData['tags'],
        ),
        'post_title'  => $postData['title'],
        'content'     => $postData['content'],
        'hidden_post_visibility' => 'public',
        'original_publish'       => 'Yes',
        'publish'                => 'Yes',
        'post_format'            => 0,

        'aa' => $now->format('Y'),
        'mm' => $now->format('m'),
        'jj' => $now->format('d'),
        'hh' => $now->format('H'),
        'mn' => $now->format('i'),
        'ss' => $now->format('s'),

        // hidden_xxは"公開日時"変更のためのパラメーター
        'hidden_aa' => $postData['date']->format('Y'),
        'hidden_mm' => $postData['date']->format('m'),
        'hidden_jj' => $postData['date']->format('d'),
        'hidden_hh' => $postData['date']->format('H'),
        'hidden_mn' => $postData['date']->format('i'),
        'hidden_ss' => $postData['date']->format('s'),

    );
    return edit_post($postData);
}

function loadCurrentUser() {
    global $current_user;

    // 実存するユーザのIDを設定してください
    $current_user = new WP_UserCommandLine();
    $current_user->ID = 1;
}
class WP_UserCommandLine {
    public $ID;
}

説明

処理の流れは次の通りです。

  • 管理画面と同等の定数定義とファイル群のロードを行う
  • ログイン認証を通すためのユーザ情報をグローバルに定義する
  • 記事データを受け取り整形する
  • 新規で記事IDを発行し、記事投稿を行う

記事タイトルや本文の受け取り処理は今回省いておりますので、連携するシステム等に合わせて実装してください。

実行方法

実行イメージです。

cd /path/to/web_directory/command
$ php -f direct_post.php title content category tags

スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存