2015年3月4日水曜日

WordPressに自作プラグインを作成して記事を自動投稿する

前回、PHPファイルを実行して記事とアイキャッチ画像を更新しましたが、今回はこれをWordPress上に自作プラグインとして作成し、実行したいと思います。

作成したプラグインのファイルは/wordpress/wp-content/pluginsに保存してください。

まず、作成するプラグインのPHPファイルの先頭に以下のコメントを記述します。
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/

次に管理メニューを追加します。
 add_action('admin_menu', 'add_pages');
function add_pages() {
    add_menu_page(
        '記事投稿設定', //HTMLタイトルテキスト
        '記事投稿設定', //管理画面のメニュー上での表示名
        'level_8', //このメニューページを閲覧・使用するために最低限必要なユーザーレベルまたはユーザーの種類と権限
        __FILE__, //メニューページのコンテンツを表示するPHPファイル
        'option_page' //メニューページにコンテンツを表示する関数
    );
}
















現れました。
これだけでは有効化しても何もできないので、オプション画面を記述していきます。
ボタンがクリックされたら記事を投稿できるようにしました。
function option_page(){

    //投稿実行ボタン押下で記事を1つ投稿
    if( isset($_POST['post_flag']) ){
        registPostArticle();
    }
    echo << EOD
        

記事投稿設定


EOD; }

あとは前回と同じです。
/******************************************
 * 記事を投稿する
 *******************************************/
function registPostArticle(){

    $_SERVER = array(
            'HTTP_HOST' => 'your_site_domain',
            'REQUEST_URL' => '../'
            );

    require_once( '../wp-load.php');

    //投稿用パラメーター
    $hPostInfo = array(
            'post_title' => 'テストタイトル',
            'post_content' => 'テスト本文',
            'post_status' => 'publish'
            );

    //投稿実行
    $nInsertId = wp_insert_post($hPostInfo);

    if( $nInsertId ){

        registPostThumbnailImages( $nInsertId );

    }else{
        echo( "UPLOAD FILE FAILED \n"  );
    }
}

/*******************************************************************
 * アイキャッチ画像(サムネイル)を投稿記事に紐付けてアップロードする
 ********************************************************************/
function registPostThumbnailImages( $nInsertId ){

    //アイキャッチ画像情報
    $sImageUrl = 'http://food.foto.ne.jp/img/thumb_kd.jpg';
    $sFileName = basename($sImageUrl);
    $sFileType = wp_check_filetype($sFileName, null);

    //画像保存ディレクトリに画像情報を保存する
    $sUploadDir = wp_upload_dir();
    $sData = file_get_contents($sImageUrl);
    $sUploadImageName = $sUploadDir['path'] . "/" . $sFileName;
    $fpc = file_put_contents( $sUploadImageName, $sData );

    //画像を保存できたらメディアライブラリで再生成する
    if( $fpc ){

        //アイキャッチ設定
        $hAttachment = array(
                'post_mime_type' => $sFileType['type'],
                'post_title' => sanitize_file_name($sFileName),
                'post_content' => '',                'post_status' => 'inherit',
                );

        $file = $sUploadDir['path'] . '/' . $sFileName;

        //アイキャッチ画像を挿入
        $nAttachId = wp_insert_attachment( $hAttachment, $file, $nInsertId );
        require_once( ABSPATH . 'wp-admin/includes/image.php');

        //画像添付ファイルのメタデータを作成する
        $hAttachData = wp_generate_attachment_metadata( $nAttachId, $file );

        //画像ファイルを再作成する
        wp_update_attachment_metadata( $nAttachId, $hAttachData );

        //サムネイル生成
        set_post_thumbnail( $nInsertId, $nAttachId );

        echo( "POST COMPLATE \n" );

    }else{
        echo( "POST FAILED \n" );
    }

}














オプション画面が表示されました。
ボタンをクリックして記事を投稿してみます。























わかりにくいですが、投稿に成功しています。


2015年3月3日火曜日

PHPからWordPressに記事を投稿する

PHPファイルを実行してWordPressに記事を投稿する方法について。

wp-load.phpでWordPress関数を呼び出し
→投稿オブジェクトを作成
→wp_insert_postで投稿
という流れになります。

