prefix . 'mystat_activities'; // Helper to convert empty strings to NULL for the database. $null_if_empty = function( $value ) { // Also check for 0 as we don't want to nullify it for numeric fields. return ( '' !== $value && ! is_null( $value ) ) ? $value : null; }; // Sanitize and prepare data. $prepared_data = array( 'category_id' => isset( $data['category_id'] ) ? intval( $data['category_id'] ) : null, 'date' => isset( $data['date'] ) ? sanitize_text_field( $data['date'] ) : current_time( 'Y-m-d' ), 'title' => isset( $data['title'] ) ? sanitize_text_field( $data['title'] ) : '', 'distance' => isset( $data['distance'] ) ? floatval( str_replace( ',', '.', $data['distance'] ) ) : 0, 'duration' => isset( $data['duration'] ) ? sanitize_text_field( $data['duration'] ) : '00:00:00', 'calories' => isset( $data['calories'] ) ? intval( $data['calories'] ) : null, 'comment' => isset( $data['comment'] ) ? sanitize_textarea_field( $data['comment'] ) : null, 'strava_url' => isset( $data['strava_url'] ) ? $null_if_empty( esc_url_raw( $data['strava_url'] ) ) : null, 'avg_heart_rate' => isset( $data['avg_heart_rate'] ) ? $null_if_empty( intval( $data['avg_heart_rate'] ) ) : null, 'max_heart_rate' => isset( $data['max_heart_rate'] ) ? $null_if_empty( intval( $data['max_heart_rate'] ) ) : null, 'avg_speed' => isset( $data['avg_speed'] ) ? $null_if_empty( floatval( str_replace( ',', '.', $data['avg_speed'] ) ) ) : null, 'max_speed' => isset( $data['max_speed'] ) ? $null_if_empty( floatval( str_replace( ',', '.', $data['max_speed'] ) ) ) : null, 'avg_cadence' => isset( $data['avg_cadence'] ) ? $null_if_empty( intval( $data['avg_cadence'] ) ) : null, 'max_cadence' => isset( $data['max_cadence'] ) ? $null_if_empty( intval( $data['max_cadence'] ) ) : null, 'total_elevation_gain' => isset( $data['total_elevation_gain'] ) ? $null_if_empty( intval( $data['total_elevation_gain'] ) ) : null, 'total_elevation_loss' => isset( $data['total_elevation_loss'] ) ? $null_if_empty( intval( $data['total_elevation_loss'] ) ) : null, 'min_altitude' => isset( $data['min_altitude'] ) ? $null_if_empty( intval( $data['min_altitude'] ) ) : null, 'max_altitude' => isset( $data['max_altitude'] ) ? $null_if_empty( intval( $data['max_altitude'] ) ) : null, 'equipment_id' => isset( $data['equipment_id'] ) ? $null_if_empty( intval( $data['equipment_id'] ) ) : null, 'gpx_url' => isset( $data['gpx_url'] ) ? $null_if_empty( esc_url_raw( $data['gpx_url'] ) ) : null, 'event_type_id' => isset( $data['event_type_id'] ) ? $null_if_empty( intval( $data['event_type_id'] ) ) : null, ); // Data formats for $wpdb. $format = array( '%d', // category_id '%s', // date '%s', // title '%f', // distance '%s', // duration '%d', // calories '%s', // comment '%s', // strava_url '%d', // avg_heart_rate '%d', // max_heart_rate '%f', // avg_speed '%f', // max_speed '%d', // avg_cadence '%d', // max_cadence '%d', // total_elevation_gain '%d', // total_elevation_loss '%d', // min_altitude '%d', // max_altitude '%d', // equipment_id '%s', // gpx_url '%d', // event_type_id ); if ( $activity_id > 0 ) { // UPDATE $result = $wpdb->update( $table_activities, $prepared_data, array( 'id' => $activity_id ), $format, array( '%d' ) ); if ( false !== $result ) { return $activity_id; } } else { // INSERT $result = $wpdb->insert( $table_activities, $prepared_data, $format ); if ( $result ) { return $wpdb->insert_id; } } return false; }