update_post_meta()のパラメータに配列が使えない
-
WordPress初心者です。
「編集画面に独自のカスタムフィールドの入力項目を追加する」
上記のサイトを参考に、
m行n列のチェックボックス入力フォームのテーブルをHTMLで作成して
カスタムフィールドの値として投稿時に更新しようとしています。このとき、<input type=”checkbox” …> のname属性として
あらかじめ作成した2次元配列) $Table[$m][$n] を使い
echo '<input type="checkbox" name='.$Table[$m][$n].' value="1" checked />';
のように指定して、mとnのwhileループ中に記述、編集画面にもきちんと表示されています。しかし、これをadd_action()関数と update_post_meta()関数を用いて
update_post_meta($post->ID, $Table[$m][$n], $_POST[$Table[$m][$n]]);
のように配列要素でパラメータを指定したいのですが、うまく値が更新されません。update_post_meta($post->ID, 'A1', $_POST['A1']);
のように文字列でパラメータを指定すると、きちんと更新されるのですが。何か配列を使用する際には特別な配慮が必要なのでしょうか。
お知恵を頂ければ幸いです。
よろしくお願い致します。
-
こんにちは、TKO_W さん。
update_post_meta() 関数のパラメーターは以下のようになっています。
/** * @param int $post_id Post ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param mixed $prev_value Optional. Previous value to check before removing. * Default empty. * @return int|bool Meta ID if the key didn't exist, true on successful update, * false on failure. */ update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' );
第二引数はカスタムフィールドのメタキーになり、第三引数がキーに対する値です。
update_post_meta($post->ID, $Table[$m][$n], $_POST[$Table[$m][$n]]);
ですと、第二引数がバリューになっているように思われます(たぶん)。つまり・・・
get_post_meta( $post->ID, '1', false );
で、保存した値が取得できると思われます(たぶん)。
KUCKLUさん、お返事ありがとうございます。
第2引数に使っている配列要素$Table[$m][$n]はinputのname指定にも使っているカスタムフィールドの項目名ですので、バリューではないんですよね。
<input> で入力したバリューは$_POST[‘カスタムフィールド名’]で取得できてるのですが、ここに配列要素に使おうとすると反映されないという症状です。
確かにそうですよね。見当違いな回答で大変失礼いたしました。
update_post_meta( $post->ID, $Table[$m][$n], '158953' );
として保存した場合
get_post_meta( $post->ID, $Table[$m][$n] );
で取得できるけれども
update_post_meta( $post->ID, $Table[$m][$n], array( 'forum' => '158953' ) );
として保存した場合
get_post_meta( $post->ID, $Table[$m][$n] );
では取得できないということですよね。update_post_meta() の meta_value に配列を渡したとしても、通常は保存されるので、meta_key または get_post_meta() 関数を代入している変数から値の取り方に問題がある気がします。
例えば、僕がよくやってしまうミスとしては、get_post_meta() 関数の第三引数の値のミスです。
update_post_meta( $post->ID, $Table[$m][$n], array( 'forum' => '158953' ) );
として保存し
$Test = get_post_meta( $post->ID, $Table[$m][$n] );
とした場合
echo esc_html( $Test[0]['forum'] );
で取得できます。
$Test = get_post_meta( $post->ID, $Table[$m][$n], true );
この場合は
echo esc_html( $Test['forum'] );
で取得できます。
あとは、HTML の input タグの name 属性の指定方法をよく間違えます。checkbox の場合、name=”test[]” としないといけないところ、name=”test” としてしまうことがあります。
そもそも、データベースに保存されていないとなりますと、他の原因になると思います。思いついたら追記いたします。
またまた、見当違いな回答をしていた場合、申し訳ございません。
KUCKLUさん、ありがとうございます。
update できていても、正しくgetできていない可能性もありますね。
明日職場で確認してみます。と、ここで別の問題が気になってきました。
参考にしたコードにならい、
チェックボックスの値を保存する関数を定義して、
その中で配列要素を呼び出そうとしているのですが、function my_box_save($post_id) { global $post; ... update_post_meta($post->ID, $Table[$m][$n], $_POST[$Table[$m][$n]]); } add_action('save_post', 'my_box_save');
恥ずかしながらグローバル変数、変数のスコープという概念があることを今日知りました。
配列$Table
は特にグローバル宣言しておりません。配列も関数のなかでグローバル宣言できるものなのでしょうか。
もしくは関数のなかで再度、配列を定義しなおせば、
認識してくれるのでしょうか。こちらも試してみたいと思います。
<input> で入力したバリューは$_POST[‘カスタムフィールド名’]で取得できてるのですが、ここに配列要素に使おうとすると反映されないという症状です。
と書かれていたのでスルーしていたのですが、$Table[$m][$n] と $_POST[$Table[$m][$n]] を var_dump() 関数に通した時、ご自身が想定した値になっていますでしょうか?
function my_box_save($post_id) { var_dump( $Table[$m][$n] ); var_dump( $_POST[$Table[$m][$n]] ); exit; } add_action('save_post', 'my_box_save');
var_dump() 関数のあとに、exit すれば、そこで処理が止まり値を確認できます。
配列$Tableは特にグローバル宣言しておりません。
ということは、my_box_save() 関数内で $Table を定義していない限り、$Table はエラーをはいているような気がするのですが・・・いかがでしょうか?
- トピック「update_post_meta()のパラメータに配列が使えない」には新たに返信することはできません。