WP RestAPIを使って記事を投稿 Perl版

WordPress Rest API を使って、PHPでデータの取得や、記事の投稿を行うサンプル。
全てのカテゴリーを取得する
use LWP::UserAgent;
use JSON;
use Encode;
use utf8;
my $api_url = "https://sample.com/wp-json/wp/v2/categories?per_page=100&page=1";
my $ua = LWP::UserAgent->new;
my $response = $ua->get($api_url);
if ($response->is_success) {
my $json_data = $response->content;
my $categories = decode_json($json_data);
foreach my $category (@$categories) {
print "カテゴリー名: " . $category->{'name'} . "(ID:" . $category->{'id'} . ")" . "<br>";
}
} else {
print "HTTPリクエストに失敗しました: " . $response->status_line . "<br>";
}
記事IDやスラッグから記事内容を取得
my $api_url = "https://sample.com/wp-json/wp/v2/posts?slug=スラッグ名";
my $uri = URI->new($api_url);
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html');
my $response = $ua->get($uri);
if ($response->is_success) {
my $res = decode_json($response->content);
$answer = $res->[0]{content}{rendered};
} else {
print "HTTPリクエストに失敗しました: " . $response->status_line . "<br>";
}
#そのまま出力
print $answer;
#HTMLタグを削除するなら
$answers = $answer;
$answers =~ s/<.*?>//g;
print $answers;
記事を投稿する
use CGI;
use Jcode;
use Encode;
use utf8;
use LWP::UserAgent;
use JSON::XS;
use MIME::Base64;
$base_url = "https://sample.com/wp-json/wp/v2/posts";
$posts = <<EOM;
<p>記事内容</p>
<p>記事内容</p>
EOM
my $data = {
title => "記事タイトル",
content => $posts,
slug => "記事のスラッグ",
categories => [8,10],
status => "draft",
featured_media => 2100,
};
my $content = encode_json($data);
my $ua = LWP::UserAgent->new;
my $response = $ua->post(
$base_url,
Content_Type => 'application/json',
Authorization => 'Basic ' . MIME::Base64::encode("$username:$password", ''),
Content => $content,
);
if ($response->is_success) {
my $result = decode_json($response->decoded_content);
my $completion = $result->{id};
print "ID:$completion 投稿完了\n";
} else {
print "Failed to complete: " . $response->status_line . "<br>\n";
}
メディアに画像をアップロードする
use CGI;
use Jcode;
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common;
use MIME::Base64;
use JSON::XS;
$base_url = "https://sample.com/wp-json/wp/v2/media";
$cgi = new CGI;
foreach ($cgi->param() ){
$CGI{$_}=$cgi->param($_);
}
$filename = $CGI{'addele01'};
$filecom = "./img/$filename";
unlink("$filecom"); binmode(STDIN); binmode(STDOUT); binmode(STDERR);
while($bytesread = read($CGI{'addele01'}, $buffer, 2048)) {
$file_contents .= $buffer;
}
open(TMP, "> $filecom"); binmode(TMP); print TMP $file_contents; close(TMP);
my $ua = LWP::UserAgent->new;
# リクエストヘッダーを設定
my $headers = HTTP::Headers->new(
Authorization => 'Basic ' . MIME::Base64::encode("$username:$password", ''),
'Content-Disposition' => sprintf('attachment; filename="%s"'. $filename),
'Content-Type' => 'application/octet-stream',
);
# POSTリクエストを作成
my $request = HTTP::Request->new(
'POST',
$base_url,
$headers,
$file_contents,
);
# POSTリクエストを送信
my $response = $ua->request($request);
if ($response->is_success) {
my $result = decode_json($response->decoded_content);
my $media_id = $result->{id};
print "成功! $media_id\n";
} else {
print "Failed to complete: " . $response->status_line . "<br>\n";
}
カテゴリーを追加する
use CGI;
use Jcode;
use Encode;
use utf8;
use LWP::UserAgent;
use JSON::XS;
use MIME::Base64;
$base_url = "https://sample.com/wp-json/wp/v2/categories";
my $data = {
name => "NEWカテゴリー",
slug => "new_category",
};
my $content = encode_json($data);
my $ua = LWP::UserAgent->new;
my $response = $ua->post(
$base_url,
Content_Type => 'application/json',
Authorization => 'Basic ' . MIME::Base64::encode("$username:$password", ''),
Content => $content,
);
if ($response->is_success) {
my $result = decode_json($response->decoded_content);
my $completion = $result->{id};
print "ID:$completion カテゴリ追加完了\n";
} else {
print "Failed to complete: " . $response->status_line . "<br>\n";
}
