Files
shuffle_and_skirmish_website/wp-content/plugins/woocommerce-services/classes/class-wc-connect-migration-survey.php
2025-11-24 21:33:55 +00:00

190 lines
5.5 KiB
PHP

<?php
/**
* Migration Survey Class
*
* Handles the display and submission of migration survey for users
* who haven't migrated from WCS&T to WooCommerce Shipping
*/
use Automattic\WCServices\Utils;
if ( ! class_exists( 'WC_Connect_Migration_Survey' ) ) {
class WC_Connect_Migration_Survey {
/**
* Maximum number of times to show the survey
*/
const MAX_DISPLAY_COUNT = 2;
/**
* Cooldown period between survey displays (in seconds)
*/
const COOLDOWN_PERIOD = 259200; // 3 days
/**
* Initialize the migration survey
*/
public function __construct() {
// Hook into script enqueue action
add_action( 'enqueue_wc_connect_script', array( $this, 'add_survey_data_to_script' ), 10, 2 );
// AJAX handlers
add_action( 'wp_ajax_wcs_migration_survey_submit', array( $this, 'handle_survey_submission' ) );
add_action( 'wp_ajax_wcs_migration_survey_dismiss', array( $this, 'handle_survey_dismissal' ) );
add_action( 'wp_ajax_wcs_migration_survey_track_display', array( $this, 'handle_survey_display_tracking' ) );
}
/**
* Check if survey should be shown to current user
*/
public function should_show_survey() {
// Force survey to show for testing/debugging
if ( isset( $_GET['force_survey'] ) ) {
return true;
}
// Don't show if WooCommerce Shipping is already active
if ( WC_Connect_Loader::is_wc_shipping_activated() ) {
return false;
}
// Check if user has already been shown the survey max times
$user_id = get_current_user_id();
$display_count = get_user_meta( $user_id, 'wcs_migration_survey_count', true );
if ( $display_count >= self::MAX_DISPLAY_COUNT ) {
return false;
}
// Check cooldown period
$last_shown = get_user_meta( $user_id, 'wcs_migration_survey_last_shown', true );
if ( $last_shown && ( time() - $last_shown ) < self::COOLDOWN_PERIOD ) {
return false;
}
// Check if user has already completed the survey
if ( get_user_meta( $user_id, 'wcs_migration_survey_completed', true ) ) {
return false;
}
return true;
}
/**
* Add survey data to shipping label script localization
*/
public function add_survey_data_to_script( $root_view, $payload ) {
// Only add survey data to shipping label context
if ( 'wc-connect-create-shipping-label' !== $root_view ) {
return;
}
$should_show = $this->should_show_survey();
if ( ! $should_show ) {
return;
}
// Add survey data via separate localize_script call
// NOTE: We don't update user meta here - only when survey is actually displayed in frontend
$survey_data = array(
'shouldShow' => true,
'nonce' => wp_create_nonce( 'wcs_migration_survey' ),
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
);
wp_localize_script( 'wc_connect_admin', 'wcsMigrationSurvey', $survey_data );
}
/**
* Handle survey submission via AJAX
*/
public function handle_survey_submission() {
// Verify nonce
if ( ! wp_verify_nonce( Utils::get_sanitized_request_data( 'nonce' ), 'wcs_migration_survey' ) ) {
wp_die( 'Security check failed' );
}
// Get survey data
$survey_data = json_decode( stripslashes( $_POST['survey_data'] ), true );
if ( ! $survey_data ) {
wp_send_json_error( 'Invalid survey data' );
}
// Mark survey as completed for this user
$user_id = get_current_user_id();
update_user_meta( $user_id, 'wcs_migration_survey_completed', true );
// Track submission event with detailed properties
$track_properties = array(
'primary_reason' => sanitize_text_field( $survey_data['primary'] ),
);
// Add followup responses to tracking (flatten the array)
if ( ! empty( $survey_data['followup'] ) ) {
foreach ( $survey_data['followup'] as $key => $value ) {
if ( is_bool( $value ) ) {
$track_properties[ 'followup_' . $key ] = $value ? 'true' : 'false';
} else {
$track_properties[ 'followup_' . $key ] = sanitize_text_field( $value );
}
}
}
$this->track_event( 'submitted', $track_properties );
wp_send_json_success();
}
/**
* Handle survey dismissal
*/
public function handle_survey_dismissal() {
// Verify nonce
if ( ! wp_verify_nonce( Utils::get_sanitized_request_data( 'nonce' ), 'wcs_migration_survey' ) ) {
wp_die( 'Security check failed' );
}
// Track dismissal event
$this->track_event( 'dismissed', array() );
wp_send_json_success();
}
/**
* Handle survey display tracking (update user meta when survey is actually shown)
*/
public function handle_survey_display_tracking() {
// Verify nonce
if ( ! wp_verify_nonce( Utils::get_sanitized_request_data( 'nonce' ), 'wcs_migration_survey' ) ) {
wp_die( 'Security check failed' );
}
// Update user meta to track that survey was displayed
$user_id = get_current_user_id();
$display_count = get_user_meta( $user_id, 'wcs_migration_survey_count', true );
update_user_meta( $user_id, 'wcs_migration_survey_count', intval( $display_count ) + 1 );
update_user_meta( $user_id, 'wcs_migration_survey_last_shown', time() );
// Track survey display event
$this->track_event( 'displayed', array() );
wp_send_json_success();
}
/**
* Track survey events
*/
private function track_event( $event_name, $properties = array() ) {
$wc_logger = wc_get_logger();
$logger = new WC_Connect_Logger( $wc_logger );
$tracks = new WC_Connect_Tracks( $logger, WCSERVICES_PLUGIN_FILE );
$tracks->record_user_event( 'migration_survey_' . $event_name, $properties );
}
}
}