説明
wp_insert_post() は、新しい投稿を作成する関数です。ID を含めて渡すと、既存投稿の更新も行えます。
基本構文
wp_insert_post( array $postarr, bool $wp_error = false, bool $fire_after_hooks = true ): int|WP_Error
引数
$postarr:投稿データの配列(post_title、post_content、post_status、post_typeなど)$wp_error:trueにすると失敗時にWP_Errorを返す$fire_after_hooks:保存後のフックを実行するか
戻り値
成功すると投稿ID。失敗時は 0 または WP_Error。
使い方(サンプル)
$id = wp_insert_post( array(
'post_title' => 'サンプル',
'post_content' => '本文',
'post_status' => 'publish',
'post_type' => 'post',
), true );
if ( is_wp_error( $id ) ) {
error_log( $id->get_error_message() );
}
注意点
post_statusを省略するとdraftになります。- データは内部でスラッシュ処理されます。
$_POST由来など、エスケープ済みの値にはwp_slash()が必要な場合があります。 post_authorを省略すると、現在のユーザーが投稿者になります。
実務での使いどころ
- プログラムから、新しい投稿を作成するとき(インポートや、フォームからの投稿など)。
- カスタム投稿タイプの記事を、自動で登録するとき。
post_title・post_content・post_statusなどを、配列で渡して登録するとき。
よくあるミスと対処
post_statusを省略している。既定はdraftのため、公開されない。- 失敗したときの戻り値を確認していない。
$wp_errorがfalse(既定)なら0、trueならWP_Errorが返る。 - フォームの入力値を、そのまま渡している。検証とサニタイズをしてから渡す。
save_postフックの中で呼び、無限ループになる。
NG例
wp_insert_post( array( 'post_title' => 'タイトル' ) ); // 下書きとして保存される
OK例
$post_id = wp_insert_post( array(
'post_title' => 'タイトル',
'post_content' => '本文',
'post_status' => 'publish',
'post_type' => 'post',
), true );
if ( is_wp_error( $post_id ) ) {
return;
}
使い分け早見表
| やりたいこと | 使うもの |
|---|---|
| 新規作成 | wp_insert_post() |
| 既存の投稿を更新 | wp_update_post() |
| IDを指定して更新 | 原則 wp_update_post()。wp_insert_post() で更新するときは、post_status など全項目を明示する(省略した項目は、既定値になる) |
関連項目
wp_update_post()、wp_delete_post()、wp_set_post_terms()
公式リファレンス:wp_insert_post() | Function | WordPress Developer Resources

コメント