【WordPress】save_postでwp_update_postがうまく機能しないので、$wpdb->updateを使う

【WordPress】save_postでwp_update_postがうまく機能しないので、$wpdb->updateを使う



WordPressで投稿の付加したカスタムフィールドの値に応じて、投稿の保存時に「親子関係」を設定しようとコードを書いていましたが、つまづきました。

操作の流れとしては
1. add_actionsave_postを実行するファンクション作成
2. ファンクションで、該当投稿更新時に、カスタムフィールドの値を参照して子投稿のIDを取得
3. 子投稿それぞれに

$parent_ary = array(
	'ID'          => $child_id,
	'post_parent' => $the_post_id,
);
wp_update_post( $parent_ary );

4. 下記参照に無限ループ解除

function my_function( $post_id ){
	if ( ! wp_is_post_revision( $post_id ) ) {
	
		// この関数をフックから外し、無限ループを防ぐ。
		remove_action( 'save_post', 'my_function' );
	
		// 投稿を更新する。save_post がもう一度実行される。
		wp_update_post( $my_args );

		// この関数を改めてフックする。
		add_action( 'save_post', 'my_function' );
	}
}
add_action( 'save_post', 'my_function' );

としましたが、子投稿のカスタムフィールドの値がすべて親投稿のカスタムフィールドの値に置き換わってしまう事態が起こりました。

解決策が見えないので、結局wp_update_postは使わず、

$data             = array(
	'post_parent' => $the_post_id,
);
$condition        = array(
	'ID' => $child_id,
);
$dataFormat       = array( '%s' );
$conditionsFormat = array( '%d' );
$wpdb->update( $wpdb->posts, $data, $condition, $dataFormat, $conditionsFormat );

のように、直接$wpdbから更新するようにして問題回避しました。

WordPressでQueryをゴリゴリ操作 wpdbまとめ | ITかあさん
参考
WordPressでQueryをゴリゴリ操作 wpdbまとめ | ITかあさん

みんなー!WordPressでSQLゴリゴリ書いてるかーい! しーーん ここ半年ほどITかあさんはWordPressでQueryをゴリゴリ書いてます。 今更ながら お!wpdbすごいぞ!SELECT文 UPDATEを直接書くよりも楽!と驚きまして、せっかくなので すごいぞ!今すぐ使えるwpdbをまとめたいと思います。 なお、基本的にこの記事はCodex:Class Reference/wpdbに書いてある内容とそれほど変わらないので、そちらを見て頂いても大丈夫です。 プリペアドステートメント SQLをゴリゴリ書く前にwpdbでqueryを書く際で最も重要なプリペアドステートメントについてです。 (プリペアドステートメントと聞いて全くピンと来ない人はブラウザをそっと閉じてください。そんな人はまだSQL書いてはいけません。ヤケドを負います。負傷します。) $wpdb->prepare('query',$vaule1,$vaule2...) $prepared_sql = $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", 10, $metakey, $metavalue ); プリペアドステートメントはこんな感じで、$prepared_sqlにプリペアドステートメント化されたSQLが入ります。 %d … int型 %s … text型 上記$prepared_sql(プリペアステートメントをセットした状態のSQL)をver_dumpで確認するとこんな感じ。 INSERT INTO wp_postmeta ( post_id, meta_key, meta_value ) VALUES ( 10, 'meta_key', 'meta_value' ) text型ならセットした変数の部分がコロンで囲われます。 mysqli_prepare() なんかと考え方は一緒ですね。 SELECT文 複数件取得 $myrows = $wpdb->get_results( " SELECT * FROM $wpdb->users " ); これだとwp

WordPressでQueryをゴリゴリ操作 wpdbまとめ | ITかあさん ITかあさん

いちばんやさしいWordPressの教本 第4版 5.x対応 人気講師が教 える本格Webサイトの作り方 (「いちばんやさ...

いちばんやさしいWordPressの教本 第4版 5.x対応 人気講師が教 える本格Webサイトの作り方 (「いちばんやさ...

石川栄和, 大串 肇, 星野邦敏
1,738円(01/22 18:43時点)
発売日: 2019/07/25
Amazonの情報を掲載しています
今日はここまで

関連する記事



こちらはいかが?


コメントを残す