WordPressへ記事を外部から投稿

PHPからWordPressへ外部投稿する方法

WordPressは、XML-RPCプロトコルがプラグイン無しで対応しているので、それを使うと便利そうです。

XML-PRCとは

RPC(Remote Procedure Call:遠隔手続き呼び出し)プロトコルの一種で、転送内容をXMLフォーマットにエンコードしてリクエストしてその応答もXMLフォーマットにエンコードして返す転送方式です。
ちょっと古いのですが、PHP用のライブラリとして有名な「IXR_Library.php」を利用します。

IXR_Library.phpのダウンロード

以下のサイトからダウンロードできます。

q2a-xml-rpc/IXR_Library.php at master · NoahY/q2a-xml-rpc
XML-RPC server for Q2A. Contribute to NoahY/q2a-xml-rpc development by creating an account on GitHub.

Github.comのページの「q2a-xml-rpc/」をクリックします。

開いたページの「Clone or Download」をクリックします

ダウンロード用の小さいウィンドウが開くので「Download ZIP」をクリックして適当な場所へダウンロードしてください。

ダウンロードしたファイルはZIPsw圧縮されているので解凍します

目的の「IXR_Library.php」が解凍されます。

このライブラリは、これから作るPHPのソースファイル同じフォルダへコピーして利用します。

外部投稿用PHPプログラム作成

WordPressへ外部投稿するPHPソースファイルはP、次の様になりました。

<?php // wp_post.php
header('Content-Type: text/html; charset=UTF-8');
mb_language("Japanese");
mb_internal_encoding("UTF-8");
mb_http_input("UTF-8");
mb_http_output('UTF-8');

require_once(__DIR__."/IXR_Library.php");
require_once(__DIR__."/log001.php") ;


// ===========================================================================
// WordPress 投稿処理
//
//  投稿先WordPress情報($wp_infoグローバル変数)
//   $wp_info['wp_url']    = URL
//   $wp_info[wp_username] = ユーザー名
//   $wp_info[wp_password] = パスワード
//
//  投稿内容
//   $title = タイトル 
//   $body  = 投稿本文
//   $categorys = array('カテゴリ1','カテゴリ2',~);
//   $tags      = array('タグ1','タグ2',~);
//   $delay     = 即時0 ~ 遅延投稿(分)
//
function wp_post($title, $body, $categorys, $tags, $delay)
{
  global $wp_info;

  $postDate = new IXR_Date(time() + 60 * $deley);   // 投稿時刻

  // 投稿の内容
  $contents = array(
    'post_author'  => '',                           // 投稿者名通常
    'post_status'  => 'publish',                    // 公開投稿
    'post_title'   => $title,                       // タイトル
    'post_content' => $body,                        // 本文
    'terms_names'  => array(
                        'category' => $categorys,   // カテゴリ集(配列)
                        'post_tag' => $tags         // タグ集(配列)
                      )
  );

  if($deley > 0){
    $contents['post_date']   = $postDate;            // 投稿時刻
    $contents['post_status'] = "future";
  }


  // コンテンツ投稿
  $ixr = new IXR_Client($wp_info[wp_url]."/xmlrpc.php");
  $res = $ixr->query(
    "wp.newPost",            // 新規投稿処理
    1,                       // blog_id 通常=1
    $wp_info[wp_username],   // WordPressのusename
    $wp_info[wp_password],   // WordPressのpassword
    $contents                // 投稿の内容
  );

  if(!$res){
    logprint4("WP投稿失敗".$ixr->getErrorMessage()."(".$ixr->getErrorCode().")");
  }
  else{
    logprint4("WP投稿完了".$title);
  }
  $ret[res] = $res;
  $ret[erm] = $ixr->getErrorMessage();
  $ret[erc] = $ixr->getErrorCode();

  return $ret;
}


?>

先程ダウンロードした「IXR_Library.php」と以前解説した、簡単にログをとる関数のファイルをインクルードしています。
簡単ログの記事は、こちら↓

PHP 超簡単にログをとる
PHPでログをとる必要性 PHPプログラムを開発していく過程で、デバッグを行いますが、C言語、VBと違いトレースを行う環境を作りにくい現状。 また、実際の運用でも動作が問題なく完了してるか、エラーは発生してるかなどの履歴を残...

外部投稿用PHPプログラムチェック

テスト用にPHPプログラム作って確認してみましょう

<?php // post_test.php
header('Content-Type: text/html; charset=UTF-8');
mb_language("Japanese");
mb_internal_encoding("UTF-8");
mb_http_input("UTF-8");
mb_http_output('UTF-8');

require_once(__DIR__."/wp_post.php");

$wp_info['wp_url']    = "URL";
$wp_info[wp_username] = "ユーザー名";
$wp_info[wp_password] = "パスワード";


$title = "WP投稿テスト";
$body  = "

WP投稿テスト

\n投稿本文\n"; $categorys = array("テスト1"); $tags = array("タグ1","タグ2"); // 外部投稿テスト wp_post($title, $body, $categorys, $tags, 0); ?>

投稿結果

PHPで外部から投稿された記事です。