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

perl-wp

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";
}