質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

363閲覧

contact form7から送信した値で、ショートコードを埋め込んでいる固定ページの値が変更されてしまう

usagilove

総合スコア21

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2024/08/27 05:30

編集2024/08/27 05:43

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

よくわかりませんがget_the_ID()がいけなかったようです。これはフォーム送信時には機能しないようです。
[hidden existing_report_id default:shortcode_attr existing_report_id]はコンタクトフォーム内で必要です。とりあえずこれで個別ページの内容の上書きはなくなりました。

display_editable_report_form 関数内の変更:

functions.php

1function display_editable_report_form() { 2 $output = ''; 3 $current_user = wp_get_current_user(); 4 if (is_user_logged_in() && in_array('worker', $current_user->roles)) { 5 $args = array( 6 'post_type' => 'report', 7 'post_status' => 'publish', 8 'meta_query' => array( 9 array( 10 'key' => 'posted-user', 11 'value' => $current_user->user_login, 12 'compare' => '=' 13 ), 14 ), 15 'date_query' => array( 16 array( 17 'after' => 'first day of this month', 18 'before' => 'last day of this month', 19 'inclusive' => true, 20 ), 21 ), 22 ); 23 $reports = new WP_Query($args); 24 if ($reports->have_posts()) { 25 while ($reports->have_posts()) { 26 $reports->the_post(); 27 $report_id = get_the_ID(); 28 $subject = get_post_meta($report_id, 'subject', true); 29 $number = get_post_meta($report_id, 'number', true); 30 $content = get_post_meta($report_id, 'content', true); 31 32 $output .= '<h2>' . get_the_title() . '</h2>'; 33 $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) . '"]'); 34 } 35 } else { 36 $output .= '<p>編集可能な日報はありません。</p>'; 37 } 38 wp_reset_postdata(); 39 } else { 40 $output .= '<p>編集するにはログインしてください。</p>'; 41 } 42 return $output; 43}コード

populate_dynamic_fields2 関数の修正:

functions.php

1 2 3function populate_dynamic_fields2($tag) { 4 $tag = new WPCF7_FormTag($tag); 5 $name = $tag->name; 6 7 if ('subject' == $name || 'number' == $name || 'content' == $name) { 8 $existing_report_id = isset($_POST['existing_report_id']) ? intval($_POST['existing_report_id']) : 0; 9 if ($existing_report_id) { 10 $tag->values = [get_post_meta($existing_report_id, $name, true)]; 11 } 12 } 13 14 return $tag; 15}

投稿2024/08/27 12:18

usagilove

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問