WordPressでwp_insert_post関数を利用した投稿方法。(カスタムフィールド、WP to Twitter対応版)


WordPressで誰でも投稿できるフォームを作る際等に利用すると便利なwp_insert_post関数の使い方と、その覚書を。
また、wp_insert_post関数だけだとカスタムフィールドの投稿には対応していないので、そちらについても。

公式のドキュメントでwp_insert_post関数を確認するとわかるのですが、引数に配列で投稿データを渡すと投稿が実行されます。

$post_value = array(
    'post_author' => 1,// 投稿者のID。
    'post_title' => 'テストタイトル',// 投稿のタイトル。
    'post_content' => 'テスト本文', // 投稿の本文。
    'post_category' => array(1,5), // カテゴリーID(配列)。
    'tags_input' => array('タグ1′,'タグ2′), // タグの名前(配列)。
    'post_status' => 'publish' // 公開ステータス。
);
wp_insert_post($post_value);

ただ、wp_insert_post関数で投稿できるのは、「wp_posts」テーブルにある項目だけなので、update_post_meta関数を利用してカスタムフィールドに値を投稿します。

update_post_meta関数で投稿するには記事のIDが必要になるので、wp_insert_post関数が成功した時の戻り値(作成された記事の ID。失敗時は0)を利用します。

$post_value = array(
    'post_author' => 1,// 投稿者のID。
    'post_title' => 'テストタイトル',// 投稿のタイトル。
    'post_content' => 'テスト本文', // 投稿の本文。
    'post_category' => array(1,5), // カテゴリーID(配列)。
    'tags_input' => array('タグ1′,'タグ2′), // タグの名前(配列)。
    'post_status' => 'publish' // 公開ステータス。
);
$insert_id = wp_insert_post($post_value); //$insert_idには投稿のID(「wp_posts」テーブルの「ID」)が入る。 投稿に失敗した場合は0が返る。

if($insert_id) {
    update_post_meta($insert_id, 'key1′, 'カスタム1′); // キーが「key1」のカスタムフィールドの値に「カスタム1」を投稿
    update_post_meta($insert_id, 'key2′, 'カスタム2′); // キーが「key2」のカスタムフィールドの値に「カスタム2」を投稿

    /* 投稿に成功した時の処理等を記述 */
} else {
    /* 投稿に失敗した時の処理等を記述 */
}

※update_post_meta関数は本来上書き用の関数の様なのですが、値が存在しない時にはadd_post_meta関数が呼び出されるので新規投稿・上書きどちらにも対応できます。(詳細は公式のドキュメントでご確認を。)

この方法でカスタムフィールドにも値を投稿する事が出来ます。

ただ、この方法で投稿を行うとWP to Twitterでの自動投稿時にカスタムフィールドの値が渡らないようです。(あまりWP to Twitterでカスタムフィールドの値を使っている人はいないかもしれませんが・・・)

恐らく、

  1. wp_insert_postで記事を投稿(公開)→ この時点でWP to Twitterが自動投稿
  2. wp_insert_postの返り値を利用してカスタムフィールドを投稿

という実行順番になっている為と思われます。

で、ちょっと悩んで色々試したのですが、

  1. wp_insert_postで記事を投稿(下書き)
  2. wp_insert_postの返り値を利用してカスタムフィールドを投稿
  3. wp_insert_postの返り値を利用してwp_insert_postで記事を上書き(公開)→ この時点でWP to Twitterが自動投稿

とすれば、WP to Twitterでの自動投稿時にもカスタムフィールドの値が渡る事がわかりました。
※方法として正しいかは分かりませんが。。。

以下がそのソースになります。

$post_value = array(
    'post_author' => 1,// 投稿者のID。
    'post_title' => 'テストタイトル',// 投稿のタイトル。
    'post_content' => 'テスト本文', // 投稿の本文。
    'post_category' => array(1,5), // カテゴリーID(配列)。
    'tags_input' => array('タグ1′,'タグ2′), // タグの名前(配列)。
    'post_status' => 'draft' // 公開ステータスをこの時点では下書きにする。
);
$insert_id = wp_insert_post($post_value); //下書き投稿。

if($insert_id) {
    update_post_meta($insert_id, 'key1′, 'カスタム1′); // キーが「key1」のカスタムフィールドの値に「カスタム1」を投稿
    update_post_meta($insert_id, 'key2′, 'カスタム2′); // キーが「key2」のカスタムフィールドの値に「カスタム2」を投稿

    //配列$post_valueに上書き用の値を追加、変更
    $post_value['ID'] = $insert_id; // 下書きした記事のIDを渡す。
    $post_value['post_status'] = 'publish'; // 公開ステータスをこの時点で公開にする。

    $insert_id2 = wp_insert_post($post_value); //上書き(投稿ステータスを公開に)

    if($insert_id2) {
        /* 投稿に成功した時の処理等を記述 */
    } else {
        /* 投稿に失敗した時の処理等を記述 */
    }
} else {
    /* 投稿に失敗した時の処理等を記述 */
}

※上書き時にもタイトル、本文がwp_insert_post関数に渡されないと投稿が失敗するみたいです。(検証が不十分なのですが・・・)

この方法を使えばWP to Twitter以外にも記事の公開がトリガーとなるプラグイン等にカスタムフィールドの値を渡せるのではないでしょうか。