update_post_metaでシリアライズされたデータを更新したい
-
いつもお世話になっております。
先日、「Contact Form 7」と「flamingo」でデータベースに保存している送信データを update_post_meta で上書きする際に、checkboxがうまくいかないという件で質問させていただき、一旦解決済みとしたのですが、やはり、うまくいかずに困っております。
業務用の社内のページなので、リンクを記載することは難しいのですが、例えば、「発注済み」というチェックボックスがあり、以下のようなコードでその値のみの更新は出来ても、配列となっていないので、後に読み込んだ際に不具合が起きます。
また、flamingoの受信メッセージでは、チェックして送信(submit)後の本来なら「● 発注済み」と表示されますが、値のみなので「発注済み」という単なる文字列になっています。
これを、シリアライズされた本来の状態で update_post_meta したいのですが、なかなかうまくいきませんので、ご教示いただけると幸いです。
どうぞ、よろしくお願いいたします。//***テンプレートファイル*** <script type="text/javascript"> $(document).ready(function () { // 上書きボタンクリック時の処理 $("#overWriteBt").on("click", function () { var update_order = $('input[name="order[]"]').prop('checked') // フォームの値が空でない場合のみ実行 if (update_order !== "") { // 投稿のID var postId = post_id; // 上書きする値 var newValue_order = update_order; // メタ値を更新する updatePostMeta(postId, '_field_order', newValue_kasei_order); } }); // update_post_meta() 関数の代替 function updatePostMeta(postId, metaKey, newValue) { $.ajax({ type: 'POST', url: '<?php echo admin_url('admin-ajax.php'); ?>', data: { action: 'update_post_meta_action', post_id: postId, meta_key: metaKey, new_value: newValue, }, success: function (response) { console.log(response); // デバッグ用にレスポンスを表示 }, error: function (error) { console.log(error); // エラーメッセージを表示 } }); } }); </script>
//***functions.php*** add_action('wp_ajax_update_post_meta_action', 'update_post_meta_action_callback'); add_action('wp_ajax_nopriv_update_post_meta_action', 'update_post_meta_action_callback'); function update_post_meta_action_callback() { $post_id = $_POST['post_id']; $meta_key = $_POST['meta_key']; $new_value = $_POST['new_value']; // メタ値を更新する update_post_meta($post_id, $meta_key, $new_value); // 必要に応じてレスポンスを返す(成功メッセージなど) echo 'メタ値が更新されました。'; // WordPressの処理を終了する wp_die(); }
-
@junichik さん、こんにちは。
すでに解決済みかもしれませんが…あと検証時間がなかったので具体的な解決策でもありません…
それを踏まえて、
update_post_meta()
を実行しようとしているという事は WordPress のデータベース内を直接書き換えようとしていると思われますが、 WordPress のデータベース内でチェックボックスがどのように保管されているか確認はされましたでしょうか。まずはデータベース内のチェックボックスの保存状態を確認し、
update_post_meta()
を実行する際に同様のデータを作成して保存しなければならないと思います。値だけ取得して値を保存すれば文字列だけになってしまうのは当然かと…ご参考になれば。
@shokun0803 さま
ご返信いただき、本当にありがとうございます。
ちょうど昨日、全体的に完成しまして、ご報告が遅れ、申し訳ありません。
結果的には、以下のコードでうまくいきました。
とりあえずこれで解決済みとさせていただきます。//***テンプレートファイル*** <script type="text/javascript"> $(document).ready(function () { // 上書きボタンクリック時の処理 $("#overWriteBt").on("click", function () { // チェックボックスのチェック状態を取得 var checkboxStatus = $('input[name="order[]"]').is(':checked'); // フォームの値が空でない場合のみ実行 if (checkboxStatus !== "") { // 投稿のID var postId = post_id; // 苛性注文データベースの更新処理 $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', data: { action: 'update_array_data', update_array_status: checkboxStatus ? '発注済み' : '', meta_key: '_field_order', post_id: postId }, success: function(response) { // 成功時の処理 console.log('データベースが更新されました'); }, error: function(xhr, status, error) { // エラー時の処理 console.log('データベースの更新でエラーが発生しました'); } }); } }); }); </script>
//***functions.php*** // チェックボックスのデータベース更新処理 add_action('wp_ajax_update_array_data', 'update_array_data'); add_action('wp_ajax_nopriv_update_array_data', 'update_array_data'); function update_array_data() { if (isset($_POST['update_array_status']) && isset($_POST['post_id'])) { $post_id = $_POST['post_id']; $updateArrayStatus = $_POST['update_array_status']; $metaKey = $_POST['meta_key']; // post_metaテーブルの更新 $metaValue = array($updateArrayStatus); update_post_meta($post_id, $metaKey, $metaValue); wp_send_json_success(); // 成功レスポンスを送信 } }
- トピック「update_post_metaでシリアライズされたデータを更新したい」には新たに返信することはできません。