Files
wp-cycling-stats/includes/core/crud-activity.php
T
2026-02-12 22:34:54 +01:00

95 lines
4.2 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;
}