はじめに
「投稿した記事を自動的に複製するシステムがほちい」という要望があった。
内容的にはjsで見た目を切り替えるだけのページで偽造してもよかったんだけれど、それだとなんか物足りない。
ので、functions.phpから投稿を管理するシステムを作ってみました。
要件定義
・カスタム投稿タイプtypehogeの記事を新規作成、内容(カスタムフィールド含む)を入力して投稿ボタンを押すと、その記事と同じタイトル、およびカスタムフィールド値(3種)を持つ複製記事が、別のカスタム投稿タイプtypehoge2の記事として投稿される
実際のコード
// 投稿の自動複製システム
function function_copying_posts(){
// 現在動作中の投稿の情報(新規作成した記事……つまりコピー元の内容)を取得します。
global $post;
if($post->post_type == 'typehoge'){
$current_postID = $post->ID;
// ACFフィールドに入力された値を取得します。
// この関数が実行されるタイミングは投稿がデータベースに登録される前なので、
// $_POSTを用いています。
$hoge_name = $_POST['acf']["field_5d106111f2430"];
$hoge_price = $_POST['acf']["field_5d1060e886e4d"];
$hoge_comment = $_POST['acf']["field_5d8561357b6fa"];
// 自動投稿するときのステータスをここで指定します。
$draft_my_options = array(
'post_title' => get_the_title($current_postID),
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'typehoge2'
);
// 新しい記事を投稿しつつ、その記事のidを取得します。
// この行が実行されるタイミングで投稿そのものは完了していることに注意してください。
$newpost_id = wp_insert_post($draft_my_options);
if($newpost_id){
// カスタムフィールドに値を挿入しています。
update_post_meta($newpost_id, 'hoge_name2', $hoge_name);
update_post_meta($newpost_id, 'hoge_price2', $hoge_price);
update_post_meta($newpost_id, 'hoge_comment2', $hoge_comment);
}
}
}
add_action( 'publish_typehoge', 'function_copying_posts', 9);
解説
コピー元投稿のデータ取得→コピー先投稿を公開→コピー先のカスタムフィールドを上書き……の順番で行っている。
苦労したのはカスタムフィールドに入力した内容を取得する部分。
これはACFの話だが、どうも記事が投稿されるタイミング(つまり、関数function_copying_postsが動き出すタイミング)よりACFデータがデータベースに記録されるタイミングの方が遅いらしいので、get_field()やget_post_meta()だとカスタムフィールドに入力した値を取得できない。
なので俺の場合は、データベースに登録される前に入力欄のinput要素から直接入力内容を取り出す方式にした。
$_POST['acf']["field_5d106111f2430"];
こんな感じ。
なお、このinputから取り出すコマンド、「field_5d106111f2430」部分を取得したい入力欄にあるフィールドキーに書き換えれば問題なく使える。そのへんの話はこのサイトに載っていたので、参考にしてほしい。
余談
functions.phpを改修する上で以下のコードはすげー役に立ったので書いとく。
var_dump( $hoge );
exit;
PHP使いならご存じvar_dump()
。
普段のWordpress改修では欠かせない存在だけれども、functions.phpのような、表示に使われないphpファイルでは実質使えないのが難点だった。
が、直後にexit;
と打っておくと式がvar_dump()
を実行した段階で強制終了するので、変数の中身とかを確認できる。
広まれ。
あと、自動投稿を行う部分だけを抜き出すと以下の通りになるらしい。
$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_term()
など、自動で管理画面を制御してくれるコードはほかにもいくつかあるみたい。
参考資料
http://blog.ale-cole.com/php/wordpress/69/
https://www.advancedcustomfields.com/resources/acf-save_post/
https://teratail.com/questions/107958
https://torounit.com/blog/2013/05/22/1544/