【wordpress】コードから投稿する方法

【wordpress】コードから投稿する方法

wordpressで通常の投稿画面から、カスタム投稿画面からではなく投稿する方法を紹介します。

固定の形にあてはめたり、独自のcsvデータをもとに記事を流し込みたい場合には便利ではないかなと思います。

例ではカスタム投稿を例にしています。

  • カスタム投稿タイプの投稿
  • 投稿したカスタム投稿タイプにアイキャッチ設定

の流れで見ていきます。

コードから投稿を行う方法

function shm_get_dmm() {
		$post_arg = [
			'post_title'   => 'my_post_title',
			'post_status'  => 'publish',
			'post_name'    => 'my_post_slug',
			'post_type'    => 'movie',
			'post_content' => $content,
			'tax_input'    => [ 
				'my_tag' => $taxonomys
			],
      'meta_input'   => [
        'my_meta_key'  =>  'my_meta_value'
      ]
		];
		$ins_post_id = wp_insert_post( $post_arg );
		wp_set_object_terms( $ins_post_id, $taxonomys, 'my_tag', true );
}

wp_insert_postを使用することで投稿することができます。返り値はpost_idになります。

wp_insert_postの引数で指定する配列には公式ページに詳細があります。

第二引数をtrueに設定するとエラーの際にWP_Errorを返してくれます。

主要なものを以下で解説します。

post_title」・・・

タイトルを指定できます。デフォルトはemptyです。

post_name」・・・

スラッグを指定できます。デフォルトは指定文字を除いたタイトルになります。

post_status」・・・

投稿状態を指定できます。(下書き、公開など)デフォルトは下書きです。

(下書き「draft」 公開「publish」など)

post_type」・・・

投稿タイプを指定することができます。デフォルトは「投稿(post)」です。

post_content」・・・

投稿内容を指定できます。通常の投稿画面であればエディターで入力する内容です。

post_excerpt」・・・

抜粋を指定できます。デフォルトは空の文字列です。

post_category」・・・

投稿に関連しているカテゴリーの指定ができます。カテゴリーIDを配列で指定します。デフォルトは「デフォルトカテゴリー」が指定されます。

tags_input」・・・

投稿に関連しているタグの指定ができます。配列で指定することが可能で、指定にはタグ名、スラッグ、IDが使用可能です。デフォルトは空の配列です。

tax_input」・・・

タクソノミーの指定が可能です。以下のようにして指定することができます。カスタム投稿でうまく機能しませんでした。

'tax_input'=> [
    'my_taxonomy' => [
        'term1',
        'term2',
        'term3'
    ]
]

meta_input」・・・

カスタムフィールドの設定ができます。以下のようにキーバリューの形で指定可能です。

'meta_input' => [
    'meta_key' => 'meta_value'
]

カスタム投稿の場合tax_inputでタクソノミーが追加できない可能性があります。

その場合「wp_set_object_terms」によって指定します。

wp_set_object_terms( int $object_id, string|int|array $terms, string $taxonomy, bool $append = false )

object_id」にはwp_insert_postで追加した際の返り値である投稿IDを指定しています。

terms」には紐づけるタームの配列を指定します。

taxonomy」は紐づけるタクソノミーを指定します。

append」は既存のタームが存在しなかった場合に追加するかしないかを選択できます。デフォルトは追加しません。(false)

アイキャッチの設定(サムネイル)

	$image = file_get_contents( $image_url );
	$filename = basename( $image_url );
	if( wp_mkdir_p( $upload_dir['path'] ) ) {
		$file = $upload_dir['path']. '/'. $filename;
	} else {
		$file = $upload_dir['basedir']. '/'. $filename;
	}
	file_put_contents( $file, $image );
	$wp_filetype = wp_check_filetype( $filename, null );
	$attachment = [
		'post_mime_type' => $wp_filetype['type'],
		'post_title'     => sanitize_file_name( $filename ),
		'post_content'   => '',
		'post_status'    => 'inherit'
	];
	$attach_id = wp_insert_attachment( $attachment, $file, $ins_post_id );
	require_once( ABSPATH . 'wp-admin/includes/image.php' );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    wp_update_attachment_metadata( $attach_id, $attach_data );
    set_post_thumbnail( $ins_post_id, $attach_id );

上記内容を追加します。

流れを追っていくと

  • ファイルの取得
  • アップロードフォルダに取得したファイルをあげる
  • 投稿にファイルを関連付ける
  • 各種サイズの作成
  • サムネイルに設定する

という流れです。

重要なのは下の5行です。

wp_insert_attachment」で添付ファイルを挿入します。

wp_insert_attachment( string|array $args, string $file = false, int $parent, bool $wp_error = false )

オプションの指定、ファイルの指定、挿入する投稿IDの指定をします。

次に「wp_generate_attachment_metadata」で添付ファイルをあらかじめ定義された画像サイズのメタデータを作成します。

require_once( ABSPATH . 'wp-admin/includes/image.php' )
wp_generate_attachment_metadata( int $attachment_id, string $file )

添付ファイルのIDとファイル名を指定します。

また、独自にfunctions.phpなどで使用する場合は「wp-admin/includes/image.php」を呼び出す必要があります。

次に「wp_update_attachment_metadata」で添付ファイルを先ほど作成したメタデータで更新します。

wp_update_attachment_metadata( int $attachment_id, array $data )

最後に「set_post_thumbnail」で指定した投稿にサムネイルを設定しています。

set_post_thumbnail( int|WP_Post $post, int $thumbnail_id )

最後に

コードから投稿するまではそれなりに簡単なのですが、サムネイル設定が絡んでくると少し複雑になるような気がします。

この紹介したサムネイルの手順を踏むことでメディアにもちゃんと登録されます。