【WordPress】save_postでwp_update_postがうまく機能しないので、$wpdb->updateを使う
WordPressで投稿の付加したカスタムフィールドの値に応じて、投稿の保存時に「親子関係」を設定しようとコードを書いていましたが、つまづきました。
操作の流れとしては
add_action
でsave_post
を実行するファンクション作成- ファンクションで、該当投稿更新時に、カスタムフィールドの値を参照して子投稿のIDを取得
- 子投稿それぞれに PHP
$parent_ary = array( 'ID' => $child_id, 'post_parent' => $the_post_id, ); wp_update_post( $parent_ary );
- 下記参照に無限ループ解除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' );
としましたが、子投稿のカスタムフィールドの値がすべて親投稿のカスタムフィールドの値に置き換わってしまう事態が起こりました。
解決策が見えないので、結局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で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を楽しんでいます。
コメントをどうぞ