Pages Compétences, Contact et Qui suis-je

This commit is contained in:
Yasser Boulayoune 2026-10-08 13:19:00 +02:00
parent e06ad42369
commit da05adede1
10 changed files with 1242 additions and 0 deletions

51
inc/errors.php Normal file
View file

@ -0,0 +1,51 @@
<?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));
};
});