//★Contact Form 7で自動挿入されるPタグ、brタグを削除 add_filter('wpcf7_autop_or_not', 'wpcf7_autop_return_false'); function wpcf7_autop_return_false() { return false; } //★Contact Form 7 満足度アンケート合計点をPHP側で自動計算 add_filter('wpcf7_posted_data', 'my_cf7_add_total_score'); function my_cf7_add_total_score($posted_data) { $score_map = array( '大変満足' => 5, '満足' => 4, '普通' => 3, 'やや不満' => 2, '不満' => 1, ); $fields = array( 'service', 'atmosphere', 'price', 'explanation', 'overall', ); $total = 0; foreach ($fields as $field) { if (!empty($posted_data[$field])) { $value = $posted_data[$field]; if (is_array($value)) { $value = reset($value); } if (isset($score_map[$value])) { $total += $score_map[$value]; } } } $posted_data['total_score'] = $total; return $posted_data; } //★Contact Form 7 満足度アンケートのGoogle口コミクリックデータを保存 //★Contact Form 7 Database Addon - CFDB7の満足度アンケートの専用管理ページ作成 // ===================================== // Contact Form 7 満足度アンケート // Google口コミクリック専用テーブル作成 // ===================================== add_action('admin_init', 'my_create_survey_review_clicks_table'); function my_create_survey_review_clicks_table() { global $wpdb; $table_name = $wpdb->prefix . 'survey_review_clicks'; $charset_collate = $wpdb->get_charset_collate(); $installed = get_option('my_survey_review_clicks_table_installed'); if ($installed === '1') { return; } $sql = "CREATE TABLE {$table_name} ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, survey_token VARCHAR(191) NOT NULL, clicked_at DATETIME NOT NULL, ip_address VARCHAR(45) DEFAULT '', user_agent TEXT, PRIMARY KEY (id), UNIQUE KEY survey_token (survey_token), KEY clicked_at (clicked_at) ) {$charset_collate};"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta($sql); update_option( 'my_survey_review_clicks_table_installed', '1', false ); } // ===================================== // Contact Form 7 満足度アンケート // Google口コミクリックを専用テーブルに保存 // ===================================== add_action('wp_ajax_save_google_review_click', 'my_save_google_review_click'); add_action('wp_ajax_nopriv_save_google_review_click', 'my_save_google_review_click'); function my_save_google_review_click() { global $wpdb; // ログイン中のスタッフクリックは除外 if (is_user_logged_in()) { wp_die(); } if (empty($_POST['survey_token'])) { wp_die(); } $survey_token = sanitize_text_field($_POST['survey_token']); $table_name = $wpdb->prefix . 'survey_review_clicks'; $ip_address = isset($_SERVER['REMOTE_ADDR']) ? sanitize_text_field($_SERVER['REMOTE_ADDR']) : ''; $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? sanitize_textarea_field($_SERVER['HTTP_USER_AGENT']) : ''; // 同じsurvey_tokenのクリックは1回だけ保存 $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO {$table_name} (survey_token, clicked_at, ip_address, user_agent) VALUES (%s, %s, %s, %s)", $survey_token, current_time('mysql'), $ip_address, $user_agent ) ); wp_die(); } // ===================================== // Contact Form 7 Database Addon - CFDB7 // 満足度アンケート結果の管理ページを追加 // ===================================== add_action('admin_menu', 'my_survey_results_admin_menu'); function my_survey_results_admin_menu() { add_menu_page( '満足度アンケート', '満足度アンケート', 'manage_options', 'my-survey-results', 'my_display_survey_results_page', 'dashicons-chart-bar', 26 ); } // ===================================== // 配列・文字列どちらでも安全に表示する関数 // ===================================== function my_survey_get_value($data, $keys) { foreach ($keys as $key) { if (!isset($data[$key])) { continue; } $value = $data[$key]; if (is_array($value)) { return implode( '、', array_map('sanitize_text_field', $value) ); } return sanitize_text_field($value); } return ''; } // ===================================== // Google口コミクリック済み確認 // ===================================== function my_survey_is_review_clicked($survey_token) { global $wpdb; if (empty($survey_token)) { return false; } $table_name = $wpdb->prefix . 'survey_review_clicks'; $clicked = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$table_name} WHERE survey_token = %s LIMIT 1", $survey_token ) ); return !empty($clicked); } // ===================================== // 満足度アンケート結果 管理画面 // ===================================== function my_display_survey_results_page() { global $wpdb; // ★CF7フォームの数値ID $form_id = 1002; $cfdb7_table = $wpdb->prefix . 'db7_forms'; $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$cfdb7_table} WHERE form_post_id = %d ORDER BY form_date DESC LIMIT 200", $form_id ) ); echo '
表示件数:' . esc_html(count($results)) . '件
'; // ============================== // 満足度平均・口コミ依頼率・クリック率を計算 // ============================== $total_score_sum = 0; $total_score_count = 0; $review_count = 0; $normal_count = 0; $review_target_count = 0; $review_clicked_count = 0; if (!empty($results)) { foreach ($results as $row) { $data = maybe_unserialize($row->form_value); $score = my_survey_get_value( $data, array('total_score') ); $survey_token = my_survey_get_value( $data, array('survey_token') ); if ($score === '' || !is_numeric($score)) { continue; } $score = (int) $score; $total_score_sum += $score; $total_score_count++; if ($score >= 22) { $review_count++; $review_target_count++; if (my_survey_is_review_clicked($survey_token)) { $review_clicked_count++; } } else { $normal_count++; } } } $average_score = 0; if ($total_score_count > 0) { $average_score = round( $total_score_sum / $total_score_count, 1 ); } $total_valid_count = $review_count + $normal_count; $review_rate = 0; if ($total_valid_count > 0) { $review_rate = round( ($review_count / $total_valid_count) * 100, 1 ); } $review_click_rate = 0; if ($review_target_count > 0) { $review_click_rate = round( ($review_clicked_count / $review_target_count) * 100, 1 ); } // ============================== // 集計表示 // ============================== echo '総回答数:' . esc_html($total_score_count) . '件
'; echo '満足度平均:' . esc_html($average_score) . '点 / 25点
'; echo '口コミ依頼対象:' . esc_html($review_count) . '件
'; echo '通常サンクス:' . esc_html($normal_count) . '件
'; echo 'Google口コミ依頼率:' . esc_html($review_rate) . '%
'; echo '口コミ依頼対象:' . esc_html($review_target_count) . '件
'; echo 'Google口コミクリック:' . esc_html($review_clicked_count) . '件
'; echo 'Google口コミ遷移率:' . esc_html($review_click_rate) . '%
'; echo '| 送信日時 | '; echo '接客対応 | '; echo '店舗の雰囲気 | '; echo '査定金額 | '; echo '説明 | '; echo '総合満足度 | '; echo '合計点 | '; echo '回答ID | '; echo '口コミボタン | '; echo 'ご意見 | '; echo '
|---|---|---|---|---|---|---|---|---|---|
| ' . esc_html($row->form_date) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('service', 'radio-587') ) ) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('atmosphere', 'radio-782') ) ) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('price', 'radio-303') ) ) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('explanation', 'radio-977') ) ) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('overall', 'radio-945') ) ) . ' | '; echo '' . esc_html( my_survey_get_value( $data, array('total_score') ) ) . ' | '; echo '' . esc_html($survey_token) . ' | '; echo '' . esc_html($review_clicked) . ' | '; echo '' . nl2br( esc_html( my_survey_get_value( $data, array('your-message') ) ) ) . ' | '; echo '
| データがありません。 | '; echo '|||||||||