実現したいこと
contact form7から送信した値で、ショートコードを埋め込んでいる固定ページの値が変更されてしまう
前提
wordpressにてシステム構築しています。
contactform7から送信された値でカスタム投稿reportとカスタム投稿ledgerが新規される仕組みを個別ページスラッグ名formにショートコードを入れて実装しました。
そして、個別ページスラッグ名formに既存のreportを表示させ、contactform7を使って更新する仕組みをfunctions.phpにて、作りました。しかし、これは更新はされますが同時に新規作成もされてしまうため、修正していました。
すると何が原因か、contactform7から送信されたカスタムフィールドの値で個別ページのタイトルなどが書き換えられてしまい。埋め込んでいたショートコードが消えてしまう現象が急に発生しました。
今朝まではそうなっていなかった&バックアップしたのになぜそうなるのか分かりません。どなたか助けてください。
心当たりとしては、
・デバッグできるように本日wp-config.phpの属性を書き換えたこと(しかしその後数時間は問題なかった)
・CF7 DTX: Shortcode data access requires allow-listing. Edit Settings | Scan & Resolve | More Informationという警告文らしきものがfunctions.phpページの上部にいる(しかし、この警告がない時からトラブルが起きた)
があります
使用しているコンタクトフォームは一つだけで、その内容は下記です。
[hidden existing_report_id class:existing-report-id] [hidden existing_report_id default:shortcode_attr existing_report_id] <label> 工事件名: [text* subject placeholder "工事件名を入力してください"] </label> <label> 工事番号: [text* number placeholder "工事番号を入力してください"] </label> <label> 工事内容: [textarea* content placeholder "工事内容を入力してください"] </label> <label> 投稿者: [dynamictext posted-user "CF7_get_current_user_login"] </label> [submit "日報を送信"]
下記コードですが文字数制限オーバーしているためかいつまんで載せました。すべて記載されているfunctions.phpはこちらになります。
[functions.php](https://drive.google.com/file/d/14UqYme79zEJrWtRGFFLDa0U1nlMyLI1B/view?usp=drive_link
該当のソースコード
functions.php
1 2//コンタクトフォーム7から送信した内容でカスタム投稿個別ページを作る 3function create_report_and_ledger_posts($contact_form) { 4 5 $form_id = 14; // Contact Form 7のフォームID 6 if ($contact_form->id() == $form_id) { 7 $submission = WPCF7_Submission::get_instance(); 8 if ($submission) { 9 // reportの投稿を作成 10 $report_post_data = array( 11 'post_title' => sanitize_text_field($data['subject']), 12 'post_content' => sanitize_textarea_field($data['content']), 13 'post_type' => 'report', 14 'post_status' => 'publish', 15 ); 16 $report_post_id = wp_insert_post($report_post_data); 17 18 // reportのカスタムフィールドを更新 19 if ($report_post_id) { 20 update_post_meta($report_post_id, 'subject', sanitize_text_field($data['subject'])); 21 update_post_meta($report_post_id, 'number', sanitize_text_field($data['number'])); 22 update_post_meta($report_post_id, 'content', sanitize_textarea_field($data['content'])); 23 update_post_meta($report_post_id, 'posted-user', sanitize_textarea_field($data['posted-user'])); 24 } 25 26 // ledgerの投稿を作成 27 $ledger_post_data = array( 28 'post_title' => sanitize_text_field($data['subject']), 29 'post_content' => sanitize_textarea_field($data['content']), 30 'post_type' => 'ledger', 31 'post_status' => 'publish', 32 ); 33 $ledger_post_id = wp_insert_post($ledger_post_data); 34 35 // ledgerのカスタムフィールドを更新(必要に応じて) 36 if ($ledger_post_id) { 37 update_post_meta($ledger_post_id, 'subject', sanitize_text_field($data['subject'])); 38 update_post_meta($ledger_post_id, 'number', sanitize_text_field($data['number'])); 39 update_post_meta($ledger_post_id, 'content', sanitize_textarea_field($data['content'])); 40 update_post_meta($report_post_id, 'posted-user', sanitize_textarea_field($data['posted-user'])); 41 } 42 43 // 最新の report と ledger の投稿IDを保存 44 update_option('latest_report_post_id', $report_post_id); 45 update_option('latest_ledger_post_id', $ledger_post_id); 46 } 47 } 48} 49add_action('wpcf7_mail_sent', 'create_report_and_ledger_posts'); 50 51 52 53function display_editable_report_form() { 54 $output = ''; 55 $current_user = wp_get_current_user(); 56 if (is_user_logged_in() && in_array('worker', $current_user->roles)) { 57 $args = array( 58 'post_type' => 'report', 59 'post_status' => 'publish', 60 'meta_query' => array( 61 array( 62 'key' => 'posted-user', 63 'value' => $current_user->user_login, 64 'compare' => '=' 65 ), 66 ), 67 'date_query' => array( 68 array( 69 'after' => 'first day of this month', 70 'before' => 'last day of this month', 71 'inclusive' => true, 72 ), 73 ), 74 ); 75 $reports = new WP_Query($args); 76 if ($reports->have_posts()) { 77 while ($reports->have_posts()) { 78 $reports->the_post(); 79 $report_id = get_the_ID(); 80 $subject = get_post_meta($report_id, 'subject', true); 81 $number = get_post_meta($report_id, 'number', true); 82 $content = get_post_meta($report_id, 'content', true); 83 84 $output .= '<h2>' . get_the_title() . '</h2>'; 85 $output .= do_shortcode('[contact-form-7 id="14" existing_report_id="' . $report_id . '" subject="' . esc_attr($subject) . '" number="' . esc_attr($number) . '" content="' . esc_attr($content) . '"]'); 86 87 } 88 } else { 89 $output .= '<p>編集可能な日報はありません。</p>'; 90 } 91 wp_reset_postdata(); 92 } else { 93 $output .= '<p>編集するにはログインしてください。</p>'; 94 } 95 return $output; 96} 97add_shortcode('editable_report_form', 'display_editable_report_form'); 98 99// 新しく更新用の関数を追加 100function update_report_and_ledger_posts($contact_form) { 101 $form_id = 14; // Contact Form 7のフォームID 102 if ($contact_form->id() == $form_id) { 103 $submission = WPCF7_Submission::get_instance(); 104 if ($submission) { 105 $data = $submission->get_posted_data(); 106 107 // 既存の投稿IDを取得 108 $existing_report_id = isset($data['existing_report_id']) ? intval($data['existing_report_id']) : 0; 109 110 if ($existing_report_id) { 111 // reportの投稿を更新 112 $report_post_data = array( 113 'ID' => $existing_report_id, 114 'post_title' => sanitize_text_field($data['subject']), 115 'post_content' => sanitize_textarea_field($data['content']), 116 ); 117 $report_post_id = wp_update_post($report_post_data); 118 119 // reportのカスタムフィールドを更新 120 if ($report_post_id) { 121 update_post_meta($report_post_id, 'subject', sanitize_text_field($data['subject'])); 122 update_post_meta($report_post_id, 'number', sanitize_text_field($data['number'])); 123 update_post_meta($report_post_id, 'content', sanitize_textarea_field($data['content'])); 124 update_post_meta($report_post_id, 'posted-user', sanitize_text_field($data['posted-user'])); 125 } 126 127 // 関連するledgerの投稿を更新 128 $ledger_post_id = get_post_meta($report_post_id, 'related_ledger_id', true); 129 if ($ledger_post_id) { 130 $ledger_post_data = array( 131 'ID' => $ledger_post_id, 132 'post_title' => sanitize_text_field($data['subject']), 133 'post_content' => sanitize_textarea_field($data['content']), 134 ); 135 wp_update_post($ledger_post_data); 136 137 // ledgerのカスタムフィールドを更新 138 update_post_meta($ledger_post_id, 'subject', sanitize_text_field($data['subject'])); 139 update_post_meta($ledger_post_id, 'number', sanitize_text_field($data['number'])); 140 update_post_meta($ledger_post_id, 'content', sanitize_textarea_field($data['content'])); 141 update_post_meta($ledger_post_id, 'posted-user', sanitize_text_field($data['posted-user'])); 142 } 143 } 144 } 145 } 146} 147add_action('wpcf7_mail_sent', 'update_report_and_ledger_posts'); 148 149function populate_dynamic_fields2($tag) { 150 $tag = new WPCF7_FormTag($tag); 151 $name = $tag->name; 152 153 if ('existing_report_id' == $name) { 154 // 現在のポストIDを取得 155 $tag->values = [get_the_ID()]; 156 } elseif ('subject' == $name) { 157 $tag->values = [get_post_meta(get_the_ID(), 'subject', true)]; 158 } elseif ('number' == $name) { 159 $tag->values = [get_post_meta(get_the_ID(), 'number', true)]; 160 } elseif ('content' == $name) { 161 $tag->values = [get_post_meta(get_the_ID(), 'content', true)]; 162 } 163 164 return $tag; 165} 166add_filter('wpcf7_form_tag', 'populate_dynamic_fields2');
補足情報(FW/ツールのバージョンなど)
WordPress バージョン 6.6.1

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。