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

作成日:

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

操作の流れとしては

  1. add_actionsave_postを実行するファンクション作成
  2. ファンクションで、該当投稿更新時に、カスタムフィールドの値を参照して子投稿のIDを取得
  3. 子投稿それぞれに
    PHP
    $parent_ary = array(
    	'ID'          => $child_id,
    	'post_parent' => $the_post_id,
    );
    wp_update_post( $parent_ary );
  4. 下記参照に無限ループ解除
    PHP
    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' );
favicon
関数リファレンス/wp update post - WordPress Codex 日本語版 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_update_post

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

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

PHP
$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から更新するようにして問題回避しました。

favicon
WordPressでQueryをゴリゴリ操作 wpdbまとめ | ITかあさん http://www.kaasan.info/archives/3576

みんなー!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でホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。

Loading...

コメントをどうぞ

  • メールアドレスが公開されることはありません。
  • コメント欄にURLは入力できません。
  • このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。