get_charset_collate(); $suggestions_table = $wpdb->prefix . 'pc_community_suggestions'; $votes_table = $wpdb->prefix . 'pc_community_votes'; $comments_table = $wpdb->prefix . 'pc_community_comments'; error_log('PC Community Suggestions: Creating tables - ' . $suggestions_table . ', ' . $votes_table . ', ' . $comments_table); // Suggestions table $sql_suggestions = "CREATE TABLE IF NOT EXISTS $suggestions_table ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, upvotes INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY user_id (user_id), KEY created_at (created_at), KEY upvotes (upvotes) ) $charset_collate;"; // Votes table $sql_votes = "CREATE TABLE IF NOT EXISTS $votes_table ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, suggestion_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY user_suggestion (user_id, suggestion_id), KEY suggestion_id (suggestion_id) ) $charset_collate;"; // Comments table $sql_comments = "CREATE TABLE IF NOT EXISTS $comments_table ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, suggestion_id BIGINT UNSIGNED NOT NULL, admin_id BIGINT UNSIGNED NOT NULL, comment TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY suggestion_id (suggestion_id), KEY admin_id (admin_id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // Clear any previous errors $wpdb->last_error = ''; // Create tables directly using dbDelta dbDelta($sql_suggestions); dbDelta($sql_votes); dbDelta($sql_comments); // Log any errors for debugging if (!empty($wpdb->last_error)) { error_log('PC Community Suggestions Table Creation Error: ' . $wpdb->last_error); } else { error_log('PC Community Suggestions: Tables created without database errors'); } // Verify tables were created $tables_created = true; $tables_to_check = array($suggestions_table, $votes_table, $comments_table); foreach ($tables_to_check as $table) { $exists = $wpdb->get_var("SHOW TABLES LIKE '$table'"); if (!$exists) { error_log('PC Community Suggestions: Failed to create table ' . $table); $tables_created = false; } else { error_log('PC Community Suggestions: Table exists - ' . $table); } } return $tables_created; } public static function add_suggestion($user_id, $title, $content) { global $wpdb; $table_name = $wpdb->prefix . 'pc_community_suggestions'; error_log('PC Community Suggestions: add_suggestion called, table: ' . $table_name); error_log('PC Community Suggestions: user_id=' . $user_id . ', title=' . substr($title, 0, 50)); // Check if table exists $table_exists = $wpdb->get_var("SHOW TABLES LIKE '$table_name'"); if (!$table_exists) { error_log('PC Community Suggestions: Table does not exist - ' . $table_name); error_log('PC Community Suggestions: Creating tables now...'); self::create_tables(); // Check again $table_exists = $wpdb->get_var("SHOW TABLES LIKE '$table_name'"); if (!$table_exists) { error_log('PC Community Suggestions: Still cannot find table after creation attempt'); return false; } } $result = $wpdb->insert( $table_name, array( 'user_id' => $user_id, 'title' => sanitize_text_field($title), 'content' => wp_kses_post($content) ), array('%d', '%s', '%s') ); if ($result === false) { error_log('PC Community Suggestions: Failed to insert suggestion - ' . $wpdb->last_error); return false; } $insert_id = $wpdb->insert_id; error_log('PC Community Suggestions: Suggestion inserted with ID: ' . $insert_id); return $insert_id; } public static function get_suggestions($page = 1, $per_page = 10, $sort = 'popular') { global $wpdb; $table_name = $wpdb->prefix . 'pc_community_suggestions'; $offset = ($page - 1) * $per_page; $order_by = $sort === 'newest' ? 'created_at DESC' : 'upvotes DESC, created_at DESC'; $query = $wpdb->prepare( "SELECT s.*, u.user_login, u.display_name FROM $table_name s LEFT JOIN {$wpdb->users} u ON s.user_id = u.ID ORDER BY $order_by LIMIT %d OFFSET %d", $per_page, $offset ); return $wpdb->get_results($query); } public static function get_suggestion_count() { global $wpdb; $table_name = $wpdb->prefix . 'pc_community_suggestions'; return $wpdb->get_var("SELECT COUNT(*) FROM $table_name"); } public static function get_suggestion_by_id($suggestion_id) { global $wpdb; $table_name = $wpdb->prefix . 'pc_community_suggestions'; return $wpdb->get_row($wpdb->prepare( "SELECT s.*, u.user_login, u.display_name FROM $table_name s LEFT JOIN {$wpdb->users} u ON s.user_id = u.ID WHERE s.id = %d", $suggestion_id )); } public static function add_vote($suggestion_id, $user_id) { global $wpdb; $votes_table = $wpdb->prefix . 'pc_community_votes'; $suggestions_table = $wpdb->prefix . 'pc_community_suggestions'; // Check if user already voted $existing_vote = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $votes_table WHERE suggestion_id = %d AND user_id = %d", $suggestion_id, $user_id ) ); if ($existing_vote > 0) { return false; } $wpdb->query('START TRANSACTION'); // Add vote $vote_result = $wpdb->insert( $votes_table, array( 'suggestion_id' => $suggestion_id, 'user_id' => $user_id ), array('%d', '%d') ); if (!$vote_result) { $wpdb->query('ROLLBACK'); return false; } // Update suggestion upvote count $update_result = $wpdb->query( $wpdb->prepare( "UPDATE $suggestions_table SET upvotes = upvotes + 1 WHERE id = %d", $suggestion_id ) ); if (!$update_result) { $wpdb->query('ROLLBACK'); return false; } $wpdb->query('COMMIT'); return true; } public static function get_user_vote_count($user_id) { global $wpdb; $votes_table = $wpdb->prefix . 'pc_community_votes'; return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $votes_table WHERE user_id = %d", $user_id) ); } public static function has_user_voted($suggestion_id, $user_id) { global $wpdb; $votes_table = $wpdb->prefix . 'pc_community_votes'; return (bool) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $votes_table WHERE suggestion_id = %d AND user_id = %d", $suggestion_id, $user_id ) ); } public static function add_comment($suggestion_id, $admin_id, $comment) { global $wpdb; $comments_table = $wpdb->prefix . 'pc_community_comments'; return $wpdb->insert( $comments_table, array( 'suggestion_id' => $suggestion_id, 'admin_id' => $admin_id, 'comment' => wp_kses_post($comment) ), array('%d', '%d', '%s') ); } public static function get_comments($suggestion_id) { global $wpdb; $comments_table = $wpdb->prefix . 'pc_community_comments'; return $wpdb->get_results($wpdb->prepare( "SELECT c.*, u.user_login, u.display_name FROM $comments_table c LEFT JOIN {$wpdb->users} u ON c.admin_id = u.ID WHERE c.suggestion_id = %d ORDER BY c.created_at ASC", $suggestion_id )); } public static function delete_comment($comment_id) { global $wpdb; $comments_table = $wpdb->prefix . 'pc_community_comments'; return $wpdb->delete( $comments_table, array('id' => $comment_id), array('%d') ); } public static function delete_suggestion($suggestion_id) { global $wpdb; $suggestions_table = $wpdb->prefix . 'pc_community_suggestions'; $votes_table = $wpdb->prefix . 'pc_community_votes'; $comments_table = $wpdb->prefix . 'pc_community_comments'; $wpdb->query('START TRANSACTION'); // Delete votes first $wpdb->delete($votes_table, array('suggestion_id' => $suggestion_id), array('%d')); // Delete comments $wpdb->delete($comments_table, array('suggestion_id' => $suggestion_id), array('%d')); // Delete suggestion $result = $wpdb->delete($suggestions_table, array('id' => $suggestion_id), array('%d')); if ($result === false) { $wpdb->query('ROLLBACK'); return false; } $wpdb->query('COMMIT'); return true; } public static function verify_tables() { global $wpdb; $suggestions_table = $wpdb->prefix . 'pc_community_suggestions'; $votes_table = $wpdb->prefix . 'pc_community_votes'; $comments_table = $wpdb->prefix . 'pc_community_comments'; $tables_to_check = array($suggestions_table, $votes_table, $comments_table); $all_exist = true; foreach ($tables_to_check as $table) { $exists = $wpdb->get_var("SHOW TABLES LIKE '$table'"); if (!$exists) { error_log('PC Community Suggestions: Missing table ' . $table); $all_exist = false; } } return $all_exist; } }