wp_insert_post()
は、WordPress で投稿(カスタム投稿含む)をプログラムから作成・更新するための関数です。
管理画面から手作業で投稿を追加するのではなく、テーマやプラグイン内で自動的に投稿を登録したい場合に非常に便利です。
この記事では、基本的な使い方から、カスタムフィールドやタクソノミーとの連携、注意点まで詳しく解説します。
目次
wp_insert_post() の基本構文
$post_id = wp_insert_post( array(
'post_title' => 'サンプルタイトル',
'post_content' => 'これはサンプルの投稿本文です。',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'post',
) );
上記のように、連想配列で投稿情報を渡すことで、新しい投稿が追加されます。返り値として投稿 ID が返されます。
主な引数一覧
キー | 説明 | 例 |
---|---|---|
post_title | 投稿タイトル | 'テスト投稿' |
post_content | 投稿本文 | '本文テキスト' |
post_status | 投稿の公開状態(publish , draft , etc.) | 'draft' |
post_author | 投稿者のユーザーID | 1 |
post_type | 投稿タイプ(post , page , カスタム投稿タイプ ) | 'post' |
post_date | 投稿日時(Y-m-d H:i:s 形式) | '2025-06-08 10:00:00' |
post_category | カテゴリIDの配列 | [3, 5] |
投稿を下書きとして保存
$post_id = wp_insert_post( array(
'post_title' => '下書き投稿',
'post_content' => 'これは下書きです。',
'post_status' => 'draft',
) );
投稿が既に存在する場合の更新処理
更新には ID
を指定します。指定された ID の投稿があれば更新され、なければ新規作成されます。
$post_id = wp_insert_post( array(
'ID' => 123,
'post_title' => 'タイトル更新',
'post_content' => '本文を更新しました。',
) );
カスタムフィールドを追加・更新する場合
$post_id = wp_insert_post( $args );
if ( ! is_wp_error( $post_id ) ) {
update_post_meta( $post_id, 'カスタムキー', 'カスタム値' );
}
カスタム分類(タクソノミー)を設定する
$post_id = wp_insert_post( $args );
if ( ! is_wp_error( $post_id ) ) {
wp_set_object_terms( $post_id, array( 'カスタムタグ' ), 'カスタムタクソノミー' );
}
投稿の重複を避けたい場合
post_title
や post_name
(スラッグ)で事前に投稿が存在するか確認してから wp_insert_post()
を使いましょう。
$existing = get_page_by_title( '重複チェックタイトル', OBJECT, 'post' );
if ( ! $existing ) {
wp_insert_post( $args );
}
エラー処理について
wp_insert_post()
は失敗した場合、WP_Error
オブジェクトを返します。以下のようにチェックしましょう。
$post_id = wp_insert_post( $args );
if ( is_wp_error( $post_id ) ) {
echo '投稿の作成に失敗しました: ' . $post_id->get_error_message();
}
セキュリティ対策を忘れずに
wp_insert_post()
をフォーム送信などと組み合わせる場合、必ず nonce チェックや ユーザー権限の確認を行いましょう。
if (
isset( $_POST['my_nonce_field'] ) &&
wp_verify_nonce( $_POST['my_nonce_field'], 'my_action' ) &&
current_user_can( 'edit_posts' )
) {
// 安全に投稿作成
wp_insert_post( $args );
}
なぜ必要?
wp_insert_post()
は権限を自動で制限しません。- フロントエンドのフォーム経由での悪意ある投稿を防ぐために必要です。
カスタム投稿タイプで使う場合の注意点
post_type
に 'my_custom_post'
を指定すれば、カスタム投稿タイプに対して投稿が追加できます。
ただし、投稿前にその投稿タイプが register_post_type()
で正しく登録されている必要があります。
'post_type' => 'book' // 例:書籍投稿タイプ
※ 投稿タイプが存在しない場合、正常に投稿されないか、post
として登録されてしまう可能性があります。
投稿のステータスごとの挙動
ステータス | 説明 |
---|---|
publish | 公開投稿として追加される |
draft | 下書きとして保存される |
pending | 承認待ち状態で追加される |
private | ログインユーザーのみに表示される |
future | 未来の日時を指定すると予約投稿になる |
'post_status' => 'future',
'post_date' => '2025-06-10 10:00:00'
予約投稿にしたい場合
日時とともに post_status
を future
に設定すれば、予約投稿が可能です。
$args = array(
'post_title' => '予約投稿の例',
'post_content' => 'この投稿は未来に公開されます。',
'post_status' => 'future',
'post_date' => '2025-06-15 09:00:00'
);
WordPress は内部で WP-Cron を使用して指定日時に投稿を公開します。
よくある用途
- フォーム送信時に投稿を自動作成
- 外部データから投稿をインポート
- 管理者操作なしで定期的に投稿を追加(cronと組み合わせ)