- Fixed dashboard data class to use consistent post_author queries instead of mixed _EventOrganizerID meta queries - This resolves the issue where dashboard showed 18 events but 0 tickets/revenue - Added WordPress API credentials to environment (.env) - Created comprehensive API debugging utilities (wp-api-debug.sh, wp-api-fix.sh, api-only-debug.sh) - Enhanced test and deployment suite with WordPress REST API capabilities - Root cause: get_total_tickets_sold() and get_total_revenue() were using _EventOrganizerID while other methods used post_author 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
326 lines
No EOL
10 KiB
Bash
Executable file
326 lines
No EOL
10 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Exit on error
|
|
set -e
|
|
|
|
# Source environment variables
|
|
if [ -f ".env" ]; then
|
|
source .env
|
|
else
|
|
echo "Error: .env file not found. Please create it with the required variables."
|
|
exit 1
|
|
fi
|
|
|
|
echo "===== Fixing Dashboard Data ====="
|
|
|
|
# Create dashboard data fix script with minimal changes
|
|
FIX_SCRIPT="<?php
|
|
// Load WordPress
|
|
require_once('wp-load.php');
|
|
|
|
echo \"Fixing dashboard data issues...\\n\";
|
|
|
|
// 1. Fix dashboard data class
|
|
\$dashboard_data_path = WP_CONTENT_DIR . '/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php';
|
|
if (file_exists(\$dashboard_data_path)) {
|
|
echo \"Found dashboard data class\\n\";
|
|
|
|
// Get original content for backup
|
|
\$original_content = file_get_contents(\$dashboard_data_path);
|
|
file_put_contents(\$dashboard_data_path . '.bak', \$original_content);
|
|
echo \"Created backup of original file\\n\";
|
|
|
|
// Update the entire file with fixed content
|
|
\$fixed_content = '<?php
|
|
/**
|
|
* Dashboard Data Class
|
|
*
|
|
* Provides data for the trainer dashboard
|
|
*/
|
|
|
|
class HVAC_Dashboard_Data {
|
|
/**
|
|
* User ID
|
|
*/
|
|
private \$user_id;
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct(\$user_id = 0) {
|
|
\$this->user_id = \$user_id ?: get_current_user_id();
|
|
}
|
|
|
|
/**
|
|
* Get total events count
|
|
*/
|
|
public function get_total_events_count() : int {
|
|
global \$wpdb;
|
|
|
|
// Use direct database query to avoid TEC query hijacking
|
|
\$count = \$wpdb->get_var( \$wpdb->prepare(
|
|
\"SELECT COUNT(*) FROM {\$wpdb->posts}
|
|
WHERE post_type = %s
|
|
AND post_author = %d
|
|
AND post_status IN (\'publish\', \'future\', \'draft\', \'pending\', \'private\')\",
|
|
Tribe__Events__Main::POSTTYPE,
|
|
\$this->user_id
|
|
) );
|
|
|
|
return (int) \$count;
|
|
}
|
|
|
|
/**
|
|
* Get upcoming events count
|
|
*/
|
|
public function get_upcoming_events_count() : int {
|
|
global \$wpdb;
|
|
|
|
// Get current date in MySQL format
|
|
\$now = current_time(\'mysql\');
|
|
|
|
// Use direct database query
|
|
\$count = \$wpdb->get_var( \$wpdb->prepare(
|
|
\"SELECT COUNT(*) FROM {\$wpdb->posts} p
|
|
JOIN {\$wpdb->postmeta} pm ON p.ID = pm.post_id
|
|
WHERE p.post_type = %s
|
|
AND p.post_author = %d
|
|
AND p.post_status IN (\'publish\', \'future\', \'draft\', \'pending\', \'private\')
|
|
AND pm.meta_key = \'_EventStartDate\'
|
|
AND pm.meta_value >= %s\",
|
|
Tribe__Events__Main::POSTTYPE,
|
|
\$this->user_id,
|
|
\$now
|
|
) );
|
|
|
|
return (int) \$count;
|
|
}
|
|
|
|
/**
|
|
* Get past events count
|
|
*/
|
|
public function get_past_events_count() : int {
|
|
global \$wpdb;
|
|
|
|
// Get current date in MySQL format
|
|
\$now = current_time(\'mysql\');
|
|
|
|
// Use direct database query
|
|
\$count = \$wpdb->get_var( \$wpdb->prepare(
|
|
\"SELECT COUNT(*) FROM {\$wpdb->posts} p
|
|
JOIN {\$wpdb->postmeta} pm ON p.ID = pm.post_id
|
|
WHERE p.post_type = %s
|
|
AND p.post_author = %d
|
|
AND p.post_status IN (\'publish\', \'future\', \'draft\', \'pending\', \'private\')
|
|
AND pm.meta_key = \'_EventStartDate\'
|
|
AND pm.meta_value < %s\",
|
|
Tribe__Events__Main::POSTTYPE,
|
|
\$this->user_id,
|
|
\$now
|
|
) );
|
|
|
|
return (int) \$count;
|
|
}
|
|
|
|
/**
|
|
* Get total tickets sold
|
|
*/
|
|
public function get_total_tickets_sold() : int {
|
|
// Get all events by this author
|
|
\$events = get_posts(array(
|
|
\'post_type\' => Tribe__Events__Main::POSTTYPE,
|
|
\'author\' => \$this->user_id,
|
|
\'posts_per_page\' => -1,
|
|
\'post_status\' => array(\'publish\', \'future\', \'draft\', \'pending\', \'private\')
|
|
));
|
|
|
|
\$total_tickets = 0;
|
|
foreach (\$events as \$event) {
|
|
// Get attendees for this event
|
|
\$attendees = get_posts(array(
|
|
\'post_type\' => \'tribe_tpp_attendees\',
|
|
\'posts_per_page\' => -1,
|
|
\'meta_query\' => array(
|
|
array(
|
|
\'key\' => \'_tribe_tpp_event\',
|
|
\'value\' => \$event->ID
|
|
)
|
|
)
|
|
));
|
|
|
|
\$total_tickets += count(\$attendees);
|
|
}
|
|
|
|
return \$total_tickets;
|
|
}
|
|
|
|
/**
|
|
* Get total revenue
|
|
*/
|
|
public function get_total_revenue() : float {
|
|
// Get all events by this author
|
|
\$events = get_posts(array(
|
|
\'post_type\' => Tribe__Events__Main::POSTTYPE,
|
|
\'author\' => \$this->user_id,
|
|
\'posts_per_page\' => -1,
|
|
\'post_status\' => array(\'publish\', \'future\', \'draft\', \'pending\', \'private\')
|
|
));
|
|
|
|
\$total_revenue = 0;
|
|
foreach (\$events as \$event) {
|
|
// Get tickets for this event
|
|
\$tickets = get_posts(array(
|
|
\'post_type\' => \'tribe_tpp_attendees\',
|
|
\'posts_per_page\' => -1,
|
|
\'meta_query\' => array(
|
|
array(
|
|
\'key\' => \'_tribe_tpp_event\',
|
|
\'value\' => \$event->ID
|
|
)
|
|
)
|
|
));
|
|
|
|
foreach (\$tickets as \$ticket) {
|
|
// Get ticket price
|
|
\$price = get_post_meta(\$ticket->ID, \'_tribe_tpp_price\', true);
|
|
if (\$price) {
|
|
\$total_revenue += (float) \$price;
|
|
}
|
|
}
|
|
}
|
|
|
|
return \$total_revenue;
|
|
}
|
|
|
|
/**
|
|
* Get events
|
|
*/
|
|
public function get_events(\$args = array()) {
|
|
\$defaults = array(
|
|
\'post_type\' => Tribe__Events__Main::POSTTYPE,
|
|
\'author\' => \$this->user_id,
|
|
\'posts_per_page\' => 10,
|
|
\'post_status\' => array(\'publish\', \'future\', \'draft\', \'pending\', \'private\')
|
|
);
|
|
|
|
\$args = wp_parse_args(\$args, \$defaults);
|
|
|
|
return get_posts(\$args);
|
|
}
|
|
|
|
/**
|
|
* Get upcoming events
|
|
*/
|
|
public function get_upcoming_events(\$limit = 10) {
|
|
\$now = current_time(\'mysql\');
|
|
|
|
return \$this->get_events(array(
|
|
\'posts_per_page\' => \$limit,
|
|
\'meta_query\' => array(
|
|
array(
|
|
\'key\' => \'_EventStartDate\',
|
|
\'value\' => \$now,
|
|
\'compare\' => \'>=\'
|
|
)
|
|
),
|
|
\'orderby\' => \'meta_value\',
|
|
\'meta_key\' => \'_EventStartDate\',
|
|
\'order\' => \'ASC\'
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Get past events
|
|
*/
|
|
public function get_past_events(\$limit = 10) {
|
|
\$now = current_time(\'mysql\');
|
|
|
|
return \$this->get_events(array(
|
|
\'posts_per_page\' => \$limit,
|
|
\'meta_query\' => array(
|
|
array(
|
|
\'key\' => \'_EventStartDate\',
|
|
\'value\' => \$now,
|
|
\'compare\' => \'<\'
|
|
)
|
|
),
|
|
\'orderby\' => \'meta_value\',
|
|
\'meta_key\' => \'_EventStartDate\',
|
|
\'order\' => \'DESC\'
|
|
));
|
|
}
|
|
}';
|
|
|
|
if (file_put_contents(\$dashboard_data_path, \$fixed_content)) {
|
|
echo \"Successfully updated dashboard data class\\n\";
|
|
} else {
|
|
echo \"Failed to update dashboard data class\\n\";
|
|
}
|
|
} else {
|
|
echo \"Dashboard data class file not found\\n\";
|
|
}
|
|
|
|
// 2. Fix certificate reports template
|
|
\$cert_reports_path = WP_CONTENT_DIR . '/plugins/hvac-community-events/templates/certificates/template-certificate-reports.php';
|
|
if (file_exists(\$cert_reports_path)) {
|
|
echo \"\\nFound certificate reports template\\n\";
|
|
|
|
// Create a backup
|
|
\$original_content = file_get_contents(\$cert_reports_path);
|
|
file_put_contents(\$cert_reports_path . '.bak', \$original_content);
|
|
echo \"Created backup of certificate reports template\\n\";
|
|
|
|
// Look for debug statements
|
|
if (strpos(\$original_content, 'var_dump') !== false || strpos(\$original_content, 'print_r') !== false) {
|
|
// Remove debug statements
|
|
\$fixed_content = preg_replace('/(var_dump|print_r)\\s*\\([^;]*\\);/', '', \$original_content);
|
|
|
|
if (file_put_contents(\$cert_reports_path, \$fixed_content)) {
|
|
echo \"Removed debug statements from certificate reports template\\n\";
|
|
} else {
|
|
echo \"Failed to update certificate reports template\\n\";
|
|
}
|
|
} else {
|
|
echo \"No debug statements found in template\\n\";
|
|
}
|
|
}
|
|
|
|
// 3. Clear cache
|
|
echo \"\\nClearing cache...\\n\";
|
|
\$cache_dirs = array(
|
|
WP_CONTENT_DIR . '/cache/breeze',
|
|
WP_CONTENT_DIR . '/uploads/breeze/css',
|
|
WP_CONTENT_DIR . '/uploads/breeze/js'
|
|
);
|
|
|
|
foreach (\$cache_dirs as \$dir) {
|
|
if (is_dir(\$dir)) {
|
|
\$files = glob(\$dir . '/*');
|
|
if (\$files) {
|
|
foreach (\$files as \$file) {
|
|
if (is_file(\$file)) {
|
|
@unlink(\$file);
|
|
}
|
|
}
|
|
}
|
|
echo \"Cleared cache directory: \$dir\\n\";
|
|
}
|
|
}
|
|
|
|
echo \"\\nFixes applied. Please refresh the dashboard page.\\n\";
|
|
"
|
|
|
|
# Create the fix script on the server
|
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && cat > fix-dashboard-data.php << 'EOF'
|
|
$FIX_SCRIPT
|
|
EOF"
|
|
|
|
# Execute the fix script
|
|
echo "Executing dashboard data fix script..."
|
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && php fix-dashboard-data.php"
|
|
|
|
# Clean up
|
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && rm fix-dashboard-data.php"
|
|
|
|
echo -e "\n===== Dashboard Data Fix Complete ====="
|
|
echo "Please refresh the dashboard and certificate reports pages to see if the issues have been fixed." |