tohokuaikiのチラシの裏

技術的ネタとか。

WordPressのXMLRPCで自動投稿をPHPスクリプトから行う

なんか、昔に死ぬほどやったけど忘れてしまった…自分でAPIのメソッドを作ったりしたんだけどな。

そもそも時代も変わったので生のPHPのXMLRPCとか触りたくないのでライブラリを使う。よさげなのがあった。

とりあえずパッケージインストール

composer.pharは使えるとして…

./composer.phar init
./composer.phar require hieu-le/wordpress-xmlrpc-client
./composer.phar require monolog/monolog

使い方

APIドキュメントがあったんだけど、これがもう全然正しくなくて…ってかこれ、ソースのコメントから作ってるんだろうけど引数が全然違うしね。
http://letrunghieu.github.io/wordpress-xmlrpc-client/api/index.html

ということで、ソースコードWordPressAPIレファレンス見て頑張った。
https://codex.wordpress.org/XML-RPC_WordPress_API

で、import.phpとかで

<?php
require_once 'vendor/autoload.php';
$endpoint = 'http://your-wordpress-site/xmlrpc.php';
$username = 'your_name';
$password = 'your_password'; 
$client = new \HieuLe\WordpressXmlrpcClient\WordpressClient();
$client->setCredentials($endpoint, $username, $password);
$wpLog = new Monolog\Logger('wp-xmlrpc');
$client->onError(function($error, $event) use ($wpLog){
    $wpLog->error($error, $event);
});

ここまでは共通

新しい投稿

<?php
$client->newPost('新しいタイトル ',  "内容をここに書く",
                 array(
                     'post_type' => 'post',
                     'post_status' => 'publish',
                     'terms_names' => array(
                         'category' => array('お知らせ','カテゴリー2'),
                         ),
                     'post_status' => 'private',
                     'post_author' => 1,
                     'post_date' => date('c', time() - 86400 * 8), //
                     'comment_status' => 'closed',
                     'ping_status' => 'closed',
                     ));

こんな感じ。

カテゴリーの設定が難しかったけど、WordPressのclass-wp-xmlrpc-server.phpを覗いて理解した。

                     'terms_names' => array(
                         'category' => array('お知らせ','カテゴリ―2'),
                         'post_tag' => array('タグ1', 'タグ2'),
                         'post_format' => // WordPressのpost_format使ったことないのでよくわからない。
                         ),

という感じ。IDを使いたかったら、terms_namesの代わりにtermsで。

うーん、これは楽だ。

画像のアップロード

よーし、画像のアップロードも…

<?php
$upfile = '/home/itoh/photos/1270.jpg';
$client->uploadFile('写真.jpg',
                    mime_content_type($upfile),
                    file_get_contents($upfile),
                    true,
                    80
                    );

最初、ファイル名に拡張子の.jpgを付けずに「写真」とだけしてたらアップロードできずになんでだーとなってた。

と、なんか、上書きできないなーって思ったら…
https://codex.wordpress.org/XML-RPC_WordPress_API/Media#wp.uploadFile

bool overwrite: Optional. Has no effect (see 17604).

ん~~と、リンク先チケットを見ると…私の4年前の書き込みが…直ってないのか…使われないんだろうな…

しかし、これキャプションを付けられないものかな…
…とそこで気付いた。WordPressは写真も1つのPOSTとして保存しているのである。

post_content => 説明の欄  
post_excerpt => キャプションの欄  
_wp_attachment_image_alt => ALTテキスト  

となっている。

ちなみにパーマリンクになる日付は、所属している投稿の時刻である。意味付けとしてはこれを写真の時刻とすればいい。