51 lines
2.5 KiB
PHP
51 lines
2.5 KiB
PHP
<?php
|
|
/**
|
|
* Pages d'erreur WordPress au style du portfolio.
|
|
* - wp_die() côté site public (l'admin, la page de connexion, AJAX/REST gardent l'affichage natif)
|
|
* - wp-content/php-error.php (erreur fatale PHP) utilise le même modèle : inc/error-template.php
|
|
* Le modèle est généré par ~/yb-erreurs/build.py (pages Apache et NPM identiques).
|
|
*/
|
|
|
|
function yb2026_error_titles()
|
|
{
|
|
return array(400 => 'Requête invalide', 401 => 'Authentification requise', 403 => 'Accès interdit', 404 => 'Page introuvable',
|
|
405 => 'Méthode non autorisée', 410 => 'Page supprimée', 429 => 'Trop de requêtes', 500 => 'Erreur interne', 503 => 'Maintenance en cours');
|
|
}
|
|
|
|
/* Affiche la page d'erreur (code HTTP, titre, message HTML déjà sûr) puis s'arrête */
|
|
function yb2026_render_error($code, $title, $msg_html)
|
|
{
|
|
$yb_code = (int) $code ?: 500;
|
|
$yb_title = $title !== '' ? $title : (yb2026_error_titles()[$yb_code] ?? 'Erreur');
|
|
$yb_msg = $msg_html;
|
|
if (!headers_sent()) {
|
|
status_header($yb_code);
|
|
nocache_headers();
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
header('X-Robots-Tag: noindex, nofollow');
|
|
}
|
|
// on vide les tampons de sortie (dont celui d'Autoptimize) : la page sort à l'identique des pages Apache / NPM
|
|
while (ob_get_level() > 0) ob_end_clean();
|
|
include __DIR__ . '/error-template.php';
|
|
exit;
|
|
}
|
|
|
|
add_filter('wp_die_handler', function ($handler) {
|
|
if (is_admin() || wp_doing_ajax() || (defined('REST_REQUEST') && REST_REQUEST) || (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST)
|
|
|| (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php')) {
|
|
return $handler;
|
|
}
|
|
return function ($message, $title = '', $args = array()) {
|
|
$args = wp_parse_args($args, array('response' => 500));
|
|
if (is_wp_error($message)) {
|
|
$data = $message->get_error_data();
|
|
if (is_array($data) && !empty($data['status'])) $args['response'] = $data['status'];
|
|
$message = implode('<br>', array_map('esc_html', $message->get_error_messages()));
|
|
}
|
|
$code = (int) $args['response'];
|
|
// le titre WordPress par défaut (« Erreur WordPress ») n'apporte rien : on garde un titre lisible
|
|
$t = is_string($title) && $title !== '' && stripos($title, 'WordPress') === false ? wp_strip_all_tags($title) : '';
|
|
$message = trim(preg_replace('#</?p[^>]*>#i', ' ', (string) $message)); // le modèle fournit déjà le paragraphe
|
|
yb2026_render_error($code, $t, wp_kses_post($message));
|
|
};
|
|
});
|