upskill-event-manager/wordpress-dev/wordpress/wp-content/mu-plugins/mu-certificate-handler.php
bengizmo 669f5d5650 feat: Add MU plugins from staging server
- hvac-nocache.php: Prevents caching on HVAC pages and for logged-in users
- mu-certificate-handler.php: Handles certificate URLs at earliest stage to prevent 404 errors

These MU plugins are critical for proper functionality of dashboard, login, and certificate features.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-30 15:19:39 -06:00

75 lines
No EOL
2.5 KiB
PHP

<?php
/**
* MU Plugin: HVAC Certificate URL Handler
*
* This MUST-USE plugin handles certificate URLs at the earliest possible stage
* to prevent 404 errors.
*
* Place this file in wp-content/mu-plugins/
*/
// Only run on frontend
if (!defined('ABSPATH') || defined('WP_ADMIN')) {
return;
}
// Check for certificate URLs immediately
add_action('muplugins_loaded', function() {
$request_uri = $_SERVER['REQUEST_URI'] ?? '';
$parsed = parse_url($request_uri);
$path = rtrim($parsed['path'] ?? '', '/');
// Check if this is a certificate URL
if (preg_match('#^/hvac-certificate/([a-zA-Z0-9]{32})$#', $path, $matches)) {
$token = $matches[1];
// Load WordPress to access functions
if (!function_exists('get_transient')) {
return;
}
// Hook into the earliest possible action to handle the certificate
add_action('plugins_loaded', function() use ($token) {
// Check if token exists
$certificate_data = get_transient('hvac_certificate_token_' . $token);
if (!$certificate_data) {
// Invalid token - show 404
status_header(404);
wp_die('Certificate not found', 'Not Found', array('response' => 404));
}
// Delete token to prevent reuse
delete_transient('hvac_certificate_token_' . $token);
// Get file path
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['basedir'] . '/' . $certificate_data['file_path'];
if (!file_exists($file_path)) {
status_header(404);
wp_die('Certificate file not found', 'Not Found', array('response' => 404));
}
// Serve the file
$file_name = basename($file_path);
$file_size = filesize($file_path);
// Set headers
nocache_headers();
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="certificate.pdf"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $file_size);
// Clear any output buffers
while (ob_get_level()) {
ob_end_clean();
}
// Output file
readfile($file_path);
exit;
}, 1);
}
}, 1);