カスタム投稿で、記事投稿時に別のカスタム投稿記事を自動生成したかったのでwp_insert_postを使って自動化してみた。
環境
WordPress: 5.9
PHP:7.4
MySQL:5.7.32
サンプルコード
// 投稿オブジェクトを作成
function add_diary(){
// 投稿オブジェクトのパーマリンクを取得
$recent = get_posts('post_type=diary');
if (count($recent) > 0) {
$recent_id = $recent[0]->ID;
$recent_url = get_permalink($recent_id);
echo $recent_url;
}
// 投稿パラメータを指定
$my_post = array(
'post_title' => '「日記」を更新しました',
'post_type' => 'news',
'post_content' => $recent_url,
'post_status' => 'publish',
'post_name' => 'news-'.$recent_id,
'post_author' => 1,
'post_category' => array(8,39)
);
// 投稿をデータベースへ追加
wp_insert_post( $my_post );
}
add_action('publish_diary', 'add_diary' ,10, 1);
解説
1、カスタム投稿に記事が保存されたタイミングをフックとして自動投稿を実行。
add_action('publish_diary', 'add_diary' ,10, 1);
※publish_〇〇にしないとカスタム投稿タイプ認識してもらえないので注意
2、最近の投稿からパーマリンク、記事IDを取得
// 投稿オブジェクトのパーマリンクを取得
$recent = get_posts('post_type=diary'); //カスタム投稿タイプdiary指定
if (count($recent) > 0) {
$recent_id = $recent[0]->ID;
$recent_url = get_permalink($recent_id);
echo $recent_url;
}
3、自動生成する記事の基本設定
// 投稿パラメータを指定
$my_post = array(
'post_title' => '「日記」を更新しました', //投稿記事タイトル
'post_type' => 'news', //カスタム投稿タイプ、
'post_content' => $recent_url, //記事内容 (リンクさせたい投稿のパーマリンクを出力)
'post_status' => 'publish',
'post_name' => 'news-'.$recent_id, //投稿記事のスラッグ
'post_author' => 1,
'post_category' => array(8,39)
);
※wp_insert_post()で自動生成した記事のスラッグが何故か全部0になって前の記事・次の記事が機能しなかったのでとりあえずスラッグを変更で対策。
4、投稿をデータベースへ追加
wp_insert_post( $my_post );
ひとりごと
カスタムフィールドで紐付け出来ないか試したけど、これが結局一番早かった
参考
https://www.mt-megami.com/article/460955029
https://lpeg.info/wordpress/new_post.html#m3