private function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// Check if we need to upgrade
$installed_version = get_option( 'sp_db_version', '0' );
if ( version_compare( $installed_version, $this->db_version, '<' ) ) {
$this->upgrade_database( $installed_version );
}
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
// Services table
$table_name = $wpdb->prefix . 'sp_services';
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
description text,
duration int(11) NOT NULL DEFAULT 60,
price decimal(10,2) NOT NULL DEFAULT 0.00,
category varchar(100),
is_active tinyint(1) NOT NULL DEFAULT 1,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY category (category),
KEY is_active (is_active)
) $charset_collate;";
dbDelta( $sql );
// Staff table
$table_name = $wpdb->prefix . 'sp_staff';
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
email varchar(255),
phone varchar(20),
specialties text,
schedule text,
is_active tinyint(1) NOT NULL DEFAULT 1,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY email (email),
KEY is_active (is_active)
) $charset_collate;";
dbDelta( $sql );
// Customers table
$table_name = $wpdb->prefix . 'sp_customers';
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
email varchar(255),
phone varchar(20),
address text,
notes text,
last_visit date,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY email (email),
KEY phone (phone),
KEY last_visit (last_visit)
) $charset_collate;";
dbDelta( $sql );
// Appointments table
$table_name = $wpdb->prefix . 'sp_appointments';
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
customer_id mediumint(9) NOT NULL,
staff_id mediumint(9) NOT NULL,
service_id mediumint(9) NOT NULL,
appointment_date date NOT NULL,
appointment_time time NOT NULL,
status varchar(20) NOT NULL DEFAULT 'confirmed',
notes text,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY customer_id (customer_id),
KEY staff_id (staff_id),
KEY service_id (service_id),
KEY appointment_date (appointment_date),
KEY status (status),
KEY appointment_datetime (appointment_date, appointment_time),
CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES {$wpdb->prefix}sp_customers(id) ON DELETE CASCADE,
CONSTRAINT fk_staff FOREIGN KEY (staff_id) REFERENCES {$wpdb->prefix}sp_staff(id) ON DELETE CASCADE,
CONSTRAINT fk_service FOREIGN KEY (service_id) REFERENCES {$wpdb->prefix}sp_services(id) ON DELETE CASCADE
) $charset_collate;";
dbDelta( $sql );
update_option( 'sp_db_version', $this->db_version );
}
private function upgrade_database( $installed_version ) {
global $wpdb;
// Database upgrade routines for future versions
// Version 1.1 upgrades (example for future use)
if ( version_compare( $installed_version, '1.1', '<' ) ) {
// Example: Add payment status column
// $wpdb->query( "ALTER TABLE {$wpdb->prefix}sp_appointments ADD COLUMN payment_status varchar(20) DEFAULT 'pending'" );
}
// Version 1.2 upgrades (example for future use)
if ( version_compare( $installed_version, '1.2', '<' ) ) {
// Example: Add reminder_sent column
// $wpdb->query( "ALTER TABLE {$wpdb->prefix}sp_appointments ADD COLUMN reminder_sent tinyint(1) DEFAULT 0" );
}
// Version 2.0 upgrades - major version changes
if ( version_compare( $installed_version, '2.0', '<' ) ) {
// Convert boolean fields to tinyint for better MySQL compatibility
$wpdb->query( "ALTER TABLE {$wpdb->prefix}sp_services MODIFY COLUMN is_active tinyint(1) NOT NULL DEFAULT 1" );
$wpdb->query( "ALTER TABLE {$wpdb->prefix}sp_staff MODIFY COLUMN is_active tinyint(1) NOT NULL DEFAULT 1" );
// Add composite index for appointment datetime (MySQL compatible syntax)
$wpdb->query( "ALTER TABLE {$wpdb->prefix}sp_appointments ADD KEY idx_appointment_datetime (appointment_date, appointment_time)" );
}
// Always run this for any version upgrade
$this->ensure_table_integrity();
}
private function ensure_table_integrity() {
global $wpdb;
// Prevent infinite loops
static $integrity_checked = false;
if ( $integrity_checked ) {
return;
}
$integrity_checked = true;
// Check if all required tables exist and have correct structure
$required_tables = array(
$wpdb->prefix . 'sp_services',
$wpdb->prefix . 'sp_staff',
$wpdb->prefix . 'sp_customers',
$wpdb->prefix . 'sp_appointments'
);
$missing_tables = array();
foreach ( $required_tables as $table ) {
if ( $wpdb->get_var( "SHOW TABLES LIKE '$table'" ) !== $table ) {
$missing_tables[] = $table;
}
}
if ( ! empty( $missing_tables ) ) {
// Tables missing, log and recreate
error_log( "Salons Profit: Missing tables: " . implode( ', ', $missing_tables ) );
// Reset version to force recreation
delete_option( 'sp_db_version' );
// Don't call create_tables() again to avoid infinite loop
// Instead, let the next page load handle it
}
}
Church Singles Dating
https://validator.w3.org/feed/docs/rss2.html
-
God’s Design for Relationships: A Biblical Perspective
-
Unlock Love: Life-Changing Christian Dating Tips for Ladies!
-
Unlock Love’s Secrets: Dating Advice Reddit
-
Christian Dating Advice
-
Christ Centered Relationships
-
Timeless Christian Dating Principles for Modern Dating
-
Unveiling the Best Christian Dating Sites To Find Faith in Love
-
home
-
About
-
Contact
-
Privacy Policy
-
Blog