95 lines
4.3 KiB
PHP
95 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* CRUD functions for Activities.
|
|
*
|
|
* @package WordPress Activity Stats
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
/**
|
|
* Saves or updates an activity in the database.
|
|
*
|
|
* @param array $data Associative array of data to save.
|
|
* @param int $activity_id The ID of the activity to update. 0 for new activity.
|
|
* @return int|false The ID of the saved/updated activity, or false on failure.
|
|
*/
|
|
function statpress_save_activity_data( array $data, int $activity_id = 0 ) {
|
|
global $wpdb;
|
|
|
|
$table_activities = $wpdb->prefix . 'statpress_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;
|
|
} |