既存の独自 CMS とかのデータを WordPress に移行する際に、csv に落として CSV Importer とかを使うことが多いと思います。
ただ、これだとかゆい所に手が届かないとか、細かく設定できないとか、往々にしてあると思うんですよ。
そんな時は、wp_insert_post() とか wp_add_post_tags() とか wp_insert_attachment() とかを駆使して移行プログラムを書いたりするんですが、微妙に使いづらいので、これらをラップして使いやすくするクラスを作って、github で公開しました。
簡単な使い方は memo.dogmap.jp にも書いたんですが、あっさりとしすぎてるので、ここにも書いておきますね。
以下、使い方
クラスファイルの読み込み
WordPress ディレクトリにある wp-load.php と、github から DL した class-wp_post_helper.php を include してください。
<?php require_once('/path/to/wordpress/wp-load.php'); require_once('class-wp_post_helper.php');[/php] <h2>投稿データの作成</h2> 必要なファイルをインクルードしたら </code>wp_post_helper()</code> クラスが使えるようになるので、</code>new wp_post_helper()</code> します。 このとき、連想配列で投稿する内容をセットできます。 セットしたくない項目は入れておかなければ、WordPress で設定されたデフォルト値が設定されます。 [php]// 初期化 $post = new wp_post_helper(array( 'post_name' => 'slug' , // スラッグ 'post_author' => 1 , // 投稿者のID 'post_date' => '2012/11/15 20:00:00' , // 投稿時刻 'post_password' => '', // 投稿にパスワードをかける場合は、中身をセット 'post_type' => 'post' , // 投稿タイプ(カスタム投稿タイプも指定できるよ) 'post_status' => 'publish' , // publish (公開) とか、draft (下書き) とか 'comment_status' => 'open' , // comment を許可するかどうか 'ping_status' => 'open' , // ping を許可するかどうか 'post_title' => 'タイトル' , // 投稿のタイトル 'post_content' => '本文' , // 投稿の本文 'page_template' => 'default' , // 固定ページで使用するテンプレート名 'post_parent' => 0 , // 親ページの post_id, 0 なら親ページ無し 'post_category'=> array(1, 2) , // カテゴリーID を配列で 'post_tags' => array('タグ1', 'タグ2') , // 投稿のタグを配列で ));
初期化の時に引数を設定しなくても、insert
メソッドを使う前なら、set
メソッドで値を変更できます。
$post->set(array( 'post_title' => 'ほげ' , // 投稿のタイトルとして 'ほげ' を設定 ));
値を入れたら insert
メソッドで投稿します。
返り値は、投稿の post_id です。エラーが発生した場合は false を返します。
$postid = $post->insert();
insert
メソッド発行後は、この投稿の post_id が確定します。
これを取得するには postid
メソッドを使用します。
メディアライブラリにメディアファイルを追加する
add_media
メソッドを使うと、簡単にメディアライブラリにメディアファイルを追加できます。
このメソッドは、insert
メソッドを発行する前にも使えますし、後でも使えます。
insert
メソッドを発行する前にこのメソッドを呼び出した場合は、insert
メソッドを発行したタイミングで一緒にメディアライブラリに登録されます。
(メディアライブラリに登録する時に投稿の post_id が必要なため)
このメソッドでメディアライブラリに登録すると、WordPress でメディアのサイズが登録されている場合は、それぞれのサイズのファイルも自動的に作っちゃいますよ。
第一引数には、メディアファイルのサーバ上の絶対パスをセットしてください。
// メディアを追加 $post->add_media( '/path/to/wordpress/wp-content/uploads/hoge.jpg' , // メディアファイルの絶対パス 'タイトル', // メディアの「タイトル」 '説明', // メディアの「説明」 'キャプション', // メディアの「キャプション」 true // true (アイキャッチ画像にする) or false (アイキャッチ画像にしない) );
class-wp_post_helper.php
には、特定の URL からファイルを取得して WordPress の upload ディレクトリにファイルを取得するための関数 remote_get_file()
も同梱してあります。
この関数は、引数に URL を渡すと wp_upload_dir にファイルをダウンロードして、絶対パスを返します。失敗した場合は false を返します。
以下のようにして、使ってやってください。
// URL からメディアをダウンロードして追加 if ( $media = remote_get_file('http://example.com/fuga.jpg') ) { $post->add_media($media, 'タイトル', '説明', 'キャプション', false); }
カスタムフィールドに値を登録する
カスタムフィールドに値を登録するには add_meta
メソッドを使用します。
このメソッドも、add_media
メソッド同様に insert
メソッドを発行する前にも使えますし、後でも使えます。
// カスタムフィールドに値を追加 $post->add_meta( 'meta_key', // メタキー 'meta_val', // メタバリュー true // メタキーをユニークにするか(true)、ユニークにしないか(false) );
Advanced Custom Fields 形式の値を追加する
Advanced Custom Fields (ACF) プラグインを利用している人も多いでしょう。
このプラグインに対応した値をセットするには、add_field
メソッドを使用します。
このメソッドも、add_media
メソッド同様に insert
メソッドを発行する前にも使えますし、後でも使えます。
// Advanced Custom Fields プラグイン形式の値を追加 $post->add_field( 'field_xxxxxxxxxxxxx', // キー 'field_val' // バリュー );
第一引数のキーは、カスタムフィールド名ではなく、ACF 独自のフィールドキーです。
詳しいことは、ACF のドキュメントを参照してください。
ACF { Documentation: update_field()
活用させて頂いております。ありがとうございます。
少しご相談をさせて頂きたいのですが、
「関数 remote_get_file() 」を使用し、ファイルを、メディアライブラリにアップしようとしております。
if($media = remote_get_file(‘既にサーバ上に実在するファイルA’)){
$post->add_media($media, ‘タイトル’, ‘説明’, ‘キャプション’, false);
}
と実行すると、/wp-content/uploads/ 配下に、きいんとファイルAがアップされるのですが、
Wordpress管理画面のメディアライブラリ上では、ファイルAが表示されません。
このような事象になりそうなポイントはありますでしょうか?
こちらを使わせていただいています。
バグらしきものを発見しましたのでコメントしました。
post_statusをdraftにした常態でアイキャッチを指定してもアイキャッチに登録されませんでした。
post_statusをpublishにすると登録されました。
よろしくお願い致します。