指定できる投稿オブジェクトは以下の通り。
$post = array(
  'ID' => [ <投稿 ID> ] // 既存の投稿を更新する場合。
  'menu_order' => [ <順序値> ] // 追加する投稿が固定ページの場合、ページの並び順を番号で指定できます。
  'comment_status' => [ 'closed' | 'open' ] // 'closed' はコメントを閉じます。
  'ping_status' => [ 'closed' | 'open' ] // 'closed' はピンバック/トラックバックをオフにします。
  'pinged' => [ ? ] // ピンバック済。
  'post_author' => [  ] // 作成者のユーザー ID。
  'post_category' => [ array(<カテゴリー ID>, <...>) ] // カテゴリーを追加。
  'post_content' => [ <投稿の本文> ] // 投稿の全文。
  'post_date' => [ Y-m-d H:i:s ] // 投稿の作成日時。
  'post_date_gmt' => [ Y-m-d H:i:s ] // 投稿の作成日時(GMT)。
  'post_excerpt' => [ <抜粋> ] // 投稿の抜粋。
  'post_name' => [ <スラッグ名> ] // 投稿スラッグ。
  'post_parent' => [ <投稿 ID> ] // 親投稿の ID。
  'post_password' => [ <投稿パスワード> ] // 投稿の閲覧時にパスワードが必要になります。
  'post_status' => [ 'draft' | 'publish' | 'pending'| 'future' ] // 公開ステータス。 
  'post_title' => [ <タイトル> ] // 投稿のタイトル。
  'post_type' => [ 'post' | 'page' ] // 投稿タイプ名。
  'tags_input' => [ '<タグ>, <タグ>, <...>' ] // 投稿タグ。
); 

http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_post

というわけでサンプルを作成します。
# vi php-post-test.php
ini_set('display_errors', true);

function find_wordpress_base_path(){
    $dir = dirname(__FILE__);
    do {
        if( file_exists( $dir."/wp-config.php" ) ){
            return $dir;
        }
    } while( $dir = realpath("$dir/..") );
    return null;
}

define( 'BASE_PATH', find_wordpress_base_path()."/" );
require_once( BASE_PATH.'wp-load.php');

$post_value = array(
    'post_title' => 'テストタイトル',
    'post_content' => 'テスト本文',
    'post_status' => 'publish'
);

wp_insert_post($post_value);

echo("post complate \n");

で実行
# php php-post.php
ログインできませんでした
なんかでましたorz
前回、サイトにBasic認証をかけていたのが問題のようで、とりあえずBasic認証を外して実行するとうまくいきました。







さらに投稿記事にサムネイル画像(アイキャッチ画像)を紐付けたいとします。
流れ的には ①画像のアップロード
→②メディアライブラリに画像を再生成
→③記事にアイキャッチ画像を添付
となります。

//①画像のアップロード
$sImageUrl = 画像のパス;
$sFileName = basename($sImageUrl);
$sFileType = wp_check_filetype($sFileName, null);

//画像保存ディレクトリに画像情報を保存する
$sUploadDir = wp_upload_dir();
$sData = file_get_contents($sImageUrl);
$sUploadImageName = $sUploadDir['path'] . "/" . $sFileName;
$fpc = file_put_contents( $sUploadImageName, $sData );

if( $fpc ){

    //②画像を保存できたらメディアライブラリで再生成する
    $hAttachment = array(
        'post_mime_type' => $sFileType['type'],
        'post_title' => sanitize_file_name($sFileName),
        'post_content' => '',
        'post_status' => 'inherit',
    );

    if( wp_mkdir_p($upload_dir['path']) ){
        $file = $sUploadDir['path'] . '/' . $sFileName;
    }else{
        $file = $sUploadDir['basedir'] . '/' . $sFileName;
    }
    //アイキャッチ画像を記事に紐付ける
    $nAttachId = wp_insert_attachment( $hAttachment, $file, $nInsertId );
    require_once( ABSPATH . 'wp-admin/includes/image.php');

    //画像添付ファイルのメタデータを作成する
    $hAttachData = wp_generate_attachment_metadata( $nAttachId, $file );

    //画像ファイルを再作成する
    wp_update_attachment_metadata( $nAttachId, $hAttachData );

    //③サムネイル生成
    set_post_thumbnail( $nInsertId, $nAttachId );

    echo( "POST COMPLATE \n" );
    }else{
        echo( "POST FAILED \n" );
    }
}else{
    echo( "UPLOAD FILE FAILED \n"  );
}

これを実行すると




























記事に紐づきました。
以上です。