From c8af2caa29426279d7a4c71bc2084f5437f970da Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Tue, 14 Mar 2023 23:11:08 +0100
Subject: [PATCH] chore: Rector up to PHP 8.0 sur ecrire/public

---
 ecrire/public/boucles.php        |   2 +-
 ecrire/public/cacher.php         |  88 +++++-----
 ecrire/public/criteres.php       | 271 ++++++++++++++-----------------
 ecrire/public/debusquer.php      | 101 ++++++------
 ecrire/public/decompiler.php     |  30 ++--
 ecrire/public/evaluer_page.php   |  16 +-
 ecrire/public/fonctions.php      | 107 +++++-------
 ecrire/public/format_html.php    |  36 ++--
 ecrire/public/interfaces.php     |  14 +-
 ecrire/public/jointures.php      |  88 +++++-----
 ecrire/public/normaliser.php     |  37 ++---
 ecrire/public/parametrer.php     |  22 +--
 ecrire/public/phraser_html.php   |  74 ++++-----
 ecrire/public/quete.php          |  76 ++++-----
 ecrire/public/sandbox.php        |  22 +--
 ecrire/public/styliser.php       |  29 ++--
 ecrire/public/styliser_par_z.php | 107 ++++++------
 ecrire/public/tracer.php         |  24 +--
 18 files changed, 514 insertions(+), 630 deletions(-)

diff --git a/ecrire/public/boucles.php b/ecrire/public/boucles.php
index bd1666add6..2b690d05e0 100644
--- a/ecrire/public/boucles.php
+++ b/ecrire/public/boucles.php
@@ -99,7 +99,7 @@ function boucle_HIERARCHIE_dist($id_boucle, &$boucles) {
 	$boucle->where[] = ["'IN'", "'$id_table'", '"($hierarchie)"'];
 
 	$order = "FIELD($id_table, \$hierarchie)";
-	if (!isset($boucle->default_order[0]) or $boucle->default_order[0] != ' DESC') {
+	if (!isset($boucle->default_order[0]) || $boucle->default_order[0] != ' DESC') {
 		$boucle->default_order[] = "\"$order\"";
 	} else {
 		$boucle->default_order[0] = "\"$order DESC\"";
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 218dbff392..cb828b68bd 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -45,7 +45,7 @@ function cache_chemin_fichier($nom_cache, $ecrire = false) {
 	static $l1, $l2;
 	if (is_null($l1)) {
 		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
-		$l1 = intval(floor($length / 2));
+		$l1 = (int) floor($length / 2);
 		$l2 = $length - $l1;
 	}
 	$d = substr($nom_cache, 0, $l1);
@@ -85,10 +85,10 @@ function lire_cache($nom_cache) {
 	$tmp = [];
 	if (
 		file_exists($f = cache_chemin_fichier($nom_cache))
-		and lire_fichier($f, $tmp)
-		and $tmp = unserialize($tmp)
-		and $tmp['nom_cache'] == $nom_cache
-		and isset($tmp['valeur'])
+		&& lire_fichier($f, $tmp)
+		&& ($tmp = unserialize($tmp))
+		&& $tmp['nom_cache'] == $nom_cache
+		&& isset($tmp['valeur'])
 	) {
 		return $tmp['valeur'];
 	}
@@ -126,7 +126,7 @@ function cache_signature(&$page) {
  * @return array
  */
 function gzip_page($page) {
-	if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
+	if (function_exists('gzcompress') && strlen($page['texte']) > 16 * 1024) {
 		$page['gz'] = true;
 		$page['texte'] = gzcompress($page['texte']);
 	} else {
@@ -169,27 +169,27 @@ function cache_valide(&$page, $date) {
 	// Apparition d'un nouvel article post-date ?
 	if (
 		isset($GLOBALS['meta']['post_dates'])
-		and $GLOBALS['meta']['post_dates'] == 'non'
-		and isset($GLOBALS['meta']['date_prochain_postdate'])
-		and $now > $GLOBALS['meta']['date_prochain_postdate']
+		&& $GLOBALS['meta']['post_dates'] == 'non'
+		&& isset($GLOBALS['meta']['date_prochain_postdate'])
+		&& $now > $GLOBALS['meta']['date_prochain_postdate']
 	) {
 		spip_log('Un article post-date invalide le cache');
 		include_spip('inc/rubriques');
 		calculer_prochain_postdate(true);
 	}
 
-	if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
+	if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
 		return -1;
 	}
-	if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
+	if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
 		return -1;
 	}
 	if (defined('_NO_CACHE')) {
-		return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
+		return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
 	}
 
 	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
-	if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
+	if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
 		return _IS_BOT ? -1 : 1;
 	}
 
@@ -200,30 +200,30 @@ function cache_valide(&$page, $date) {
 
 	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
 	// cf. ecrire/public/balises.php, balise_CACHE_dist()
-	if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
-		// Cache invalide par la meta 'derniere_modif'
-		// sauf pour les bots, qui utilisent toujours le cache
-		if (
+	// Cache invalide par la meta 'derniere_modif'
+	// sauf pour les bots, qui utilisent toujours le cache
+	if (
+		(!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
+		&& (
 			!_IS_BOT
-			and $GLOBALS['derniere_modif_invalide']
-			and isset($GLOBALS['meta']['derniere_modif'])
-			and $date < $GLOBALS['meta']['derniere_modif']
-		) {
-			return 1;
-		}
+			&& $GLOBALS['derniere_modif_invalide']
+			&& isset($GLOBALS['meta']['derniere_modif'])
+			&& $date < $GLOBALS['meta']['derniere_modif']
+		)
+	) {
+		return 1;
 	}
 
 	// Sinon comparer l'age du fichier a sa duree de cache
-	$duree = intval($page['entetes']['X-Spip-Cache']);
+	$duree = (int) $page['entetes']['X-Spip-Cache'];
 	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
 	if ($duree == 0) {  #CACHE{0}
 	return -1;
 	} // sauf pour les bots, qui utilisent toujours le cache
 	else {
 		if (
-			(!_IS_BOT and $date + $duree < $now)
-			# le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
-			or $date < $cache_mark
+			!_IS_BOT && $date + $duree < $now
+			|| $date < $cache_mark
 		) {
 			return _IS_BOT ? -1 : 1;
 		} else {
@@ -247,8 +247,8 @@ function creer_cache(&$page, &$chemin_cache) {
 	// le cas var_nocache ne devrait jamais arriver ici (securite)
 	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
 	if (
-		(defined('_VAR_NOCACHE') and _VAR_NOCACHE)
-		or defined('spip_interdire_cache')
+		defined('_VAR_NOCACHE') && _VAR_NOCACHE
+		|| defined('spip_interdire_cache')
 	) {
 		return;
 	}
@@ -257,7 +257,7 @@ function creer_cache(&$page, &$chemin_cache) {
 	// 'tmp/cache/MD5(chemin_cache)_zz'
 	if (
 		isset($page['invalideurs'])
-		and isset($page['invalideurs']['session'])
+		&& isset($page['invalideurs']['session'])
 	) {
 		// on verifie que le contenu du chemin cache indique seulement
 		// "cache sessionne" ; sa date indique la date de validite
@@ -357,8 +357,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 
 	// Cas ignorant le cache car completement dynamique
 	if (
-		(!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
-		or _request('connect')
+		!empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
+		|| _request('connect')
 	) {
 		$use_cache = -1;
 		$lastmodified = 0;
@@ -380,15 +380,14 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 	// s'il est sessionne, charger celui correspondant a notre session
 	if (
 		isset($page['invalideurs'])
-		and isset($page['invalideurs']['session'])
+		&& isset($page['invalideurs']['session'])
 	) {
 		$chemin_cache_session = generer_nom_fichier_cache(
 			['chemin_cache' => $chemin_cache],
 			['session' => spip_session()]
 		);
 		if (
-			$page_session = lire_cache($chemin_cache_session)
-			and $page_session['lastmodified'] >= $page['lastmodified']
+			($page_session = lire_cache($chemin_cache_session)) && $page_session['lastmodified'] >= $page['lastmodified']
 		) {
 			$page = $page_session;
 		} else {
@@ -398,15 +397,14 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 
 
 	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
-	if (isset($GLOBALS['meta']['invalider'])) {
-		// ne le faire que si la base est disponible
-		if (spip_connect()) {
-			include_spip('inc/invalideur');
-			retire_caches($chemin_cache); # API invalideur inutile
-			supprimer_fichier(_DIR_CACHE . $chemin_cache);
-			if (isset($chemin_cache_session) and $chemin_cache_session) {
-				supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
-			}
+	// ne le faire que si la base est disponible
+	if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
+		include_spip('inc/invalideur');
+		retire_caches($chemin_cache);
+		# API invalideur inutile
+		supprimer_fichier(_DIR_CACHE . $chemin_cache);
+		if (isset($chemin_cache_session) && $chemin_cache_session) {
+			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
 		}
 	}
 
@@ -423,7 +421,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 		include_spip('inc/invalideur');
 		retire_caches($chemin_cache); # API invalideur inutile
 		supprimer_fichier(_DIR_CACHE . $chemin_cache);
-		if (isset($chemin_cache_session) and $chemin_cache_session) {
+		if (isset($chemin_cache_session) && $chemin_cache_session) {
 			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
 		}
 	}
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index c9680f2a08..1f047f380f 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -72,7 +72,7 @@ function critere_exclus_dist($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];
 	$id = $boucle->primary;
 
-	if ($not or !$id) {
+	if ($not || !$id) {
 		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
 	}
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
@@ -100,7 +100,7 @@ function critere_doublons_dist($idb, &$boucles, $crit) {
 	$primary = $boucle->primary;
 
 	// la table nécessite une clé primaire, non composée
-	if (!$primary or strpos($primary, ',')) {
+	if (!$primary || strpos($primary, ',')) {
 		return ['zbug_doublon_sur_table_sans_cle_primaire'];
 	}
 
@@ -127,7 +127,7 @@ function critere_doublons_dist($idb, &$boucles, $crit) {
 	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
 	// Attention : boucle->doublons désigne une variable qu'on affecte
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
+	$debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
 
 	// le debut complet du code des doublons
 	$debut_doub = $debut_in . $debut_doub;
@@ -138,7 +138,7 @@ function critere_doublons_dist($idb, &$boucles, $crit) {
 	// si on trouve un autre critère doublon,
 	// on fusionne pour avoir un seul IN, et on s'en va !
 	foreach ($boucle->where as $k => $w) {
-		if (strpos($w[0], $debut_doub) === 0) {
+		if (str_starts_with($w[0], $debut_doub)) {
 			// fusionner le sql_in (du where)
 			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
 			// fusionner l'initialisation (du hash) pour faire plus joli
@@ -183,7 +183,7 @@ function critere_doublons_dist($idb, &$boucles, $crit) {
  * @return void
  **/
 function critere_lang_select_dist($idb, &$boucles, $crit) {
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
+	if (!isset($crit->param[1][0]) || !($param = $crit->param[1][0]->texte)) {
 		$param = 'oui';
 	}
 	if ($crit->not) {
@@ -256,14 +256,15 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 
 	$boucle = &$boucles[$idb];
 	// definition de la taille de la page
-	$pas = !isset($crit->param[0][0]) ? "''"
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
+	$pas = isset($crit->param[0][0])
+		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
+		: "''";
 
 	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
 		$pas = "((\$a = intval($pas)) ? \$a : 10)";
 	} else {
-		$r = intval($r[2]);
-		$pas = strval($r ?: 10);
+		$r = (int) $r[2];
+		$pas = (string) ($r ?: 10);
 	}
 
 	// Calcul du nommage de la pagination si il existe.
@@ -301,8 +302,8 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 	$t = $boucle->id_table . '.' . $boucle->primary;
 	if (
 		$boucle->primary
-		and !preg_match('/[,\s]/', $boucle->primary)
-		and !in_array($t, $boucle->select)
+		&& !preg_match('/[,\s]/', $boucle->primary)
+		&& !in_array($t, $boucle->select)
 	) {
 		$boucle->select[] = $t;
 	}
@@ -329,7 +330,7 @@ function critere_recherche_dist($idb, &$boucles, $crit) {
 
 	$boucle = &$boucles[$idb];
 
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
+	if (!$boucle->primary || strpos($boucle->primary, ',')) {
 		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
 
 		return;
@@ -454,7 +455,7 @@ function critere_meme_parent_dist($idb, &$boucles, $crit) {
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
 	$mparent = $boucle->id_table . '.' . $id_parent;
 
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
+	if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
 		$boucle->where[] = ["'='", "'$mparent'", $arg];
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
 	else {
@@ -519,8 +520,9 @@ function critere_branche_dist($idb, &$boucles, $crit) {
 
 	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
 		. ($not ? ", 'NOT'" : '') . ')';
-	$boucle->where[] = !$crit->cond ? $c :
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
+	$boucle->where[] = $crit->cond
+		? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
+		: $c;
 }
 
 /**
@@ -652,12 +654,12 @@ function critere_collecte_dist($idb, &$boucles, $crit) {
 		$boucle = $boucles[$idb];
 		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
 		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
+		if ($n && (!str_contains($boucle->order[$n - 1], 'COLLATE'))) {
 			// l'instruction COLLATE doit être placée avant ASC ou DESC
 			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
 			if (
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
-				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
+				false !== $i = strpos($boucle->order[$n - 1], 'ASC')
+				|| false !== $i = strpos($boucle->order[$n - 1], 'DESC')
 			) {
 				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
 			} else {
@@ -673,7 +675,7 @@ function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
 	$boucle = $boucles[$idb];
 	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
 	$var = '$champs_' . $idb;
-	$desc = (strpos($boucle->in, (string) "static $var =") !== false);
+	$desc = (str_contains($boucle->in, (string) "static $var ="));
 	if (!$desc) {
 		$desc = $boucle->show['field'];
 		$desc = implode(',', array_map('_q', array_keys($desc)));
@@ -781,16 +783,16 @@ function critere_parinverse($idb, &$boucles, $crit) {
 				}
 
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
-			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
+			} elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
 				// {par FONCTION(champ)}
-				if (isset($match) and count($match) > 2) {
+				if (isset($match) && count($match) > 2) {
 					$par = substr($match[2], 1, -1);
 					$fct = $match[1];
 				}
 				// quelques cas spécifiques {par hasard}, {par date}
 				if ($par == 'hasard') {
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
+				} elseif ($par == 'date' && !empty($boucle->show['date'])) {
 					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
 				} else {
 					// cas général {par champ}, {par table.champ}, ...
@@ -811,7 +813,7 @@ function critere_parinverse($idb, &$boucles, $crit) {
 
 		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
 			$t = $m[1];
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
+			if (strpos($t, '.') && !in_array($t, $boucle->select)) {
 				$boucle->select[] = $t;
 			}
 		} else {
@@ -819,11 +821,9 @@ function critere_parinverse($idb, &$boucles, $crit) {
 		}
 
 		if ($fct) {
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
-				$order = "'$fct(" . $r[1] . ")'";
-			} else {
-				$order = "'$fct(' . $order . ')'";
-			}
+			$order = preg_match("/^\s*'(.*)'\s*$/", $order, $r)
+				? "'$fct(" . $r[1] . ")'"
+				: "'$fct(' . $order . ')'";
 		}
 		$t = $order . $collecte . $sens;
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
@@ -890,9 +890,7 @@ function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $cham
 
 	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
 	$orderassinum = trim($orderassinum, "'");
-
-	$order = "'$orderassinum, $asnum'";
-	return $order;
+	return "'$orderassinum, $asnum'";
 }
 
 /**
@@ -927,7 +925,7 @@ function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $ch
 	$as = false;
 	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
 	foreach ($boucle->select as $s) {
-		if (strpos($s, $select) === 0) {
+		if (str_starts_with($s, $select)) {
 			$as = trim(substr($s, strlen($select)));
 			if (!preg_match(',\W,', $as)) {
 				break;
@@ -940,8 +938,7 @@ function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $ch
 		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
 		$boucle->select[] = $select . $as;
 	}
-	$order = "'$as'";
-	return $order;
+	return "'$as'";
 }
 
 
@@ -967,8 +964,7 @@ function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $ch
 	}
 	$boucle = &$boucles[$idb];
 	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
-	$order = "'multi'";
-	return $order;
+	return "'multi'";
 }
 
 /**
@@ -1016,7 +1012,7 @@ function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false)
 			$par = $infos['alias'] . '.' . $champ;
 		} elseif (
 			$boucle->jointures_explicites
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
+			&& ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table))
 		) {
 			$par = $alias . '.' . $champ;
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
@@ -1024,8 +1020,8 @@ function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false)
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
 		} elseif (
 			$table_alias
-			and isset($boucle->from[$table_alias])
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
+			&& isset($boucle->from[$table_alias])
+			&& ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
 		) {
 			$par = $infos['alias'] . '.' . $champ;
 		} elseif ($table) {
@@ -1054,7 +1050,7 @@ function critere_par_joint($table, $champ, &$boucle) {
 	if (!$t) {
 		$t = trouver_jointure_champ($champ, $boucle);
 	}
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
+	return $t ? "'" . $t . '.' . $champ . "'" : '';
 }
 
 /**
@@ -1165,7 +1161,7 @@ function critere_agenda_dist($idb, &$boucles, $crit) {
 	// Si c'est un litteral unique dans le source, verifier a la compil,
 	// sinon synthetiser le test de verif pour execution ulterieure
 	// On prendra arbitrairement le premier champ si test negatif.
-	if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
+	if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
 		$date = $date[0]->texte;
 		if (!isset($fields[$date])) {
 			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
@@ -1174,7 +1170,7 @@ function critere_agenda_dist($idb, &$boucles, $crit) {
 		$a = calculer_liste($date, $idb, $boucles, $parent);
 		$noms = array_keys($fields);
 		$defaut = $noms[0];
-		$noms = join(' ', $noms);
+		$noms = implode(' ', $noms);
 		# bien laisser 2 espaces avant $nom pour que strpos<>0
 		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
@@ -1292,7 +1288,7 @@ function calculer_critere_parties($idb, &$boucles, $crit) {
 		$mode = (($op == '/') ? '/' :
 			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
+		if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
 			$boucle->limit =
 				(is_numeric($a11) ? "'$a11'" : $a11)
 				. ".','."
@@ -1339,7 +1335,7 @@ function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
 		$totpos = is_numeric($total_parties) ? ($total_parties) :
 			"($total_parties ? $total_parties : 1)";
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
+		$debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
 	} else {
 		// cas {n-1,x}
 		if ($op1 == '-') {
@@ -1404,14 +1400,14 @@ function calculer_critere_parties_aux($idb, &$boucles, $param) {
 	if ($param[0]->type != 'texte') {
 		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
 		if (isset($param[1]->texte)) {
-			preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
+			preg_match(',^\s*(-(\d+))?\s*$,', $param[1]->texte, $m);
 
-			return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
+			return ["intval($a1)", ((isset($m[2]) && $m[2]) ? $m[2] : 0)];
 		} else {
 			return ["intval($a1)", 0];
 		}
 	} else {
-		preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
+		preg_match(',^\s*((\d+)|n)\s*(-\s*(\d+)?\s*)?$,', $param[0]->texte, $m);
 		$a1 = $m[1];
 		if (empty($m[3])) {
 			return [$a1, 0];
@@ -1462,17 +1458,16 @@ function calculer_criteres($idb, &$boucles) {
 		$critere = $crit->op;
 		// critere personnalise ?
 		if (
-			(!$serveur or
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
-					and (!function_exists($f = $f . '_dist'))
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
-					and (!function_exists($f = $f . '_dist'))
-				)
+			(!$serveur ||
+				!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
+				&& !function_exists($f .= '_dist')
+				&& !function_exists($f = 'critere_' . $serveur . '_' . $critere)
+				&& !function_exists($f .= '_dist')
 			)
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
-			and (!function_exists($f = $f . '_dist'))
-			and (!function_exists($f = 'critere_' . $critere))
-			and (!function_exists($f = $f . '_dist'))
+			&& !function_exists($f = 'critere_' . $table . '_' . $critere)
+			&& !function_exists($f .= '_dist')
+			&& !function_exists($f = 'critere_' . $critere)
+			&& !function_exists($f .= '_dist')
 		) {
 			// fonction critere standard
 			$f = $defaut;
@@ -1543,7 +1538,7 @@ function critere_IN_dist($idb, &$boucles, $crit) {
 		}
 	}
 	if ($crit->exclus) {
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
+		if (!preg_match(',^L\d+[.],', $arg)) {
 			$where = ["'NOT'", $where];
 		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
 			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
@@ -1713,13 +1708,13 @@ function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
 	// Les champs id_xx de la table demandée
 	$champs = array_filter(
 		array_keys($desc['field']),
-		fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
+		fn($champ) => str_starts_with($champ, 'id_') || $champ == 'objet'
 	);
 
 	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
 	if (
 		in_array('id_rubrique', $champs)
-		and !in_array('id_secteur', $champs)
+		&& !in_array('id_secteur', $champs)
 	) {
 		$champs[] = 'id_secteur';
 	}
@@ -1737,7 +1732,7 @@ function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
 		$primary = id_table_objet($desc['type']);
 		$associable = objet_associable($desc['type']);
 	}
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
+	if (isset($desc['field']['id_objet']) && isset($desc['field']['objet'])) {
 		$associable = true;
 	}
 
@@ -1748,8 +1743,8 @@ function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
 	foreach ($tables as $_table => $_desc) {
 		if (
 			$associable
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
-			or objet_associable($_desc['type'])
+			|| $primary && array_key_exists($primary, $_desc['field'])
+			|| objet_associable($_desc['type'])
 		) {
 			$champs[] = id_table_objet($_table);
 		}
@@ -1768,9 +1763,8 @@ function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
 			'data' => [],
 		]
 	);
-	$champs = array_diff($champs, $exclusions);
 
-	return $champs;
+	return array_diff($champs, $exclusions);
 }
 
 /**
@@ -1828,12 +1822,15 @@ function critere_tri_dist($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];
 
 	// definition du champ par defaut
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
-	$_liste_sens_defaut = !isset($crit->param[1][0]) ? '1'
-		: calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
-		: calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
+	$_champ_defaut = isset($crit->param[0][0])
+		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
+		: "''";
+	$_liste_sens_defaut = isset($crit->param[1][0])
+		? calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent)
+		: '1';
+	$_variable = isset($crit->param[2][0])
+		? calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent)
+		: "'$idb'";
 
 	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
 
@@ -1873,7 +1870,7 @@ function critere_tri_dist($idb, &$boucles, $crit) {
  **/
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
 	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
-	if (($crit->op == ',') or ($crit->op == '/')) {
+	if ($crit->op == ',' || $crit->op == '/') {
 		calculer_critere_parties($idb, $boucles, $crit);
 		return;
 	}
@@ -1916,7 +1913,7 @@ function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
 		$where = ["'NOT'", $where];
 	}
 	if ($crit->exclus) {
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
+		if (!preg_match(',^L\d+[.],', $arg)) {
 			$where = ["'NOT'", $where];
 		} else {
 			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
@@ -1936,13 +1933,11 @@ function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
 	// traiter a part la date, elle est mise d'office par SPIP,
 	if ($crit->cond) {
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
-		if ($col === 'date' or $col === 'date_redac') {
-			if ($pred === "\$Pile[0]['" . $col . "']") {
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
-			}
+		if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
+			$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
 		}
 
-		if ($op === '=' and !$crit->not) {
+		if ($op === '=' && !$crit->not) {
 			$where = [
 				"'?'",
 				"(is_array($pred))",
@@ -2021,13 +2016,13 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 
 	// Cas particulier : id_parent => verifier les exceptions de tables
 	if (
-		(in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
+		in_array($col, ['id_parent', 'id_secteur'])
+		&& isset($GLOBALS['exceptions_des_tables'][$table][$col]) || isset($GLOBALS['exceptions_des_tables'][$table][$col]) && is_string($GLOBALS['exceptions_des_tables'][$table][$col])
 	) {
 		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
 	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
 	else {
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
+		if ($col == 'id_secteur' && ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
 			$table = $critere_secteur($idb, $boucles, $val, $crit);
 		}
 
@@ -2036,8 +2031,8 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 		else {
 			if (
 				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
-				and count(trouver_champs_decomposes($col, $desc)) > 1
+				&& !isset($GLOBALS['exceptions_des_jointures'][$col])
+				&& count(trouver_champs_decomposes($col, $desc)) > 1
 			) {
 				$e = decompose_champ_id_objet($col);
 				$col = array_shift($e);
@@ -2055,13 +2050,13 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 
 						$trouver_table = charger_fonction('trouver_table', 'base');
 						if (
-							$desc = $trouver_table($table, $boucle->sql_serveur)
-							and isset($desc['field'][$col])
-							and $cle = array_search($desc['table'], $boucle->from)
+							($desc = $trouver_table($table, $boucle->sql_serveur))
+							&& isset($desc['field'][$col])
+							&& ($cle = array_search($desc['table'], $boucle->from))
 						) {
 							$table = $cle;
 						} else {
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
+							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond || $op != '='));
 						}
 						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
 						if (!$table) {
@@ -2095,7 +2090,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	// et int sinon si la valeur est numerique
 	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
 	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
+	if ($op == '=' || in_array($op, $GLOBALS['table_criteres_infixes'])) {
 		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
@@ -2111,25 +2106,24 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 		// sql_quote(truc,'','varchar')
 		elseif (
 			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
-			// si pas deja un type
-			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
+			&& (!isset($r[3]) || !$r[3] || !trim($r[3], ", '"))
 		) {
 			$r = $r[1]
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
+				. ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
 				. ",'" . addslashes($type_cast_quote) . "'";
 			$val[0] = "sql_quote($r)";
 		}
 		elseif (
-			strpos($val[0], '@@defaultcast@@') !== false
-			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
+			str_contains($val[0], '@@defaultcast@@')
+			&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
 		) {
 			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
 		}
 	}
 
 	if (
-		strpos($val[0], '@@defaultcast@@') !== false
-		and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
+		str_contains($val[0], '@@defaultcast@@')
+		&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
 	) {
 		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
 	}
@@ -2146,11 +2140,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 
 	// inserer le nom de la table SQL devant le nom du champ
 	if ($table) {
-		if ($col[0] == '`') {
-			$arg = "$table." . substr($col, 1, -1);
-		} else {
-			$arg = "$table.$col";
-		}
+		$arg = $col[0] == '`' ? "$table." . substr($col, 1, -1) : "$table.$col";
 	} else {
 		$arg = $col;
 	}
@@ -2197,12 +2187,10 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_
 	$table_sql = table_objet_sql($table);
 	if (
 		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
-		and
-		(
+		&& is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
+		&& (
 			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
-			or
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
+			|| isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
 		)
 	) {
 		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
@@ -2233,12 +2221,12 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_
 	$table = '';
 	if ($boucle->jointures_explicites) {
 		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
+		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond || $op != '='), $t);
 	}
 
 	// et sinon on cherche parmi toutes les jointures declarees
 	if (!$table) {
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
+		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond || $op != '='), $t);
 	}
 
 	if (!$table) {
@@ -2248,9 +2236,9 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_
 	// il ne reste plus qu'a trouver le champ dans les from
 	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
 
-	if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
+	if ((is_countable($cle) ? count($cle) : 0) > 1 || reset($cle) !== $col) {
 		$col_alias = $col; // id_article devient juste le nom d'origine
-		if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
+		if ((is_countable($cle) ? count($cle) : 0) > 1 && reset($cle) == 'id_objet') {
 			$e = decompose_champ_id_objet($col);
 			$col = array_shift($e);
 			$where = primary_doublee($e, $table);
@@ -2320,13 +2308,12 @@ function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $c
 	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
 	if (
 		$checkarrivee
-		and is_string($checkarrivee)
-		and $a = table_objet($checkarrivee)
-		and in_array($a . '_liens', $joints)
+		&& is_string($checkarrivee)
+		&& ($a = table_objet($checkarrivee))
+		&& in_array($a . '_liens', $joints)
+		&& ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
 	) {
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
-			return $res;
-		}
+		return $res;
 	}
 	foreach ($joints as $joint) {
 		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
@@ -2396,7 +2383,7 @@ function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $chec
 	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
 
-	if (!$intermediaire or !$arrivee) {
+	if (!$intermediaire || !$arrivee) {
 		return '';
 	}
 	array_pop($intermediaire); // enlever la cle en 3eme argument
@@ -2472,7 +2459,7 @@ function trouver_champ($champ, $where) {
  **/
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
 	// cas d'une valeur comparee a elle-meme ou son referent
-	if (count($crit->param) == 0) {
+	if ((is_countable($crit->param) ? count($crit->param) : 0) == 0) {
 		$op = '=';
 		$col = $val = $crit->op;
 		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
@@ -2494,7 +2481,7 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
 				// Si id_enfant, comparer l'id_objet avec l'id_parent
 				// de la boucle superieure
 				$val = 'id_parent';
-			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
+			} elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
 				// un critere conditionnel sur date est traite a part
 				// car la date est mise d'office par SPIP,
 				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
@@ -2521,23 +2508,22 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
 		// celui ne sachant pas ce qu'est un critere infixe
 		// et a fortiori son 2e operande qu'entoure " ou '
 		if (
-			count($params) == 1
-			and (is_countable($params[0]) ? count($params[0]) : 0) == 3
-			and $params[0][0]->type == 'texte'
-			and $params[0][2]->type == 'texte'
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
-			and (($p == "'") or ($p == '"'))
-			and $params[0][1]->type == 'champ'
+			(is_countable($params) ? count($params) : 0) == 1
+			&& (is_countable($params[0]) ? count($params[0]) : 0) == 3
+			&& $params[0][0]->type == 'texte'
+			&& $params[0][2]->type == 'texte'
+			&& ($p = $params[0][0]->texte) == $params[0][2]->texte
+			&& ($p == "'" || $p == '"')
+			&& $params[0][1]->type == 'champ'
 		) {
 			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
 		} else {
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
 				$a = calculer_liste($p, $idb, $boucles, $parent);
-				if (strcasecmp($op, 'IN') == 0) {
-					$val[] = $a;
-				} else {
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
-				} // toujours quoter en char ici
+				$val[] = strcasecmp($op, 'IN') == 0
+					? $a
+					// toujours quoter en char ici
+					: kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
 			}
 		}
 	}
@@ -2570,8 +2556,8 @@ function calculer_vieux_in($params) {
 	$n = isset($last->texte) ? strlen($last->texte) : 0;
 
 	if (
-		!((isset($deb->texte[0]) and $deb->texte[0] == '(')
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
+		!((isset($deb->texte[0]) && $deb->texte[0] == '(')
+		&& (isset($last->texte[$n - 1]) && $last->texte[$n - 1] == ')'))
 	) {
 		return $params;
 	}
@@ -2628,14 +2614,10 @@ function calculer_critere_infixe_date($idb, &$boucles, $col) {
 	$col = $regs[1];
 
 	// Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
-	if (isset($regs[3]) and $suite = $regs[3]) {
+	if (isset($regs[3]) && ($suite = $regs[3])) {
 		# Recherche de l'existence du champ date_xxxx,
 		# si oui choisir ce champ, sinon choisir xxxx
-		if (isset($table['field']["date$suite"])) {
-			$date_orig = 'date' . $suite;
-		} else {
-			$date_orig = substr($suite, 1);
-		}
+		$date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
 
 		$pred = $date_orig;
 	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
@@ -2647,7 +2629,7 @@ function calculer_critere_infixe_date($idb, &$boucles, $col) {
 		$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
 
 		// Si c'est pour du relatif
-		if (isset($regs[2]) and $rel = $regs[2]) {
+		if (isset($regs[2]) && ($rel = $regs[2])) {
 			$pred = 'date';
 		}
 	}
@@ -2750,17 +2732,14 @@ function critere_DATA_source_dist($idb, &$boucles, $crit) {
 
 	$args = [];
 	foreach ($crit->param as &$param) {
-		array_push(
-			$args,
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
-		);
+		$args[] = calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent);
 	}
 
 	$boucle->hash .= '
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
 
 	$boucle->hash .= '
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
+	$command[\'source\'] = array(' . implode(', ', $args) . ");\n";
 }
 
 /**
@@ -2966,7 +2945,7 @@ function critere_noeud_dist($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];
 	$primary = $boucle->primary;
 
-	if (!$primary or strpos($primary, ',')) {
+	if (!$primary || strpos($primary, ',')) {
 		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
 
 		return;
@@ -2999,7 +2978,7 @@ function critere_noeud_dist($idb, &$boucles, $crit) {
  */
 function critere_feuille_dist($idb, &$boucles, $crit) {
 	$not = $crit->not;
-	$crit->not = $not ? false : true;
+	$crit->not = !$not;
 	critere_noeud_dist($idb, $boucles, $crit);
 	$crit->not = $not;
 }
diff --git a/ecrire/public/debusquer.php b/ecrire/public/debusquer.php
index 5358dbfeaa..9592015f84 100644
--- a/ecrire/public/debusquer.php
+++ b/ecrire/public/debusquer.php
@@ -95,7 +95,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 		set_request('var_mode', 'debug');
 		$GLOBALS['bouton_admin_debug'] = true;
 		// Permettre a la compil de continuer
-		if (is_object($lieu) and (!isset($lieu->code) or !$lieu->code)) {
+		if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
 			$lieu->code = "''";
 		}
 		// loger si personne ne verra l'erreur
@@ -103,16 +103,14 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 			debusquer_loger_erreur($message, $lieu);
 		}
 		// forcer l'appel au debusqueur en cas de boucles infernales
-		$urgence = (_DEBUG_MAX_SQUELETTE_ERREURS and (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
+		$urgence = (_DEBUG_MAX_SQUELETTE_ERREURS && (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
 		if (!$urgence) {
 			return;
 		}
 	}
-	if (empty($GLOBALS['debug_objets']['principal'])) {
-		// espace public ?
-		if (isset($GLOBALS['fond'])) {
-			$GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
-		}
+	// espace public ?
+ 	if (empty($GLOBALS['debug_objets']['principal']) && isset($GLOBALS['fond'])) {
+		$GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
 	}
 
 	include_spip('inc/autoriser');
@@ -133,7 +131,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 		. '<br />'
 		. debusquer_squelette($fonc, $mode, $self);
 
-	if (!_DIR_RESTREINT or headers_sent()) {
+	if (!_DIR_RESTREINT || headers_sent()) {
 		return $res;
 	}
 	if ($tableau_des_erreurs) {
@@ -148,7 +146,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 		if (!$fonc) {
 			$fonc = $GLOBALS['debug_objets']['principal'];
 		}
-		$titre = !$mode ? $fonc : ($mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : ''));
+		$titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
 	}
 	if ($message === false) {
 		lang_select();
@@ -164,13 +162,7 @@ function debusquer_compose_message($msg) {
 	if (is_array($msg)) {
 		// si c'est un texte, c'est une traduction a faire, mais
 		// sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
-		if (!is_numeric($msg[0]) and count($msg) == 2) {
-			// message avec argument: instancier
-			$msg = _T($msg[0], $msg[1], 'spip-debug-arg');
-		} else {
-			// message SQL: interpreter
-			$msg = debusquer_requete($msg);
-		}
+		$msg = !is_numeric($msg[0]) && count($msg) == 2 ? _T($msg[0], $msg[1], 'spip-debug-arg') : debusquer_requete($msg);
 	}
 	// FIXME: le fond n'est pas la si on n'est pas dans un squelette
 	// cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
@@ -205,7 +197,7 @@ function debusquer_bandeau($erreurs) {
  * @return string Code HTML
  **/
 function debusquer_contexte($env) {
-	if (is_string($env) and is_array($env_tab = @unserialize($env))) {
+	if (is_string($env) && is_array($env_tab = @unserialize($env))) {
 		$env = $env_tab;
 	}
 
@@ -220,7 +212,7 @@ function debusquer_contexte($env) {
 				if (is_array($v)) {
 					$valeur_simple[] = 'array:' . count($v);
 				} elseif (is_object($v)) {
-					$valeur_simple[] = get_class($v);
+					$valeur_simple[] = $v::class;
 				} elseif (is_string($v)) {
 					$valeur_simple[] = "'" . $v . "'";
 				} else {
@@ -229,9 +221,9 @@ function debusquer_contexte($env) {
 			}
 			$n = count($valeur);
 			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
-			$valeur .= '[' . join(', ', $valeur_simple) . ']';
+			$valeur .= '[' . implode(', ', $valeur_simple) . ']';
 		} elseif (is_object($valeur)) {
-			$valeur = get_class($valeur);
+			$valeur = $valeur::class;
 		} elseif (is_string($valeur)) {
 			$valeur = "'" . $valeur . "'";
 		}
@@ -281,7 +273,7 @@ function debusquer_navigation($tableau, $caption = [], $id = 'debug-nav') {
 		[$msg, $lieu] = $err;
 		if (is_object($lieu)) {
 			$ligne = $lieu->ligne;
-			$boucle = !empty($lieu->id_boucle) ? $lieu->id_boucle : '';
+			$boucle = empty($lieu->id_boucle) ? '' : $lieu->id_boucle;
 			if (isset($lieu->descr['nom'])) {
 				$nom_code = $lieu->descr['nom'];
 				$skel = $lieu->descr['sourcefile'];
@@ -316,7 +308,7 @@ function debusquer_navigation($tableau, $caption = [], $id = 'debug-nav') {
 #		aider('erreur_compilation'),
 	. '</caption>'
 	//  fausse caption du chrono (mais vraie nav)
-	. (!empty($caption[1]) ? $caption[1] : '')
+	. (empty($caption[1]) ? '' : $caption[1])
 	. '<tr><th>'
 	. _T('numero')
 	. '</th><th>'
@@ -353,17 +345,17 @@ function debusquer_requete($message) {
 
 	// FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
 	// il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
-	if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)) {
+	if (preg_match(',err(no|code):?[[:space:]]*(\d+),i', $msg, $regs)) {
 		$errno = $regs[2];
 	} elseif (
-		is_numeric($errno) and ($errno == 1030 or $errno <= 1026)
-		and preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $msg, $regs)
+		is_numeric($errno) && ($errno == 1030 || $errno <= 1026)
+		&& preg_match(',[^[:alnum:]](\d+)[^[:alnum:]],', $msg, $regs)
 	) {
 		$errno = $regs[1];
 	}
 
 	// Erreur systeme
-	if (is_numeric($errno) and $errno > 0 and $errno < 200) {
+	if (is_numeric($errno) && $errno > 0 && $errno < 200) {
 		$retour = '<tt><br /><br /><blink>'
 			. _T('info_erreur_systeme', ['errsys' => $errno])
 			. "</blink><br />\n<b>"
@@ -431,13 +423,12 @@ function trouve_squelette_inclus($script) {
 	preg_match('/include\(.(.*).php3?.\);/', $script, $reg);
 	// si le script X.php n'est pas ecrire/public.php
 	// on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
-	if ($reg[1] == 'ecrire/public') { // si c'est bien ecrire/public on cherche le param 'fond'
-	if (!preg_match("/'fond' => '([^']*)'/", $script, $reg)) { // a defaut on cherche le param 'page'
+	// si c'est bien ecrire/public on cherche le param 'fond'
+	if ($reg[1] == 'ecrire/public' && !preg_match("/'fond' => '([^']*)'/", $script, $reg)) { // a defaut on cherche le param 'page'
 		if (!preg_match("/'param' => '([^']*)'/", $script, $reg)) {
 				$reg[1] = 'inconnu';
 		}
 	}
-	}
 	$incl = ',' . $reg[1] . '[.]\w$,';
 
 	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
@@ -453,16 +444,17 @@ function reference_boucle_debug($n, $nom, $self) {
 	[$skel, $boucle, $ligne] = trouve_boucle_debug($n, $nom);
 
 	if (!$boucle) {
-		return !$ligne ? '' :
-			(' (' .
+		return $ligne
+			? ' (' .
 				(($nom != $skel) ? _T('squelette_inclus_ligne') :
 					_T('squelette_ligne')) .
-				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)");
+				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
+			: '';
 	} else {
 		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
 
-		return !$ligne ? " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)" :
-			" (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)";
+		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
+			" (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
 	}
 }
 
@@ -477,7 +469,7 @@ function ancre_texte($texte, $fautifs = [], $nocpt = false) {
 	$res = '';
 
 	$s = highlight_string($texte, true);
-	if (substr($s, 0, 6) == '<code>') {
+	if (str_starts_with($s, '<code>')) {
 		$s = substr($s, 6);
 		$res = '<code>';
 	}
@@ -491,7 +483,7 @@ function ancre_texte($texte, $fautifs = [], $nocpt = false) {
 
 	$tableau = explode('<br />', $s);
 
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . strval(@strlen(count($tableau))) . "d</a></span> %s<br />\n";
+	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
 
 	$format10 = str_replace('white', 'lightgrey', $format);
 	$formaterr = 'color: red;';
@@ -545,7 +537,7 @@ function debusquer_squelette($fonc, $mode, $self) {
 	$texte = '';
 
 	if ($mode !== 'validation') {
-		if (isset($GLOBALS['debug_objets']['sourcefile']) and $GLOBALS['debug_objets']['sourcefile']) {
+		if (isset($GLOBALS['debug_objets']['sourcefile']) && $GLOBALS['debug_objets']['sourcefile']) {
 			$res = "<div id='spip-boucles'>\n"
 				. debusquer_navigation_squelettes($self)
 				. '</div>';
@@ -587,15 +579,16 @@ function debusquer_squelette($fonc, $mode, $self) {
 		$res = $id = '';
 	}
 
-	return !trim($texte) ? '' : (
-		"<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
-		. "<div id='debug_boucle'><fieldset$id><legend>"
-		. "<a href='" . $self . '#f_' . substr($fonc, 0, 37) . "'> &#8593; "
-		. ($legend ?: $mode)
-		. '</a></legend>'
-		. $texte
-		. '</fieldset></div>'
-		. '</div>');
+	return trim($texte)
+		? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
+			. "<div id='debug_boucle'><fieldset$id><legend>"
+			. "<a href='" . $self . '#f_' . substr($fonc, 0, 37) . "'> &#8593; "
+			. ($legend ?: $mode)
+			. '</a></legend>'
+			. $texte
+			. '</fieldset></div>'
+			. '</div>'
+		: '';
 }
 
 
@@ -603,7 +596,7 @@ function emboite_texte($res, $fonc = '', $self = '') {
 	$errs = $res->err;
 	$texte = $res->entete . ($errs ? '' : $res->page);
 
-	if (!$texte and !$errs) {
+	if (!$texte && !$errs) {
 		return [ancre_texte('', ['', '']), false];
 	}
 	if (!$errs) {
@@ -691,16 +684,16 @@ function count_occ($regs) {
 function debusquer_navigation_squelettes($self) {
 
 	$res = '';
-	$boucles = !empty($GLOBALS['debug_objets']['boucle']) ? $GLOBALS['debug_objets']['boucle'] : '';
+	$boucles = empty($GLOBALS['debug_objets']['boucle']) ? '' : $GLOBALS['debug_objets']['boucle'];
 	$contexte = $GLOBALS['debug_objets']['contexte'];
 	$t_skel = _T('squelette');
 	foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
 		$self2 = parametre_url($self, 'var_mode_objet', $nom);
-		$nav = !$boucles ? '' : debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile);
-		$temps = !isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? '' : _T(
+		$nav = $boucles ? debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile) : '';
+		$temps = isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? _T(
 			'zbug_profile',
 			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
-		);
+		) : '';
 
 		$res .= "<fieldset id='f_" . $nom . "'><legend>"
 			. $t_skel
@@ -717,9 +710,9 @@ function debusquer_navigation_squelettes($self) {
 			. "'>"
 			. _T('zbug_calcul')
 			. '</a></legend>'
-			. (!$temps ? '' : ("\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />"))
+			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
 			. debusquer_contexte($contexte[$sourcefile])
-		. (!$nav ? '' : ("<table width='100%'>\n$nav</table>\n"))
+		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
 		. "</fieldset>\n";
 	}
 
@@ -733,7 +726,7 @@ function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source) {
 	$gram = preg_match('/[.](\w+)$/', $nom_source, $r) ? $r[1] : '';
 
 	foreach ($boucles as $objet => $boucle) {
-		if (substr($objet, 0, strlen($nom_skel)) == $nom_skel) {
+		if (str_starts_with($objet, $nom_skel)) {
 			$i++;
 			$nom = $boucle->id_boucle;
 			$req = $boucle->type_requete;
diff --git a/ecrire/public/decompiler.php b/ecrire/public/decompiler.php
index 06d502891c..ec6aa3c26f 100644
--- a/ecrire/public/decompiler.php
+++ b/ecrire/public/decompiler.php
@@ -38,7 +38,7 @@ function decompiler_boucle($struct, $fmt = '', $prof = 0) {
 	// Revoir le cas de la boucle recursive
 
 	$crit = $struct->param;
-	if ($crit and !is_array($crit[0])) {
+	if ($crit && !is_array($crit[0])) {
 		$type = strtolower($type) . array_shift($crit);
 	}
 	$crit = decompiler_criteres($struct, $fmt, $prof);
@@ -119,17 +119,17 @@ function decompiler_liste($sources, $fmt = '', $prof = 0) {
 		foreach ($arg as $v) {
 			// cas des arguments entoures de ' ou "
 			if (
-				((is_countable($v) ? count($v) : 0) == 1)
-				and $v[0]->type == 'texte'
-				and (strlen($v[0]->apres) == 1)
-				and $v[0]->apres == $v[0]->avant
+				(is_countable($v) ? count($v) : 0) == 1
+				&& $v[0]->type == 'texte'
+				&& strlen($v[0]->apres) == 1
+				&& $v[0]->apres == $v[0]->avant
 			) {
 				$args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres;
 			} else {
 				$args[] = decompiler_($v, $fmt, 0 - $prof);
 			}
 		}
-		if (($r !== '') or $args) {
+		if ($r !== '' || $args) {
 			$res .= $f($r, $args, $prof);
 		}
 	}
@@ -156,9 +156,9 @@ function decompiler_criteres($boucle, $fmt = '', $prof = 0) {
 		$args = [];
 		foreach ($crit as $i => $v) {
 			if (
-				((is_countable($v) ? count($v) : 0) == 1)
-				and $v[0]->type == 'texte'
-				and $v[0]->apres
+				(is_countable($v) ? count($v) : 0) == 1
+				&& $v[0]->type == 'texte'
+				&& $v[0]->apres
 			) {
 				$args[] = [['texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres)]];
 			} else {
@@ -166,7 +166,7 @@ function decompiler_criteres($boucle, $fmt = '', $prof = 0) {
 				foreach ($v as $k => $p) {
 					if (
 						isset($p->type)
-						and function_exists($d = 'decompiler_' . $p->type)
+						&& function_exists($d = 'decompiler_' . $p->type)
 					) {
 						$r = $d($p, $fmt, (0 - $prof));
 						$res2[] = [$p->type, $r];
@@ -202,11 +202,11 @@ function decompiler_($liste, $fmt = '', $prof = 0) {
 
 		if (
 			$next
-			and ($next->type == 'texte')
-			and $p->type == 'champ'
-			and !$p->apres
-			and !$p->avant
-			and $p->fonctions
+			&& $next->type == 'texte'
+			&& $p->type == 'champ'
+			&& !$p->apres
+			&& !$p->avant
+			&& $p->fonctions
 		) {
 			$n = strlen($next->texte) - strlen(ltrim($next->texte));
 			if ($n) {
diff --git a/ecrire/public/evaluer_page.php b/ecrire/public/evaluer_page.php
index 4ffb85fa09..dc0e9c0c7f 100644
--- a/ecrire/public/evaluer_page.php
+++ b/ecrire/public/evaluer_page.php
@@ -32,20 +32,20 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 $res = true;
 
 // Cas d'une page contenant du PHP :
-if (empty($page['process_ins']) or $page['process_ins'] != 'html') {
+if (empty($page['process_ins']) || $page['process_ins'] != 'html') {
 	include_spip('inc/lang');
 
 	// restaurer l'etat des notes avant calcul
 	if (
 		isset($page['notes'])
-		and $page['notes']
-		and $notes = charger_fonction('notes', 'inc', true)
+		&& $page['notes']
+		&& ($notes = charger_fonction('notes', 'inc', true))
 	) {
 		$notes($page['notes'], 'restaurer_etat');
 	}
 	ob_start();
-	if (strpos($page['texte'], '?xml') !== false) {
-		$page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']);
+	if (str_contains($page['texte'], '?xml')) {
+		$page['texte'] = str_replace('<?xml', "<\1?xml", $page['texte']);
 	}
 
 	try {
@@ -69,11 +69,11 @@ if (empty($page['process_ins']) or $page['process_ins'] != 'html') {
 
 	$page['process_ins'] = 'html';
 
-	if (strpos($page['texte'], '?xml') !== false) {
-		$page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']);
+	if (str_contains($page['texte'], '?xml')) {
+		$page['texte'] = str_replace("<\1?xml", '<?xml', $page['texte']);
 	}
 }
 
 // le résultat de calcul d'un squelette est toujours de type string
-$page['texte'] = strval($page['texte']);
+$page['texte'] = (string) $page['texte'];
 page_base_href($page['texte']);
diff --git a/ecrire/public/fonctions.php b/ecrire/public/fonctions.php
index 00a5e9f4f4..6f9363d395 100644
--- a/ecrire/public/fonctions.php
+++ b/ecrire/public/fonctions.php
@@ -65,7 +65,7 @@ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $sui
 	while ($fin = strpos($texte, '</intro>')) {
 		$zone = substr($texte, 0, $fin);
 		$texte = substr($texte, $fin + strlen('</intro>'));
-		if ($deb = strpos($zone, '<intro>') or substr($zone, 0, 7) == '<intro>') {
+		if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) {
 			$zone = substr($zone, $deb + 7);
 		}
 		$intro .= $zone;
@@ -86,10 +86,10 @@ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $sui
 		$texte = $intro;
 	} else {
 		if (
-			strpos("\n" . $texte, "\n|") === false
-			and strlen($texte) > 2.5 * $longueur
+			!str_contains("\n" . $texte, "\n|")
+			&& strlen($texte) > 2.5 * $longueur
 		) {
-			if (strpos($texte, '<multi') !== false) {
+			if (str_contains($texte, '<multi')) {
 				$texte = extraire_multi($texte);
 			}
 			$texte = couper($texte, 2 * $longueur);
@@ -109,7 +109,7 @@ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $sui
 		$notes('', 'depiler');
 	}
 
-	if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
+	if (is_null($suite) && defined('_INTRODUCTION_SUITE')) {
 		$suite = _INTRODUCTION_SUITE;
 	}
 	$texte = couper($texte, $longueur, $suite);
@@ -174,11 +174,7 @@ function filtre_pagination_dist(
 	$debut = 'debut' . $nom; // 'debut_articles'
 
 	// n'afficher l'ancre qu'une fois
-	if (!isset($ancres[$ancre])) {
-		$bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
-	} else {
-		$bloc_ancre = '';
-	}
+	$bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>");
 	// liste = false : on ne veut que l'ancre
 	if (!$liste) {
 		return $ancres[$ancre];
@@ -189,10 +185,10 @@ function filtre_pagination_dist(
 		'debut' => $debut,
 		'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
 		'total' => $total,
-		'position' => intval($position),
+		'position' => (int) $position,
 		'pas' => $pas,
 		'nombre_pages' => floor(($total - 1) / $pas) + 1,
-		'page_courante' => floor(intval($position) / $pas) + 1,
+		'page_courante' => floor((int) $position / $pas) + 1,
 		'ancre' => $ancre,
 		'bloc_ancre' => $bloc_ancre
 	];
@@ -207,12 +203,7 @@ function filtre_pagination_dist(
 
 	if ($modele) {
 		$pagination['type_pagination'] = $modele;
-		if (trouver_fond('pagination_' . $modele, 'modeles')) {
-			$modele = '_' . $modele;
-		}
-		else {
-			$modele = '';
-		}
+		$modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : '';
 	}
 
 	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
@@ -242,7 +233,7 @@ function filtre_pagination_dist(
  *     Liste (première page, dernière page).
  **/
 function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) {
-	if ($max <= 0 or $max >= $nombre) {
+	if ($max <= 0 || $max >= $nombre) {
 		return [1, $nombre];
 	}
 	if ($max <= 1) {
@@ -267,19 +258,13 @@ function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numer
 		return '&gt;';
 	}
 
-	switch ($type_pagination) {
-		case 'resultats':
-			return $rang_item + 1; // 1 11 21 31...
-		case 'naturel':
-			return $rang_item ?: 1; // 1 10 20 30...
-		case 'rang':
-			return $rang_item; // 0 10 20 30...
-
-		case 'page':
-		case 'prive':
-		default:
-			return $numero_page; // 1 2 3 4 5...
-	}
+	return match ($type_pagination) {
+		'resultats' => $rang_item + 1, // 1 11 21 31...
+		'naturel' => $rang_item ?: 1, // 1 10 20 30...
+		'rang' => $rang_item, // 0 10 20 30...
+		'page', 'prive' => $numero_page, // 1 2 3 4 5...
+		default => $numero_page, // 1 2 3 4 5...
+	};
 }
 
 /**
@@ -364,7 +349,7 @@ function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
 	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
 		include_spip('action/editer_liens');
 		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
-		if ($objet_lien == $objet and $objet_lien !== $objet_source) {
+		if ($objet_lien == $objet && $objet_lien !== $objet_source) {
 			$res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
 		} else {
 			$res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
@@ -389,16 +374,16 @@ function calculer_rang_smart($titre, $objet_source, $id, $env) {
 	// Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
 	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
 	if (
-		isset($env['form']) and $env['form']
-		and isset($env['_objet_lien']) and $env['_objet_lien']
-		and (function_exists('lien_triables') or include_spip('action/editer_liens'))
-		and $r = objet_associable($env['_objet_lien'])
-		and [$p, $table_lien] = $r
-		and lien_triables($table_lien)
-		and isset($env['objet']) and $env['objet']
-		and isset($env['id_objet']) and $env['id_objet']
-		and $objet_source
-		and $id = intval($id)
+		isset($env['form']) && $env['form']
+		&& isset($env['_objet_lien']) && $env['_objet_lien']
+		&& (function_exists('lien_triables') || include_spip('action/editer_liens'))
+		&& ($r = objet_associable($env['_objet_lien']))
+		&& ([$p, $table_lien] = $r)
+		&& lien_triables($table_lien)
+		&& isset($env['objet']) && $env['objet']
+		&& isset($env['id_objet']) && $env['id_objet']
+		&& $objet_source
+		&& ($id = (int) $id)
 	) {
 		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
 		return ($rang ?: '');
@@ -481,8 +466,8 @@ function calculer_balise_tri(string $champ_ou_sens, string $libelle, string $cla
 	}
 
 	// Drapeau pour garder en session ?
-	$param_memo = (!$is_sens_fixe ? $param_tri : $param_sens);
-	$url = parametre_url($url, 'var_memotri', strncmp($tri_nom, 'session', 7) == 0 ? $param_memo : '');
+	$param_memo = ($is_sens_fixe ? $param_sens : $param_tri);
+	$url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : '');
 
 	// Classes : on indique le sens de tri et l'item exposé
 	if (!$is_sens_fixe) {
@@ -524,7 +509,7 @@ function tri_protege_champ($t) {
  * @return string
  */
 function tri_champ_order($t, $from = null, $senstri = '') {
-	if (strncmp($t, 'multi ', 6) == 0) {
+	if (str_starts_with($t, 'multi ')) {
 		return 'multi' . $senstri;
 	}
 
@@ -532,7 +517,7 @@ function tri_champ_order($t, $from = null, $senstri = '') {
 
 	$prefixe = '';
 	foreach (['num ', 'sinum '] as $p) {
-		if (strpos($t, $p) === 0) {
+		if (str_starts_with($t, $p)) {
 			$champ = substr($t, strlen($p));
 			$prefixe = $p;
 		}
@@ -545,22 +530,18 @@ function tri_champ_order($t, $from = null, $senstri = '') {
 		$trouver_table = charger_fonction('trouver_table', 'base');
 		foreach ($from as $idt => $table_sql) {
 			if (
-				$desc = $trouver_table($table_sql)
-				and isset($desc['field'][$champ])
+				($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ])
 			) {
 				$champ = "$idt.$champ";
 				break;
 			}
 		}
 	}
-	switch ($prefixe) {
-		case 'num ':
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}";
-		case 'sinum ':
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
-		default:
-			return $champ . $senstri;
-	}
+	return match ($prefixe) {
+		'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}",
+		'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}",
+		default => $champ . $senstri,
+ 	};
 }
 
 /**
@@ -574,12 +555,11 @@ function tri_champ_order($t, $from = null, $senstri = '') {
  * @return string
  */
 function tri_champ_select($t) {
-	if (strncmp($t, 'multi ', 6) == 0) {
+	if (str_starts_with($t, 'multi ')) {
 		$t = substr($t, 6);
 		$t = preg_replace(',\s,', '', $t);
-		$t = sql_multi($t, $GLOBALS['spip_lang']);
 
-		return $t;
+		return sql_multi($t, $GLOBALS['spip_lang']);
 	}
 	if (trim($t) == 'hasard') {
 		return 'rand() AS hasard';
@@ -601,12 +581,11 @@ function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
 		return '';
 	}
 	$f = sql_serveur('quote', $serveur, true);
-	if (!is_string($f) or !$f) {
+	if (!is_string($f) || !$f) {
 		return '';
 	}
-	$valeurs = implode(',', array_map($f, array_unique($valeurs)));
 
-	return $valeurs;
+	return implode(',', array_map($f, array_unique($valeurs)));
 }
 
 /**
@@ -631,7 +610,7 @@ function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
 function appliquer_filtre_sinon($arg, $filtre, $args, $defaut = '') {
 	// Si c'est un filtre d'image, on utilise image_filtrer()
 	// Attention : les 2 premiers arguments sont inversés dans ce cas
-	if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
+	if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) {
 		include_spip('inc/filtres_images_lib_mini');
 		$args[1] = $args[0];
 		$args[0] = $filtre;
diff --git a/ecrire/public/format_html.php b/ecrire/public/format_html.php
index 400fb8c267..354001de7a 100644
--- a/ecrire/public/format_html.php
+++ b/ecrire/public/format_html.php
@@ -19,22 +19,18 @@ function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres,
 	$apres = $apres ? "$apres</B$nom>" : '';
 	$altern = $altern ? "$altern<//B$nom>" : '';
 	$postaff = $postaff ? "$postaff</BB$nom>" : '';
-	if (!$corps) {
-		$corps = ' />';
-	} else {
-		$corps = ">$corps</BOUCLE$nom>";
-	}
+	$corps = $corps ? ">$corps</BOUCLE$nom>" : ' />';
 
 	return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
 }
 
 function format_inclure_html($file, $args, $prof) {
-	if (strpos($file, '#') === false) {
+	if (!str_contains($file, '#')) {
 		$t = $file ? ('(' . $file . ')') : '';
 	} else {
 		$t = '{fond=' . $file . '}';
 	}
-	$args = !$args ? '' : ('{' . join(', ', $args) . '}');
+	$args = $args ? '{' . implode(', ', $args) . '}' : ('');
 
 	return ('<INCLURE' . $t . $args . '>');
 }
@@ -45,14 +41,14 @@ function format_polyglotte_html($args, $prof) {
 		$contenu[] = ($l ? "[$l]" : '') . $t;
 	}
 
-	return ('<multi>' . join(' ', $contenu) . '</multi>');
+	return ('<multi>' . implode(' ', $contenu) . '</multi>');
 }
 
 function format_idiome_html($nom, $module, $args, $filtres, $prof) {
 	foreach ($args as $k => $v) {
 		$args[$k] = "$k=$v";
 	}
-	$args = (!$args ? '' : ('{' . join(',', $args) . '}'));
+	$args = ($args ? '{' . implode(',', $args) . '}' : (''));
 
 	return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
 }
@@ -67,8 +63,7 @@ function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtr
 
 	// Determiner si c'est un champ etendu,
 
-	$s = ($avant or $apres or $filtres
-		or (strpos($args, '(#') !== false));
+	$s = ($avant || $apres || $filtres || str_contains($args, '(#'));
 
 	return ($s ? "[$avant($nom)$apres]" : $nom);
 }
@@ -78,7 +73,7 @@ function format_critere_html($critere) {
 		$crit_s = '';
 		foreach ($crit as $operande) {
 			[$type, $valeur] = $operande;
-			if ($type == 'champ' and $valeur[0] == '[') {
+			if ($type == 'champ' && $valeur[0] == '[') {
 				$valeur = substr($valeur, 1, -1);
 				if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
 					$valeur = substr($valeur, 1, -1);
@@ -89,27 +84,28 @@ function format_critere_html($critere) {
 		$critere[$k] = $crit_s;
 	}
 
-	return (!$critere ? '' : ('{' . join(',', $critere) . '}'));
+	return ($critere ? '{' . implode(',', $critere) . '}' : (''));
 }
 
 function format_liste_html($fonc, $args, $prof) {
 	return ((($fonc !== '') ? "|$fonc" : $fonc)
-		. (!$args ? '' : ('{' . join(',', $args) . '}')));
+		. ($args ? '{' . implode(',', $args) . '}' : ('')));
 }
 
 // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes
 function format_suite_html($args) {
-	for ($i = 0; $i < (is_countable($args) ? count($args) : 0) - 1; $i++) {
+	$argsCount = count($args);
+	for ($i = 0; $i < (is_countable($args) ? $argsCount : 0) - 1; $i++) {
 		[$texte, $type] = $args[$i];
 		[$texte2, $type2] = $args[$i + 1];
-		if (!$texte or !$texte2) {
+		if (!$texte || !$texte2) {
 			continue;
 		}
 		$c1 = substr($texte, -1);
 		if ($type2 !== 'texte') {
 			// si un texte se termine par ( et est suivi d'un champ
 			// ou assimiles, forcer la notation pleine
-			if ($c1 == '(' and substr($texte2, 0, 1) == '#') {
+			if ($c1 == '(' && str_starts_with($texte2, '#')) {
 				$args[$i + 1][0] = '[(' . $texte2 . ')]';
 			}
 		} else {
@@ -120,15 +116,15 @@ function format_suite_html($args) {
 			// et si celui-ci commence par un caractere de champ
 			// forcer la notation pleine
 			if (
-				($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|')
-				or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2))
+				$c1 == '}' && str_starts_with(ltrim($texte2), '|')
+				|| preg_match('/[\w\d_*]/', $c1) && preg_match('/^[\w\d_*{|]/', $texte2)
 			) {
 				$args[$i][0] = '[(' . $texte . ')]';
 			}
 		}
 	}
 
-	return join('', array_map(fn($arg) => reset($arg), $args));
+	return implode('', array_map(fn($arg) => reset($arg), $args));
 }
 
 function format_texte_html($texte) {
diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php
index 0a63f034b3..15477ff68f 100644
--- a/ecrire/public/interfaces.php
+++ b/ecrire/public/interfaces.php
@@ -27,13 +27,13 @@ global $exception_des_connect;
 $exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclure
 
 /** @deprecated 4.2 Uses nampespaced classes */
-class_alias('Spip\\Compilateur\\Noeud\\Boucle', 'Boucle');
-class_alias('Spip\\Compilateur\\Noeud\\Champ', 'Champ');
-class_alias('Spip\\Compilateur\\Noeud\\Contexte', 'Contexte');
-class_alias('Spip\\Compilateur\\Noeud\\Critere', 'Critere');
-class_alias('Spip\\Compilateur\\Noeud\\Idiome', 'Idiome');
-class_alias('Spip\\Compilateur\\Noeud\\Polyglotte', 'Polyglotte');
-class_alias('Spip\\Compilateur\\Noeud\\Texte', 'Texte');
+class_alias(\Spip\Compilateur\Noeud\Boucle::class, 'Boucle');
+class_alias(\Spip\Compilateur\Noeud\Champ::class, 'Champ');
+class_alias(\Spip\Compilateur\Noeud\Contexte::class, 'Contexte');
+class_alias(\Spip\Compilateur\Noeud\Critere::class, 'Critere');
+class_alias(\Spip\Compilateur\Noeud\Idiome::class, 'Idiome');
+class_alias(\Spip\Compilateur\Noeud\Polyglotte::class, 'Polyglotte');
+class_alias(\Spip\Compilateur\Noeud\Texte::class, 'Texte');
 
 /**
  * Déclarer les interfaces de la base pour le compilateur
diff --git a/ecrire/public/jointures.php b/ecrire/public/jointures.php
index a1043add9b..e8bba13994 100644
--- a/ecrire/public/jointures.php
+++ b/ecrire/public/jointures.php
@@ -34,7 +34,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
  *     Chaine sinon : le nom du champ (non décomposable donc)
  */
 function decompose_champ_id_objet($champ) {
-	if (($champ !== 'id_objet') and preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
+	if ($champ !== 'id_objet' && preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
 		return ['id_objet', 'objet', objet_type($champ)];
 	}
 
@@ -58,15 +58,15 @@ function decompose_champ_id_objet($champ) {
  */
 function trouver_champs_decomposes($champ, $desc) {
 	if (
-		!is_array($desc) // on ne se risque pas en conjectures si on ne connait pas la table
-		or array_key_exists($champ, $desc['field'])
+		!is_array($desc)
+		|| array_key_exists($champ, $desc['field'])
 	) {
 		return [$champ];
 	}
 	// si le champ se décompose, tester que les colonnes décomposées sont présentes
 	if (is_array($decompose = decompose_champ_id_objet($champ))) {
 		array_pop($decompose);
-		if (count(array_intersect($decompose, array_keys($desc['field']))) == count($decompose)) {
+		if (count(array_intersect($decompose, array_keys($desc['field']))) === count($decompose)) {
 			return $decompose;
 		}
 	}
@@ -107,7 +107,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false
 	$max = 1;
 	$res = false;
 	$milieu_exclus = ($col ?: []);
-	while ($max <= $max_liens and !$res) {
+	while ($max <= $max_liens && !$res) {
 		$res = calculer_chaine_jointures($boucle, $depart, $arrivee, [], $milieu_exclus, $max);
 		$max++;
 	}
@@ -171,11 +171,7 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = [], $nom = ''
 		if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article'
 			[$j1, $j2, $obj, $type] = $j;
 			// trouver de quel cote est (id_objet,objet)
-			if ($j1 == "id_$obj") {
-				$obj = "$id_table.$obj";
-			} else {
-				$obj = "L$n.$obj";
-			}
+			$obj = $j1 == "id_$obj" ? "$id_table.$obj" : "L$n.$obj";
 			// le where complementaire est envoye dans la jointure et dans le where
 			// on utilise une clé qui le relie a la jointure pour que l'optimiseur
 			// sache qu'il peut enlever ce where si il enleve la jointure
@@ -211,9 +207,9 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = [], $nom = ''
 	// et si l'index de jointure est une primary key a l'arrivee !
 	if (
 		!$pk
-		and (count($boucle->from) == 2)
-		and isset($a[1]['key']['PRIMARY KEY'])
-		and ($j == $a[1]['key']['PRIMARY KEY'])
+		&& count($boucle->from) == 2
+		&& isset($a[1]['key']['PRIMARY KEY'])
+		&& $j == $a[1]['key']['PRIMARY KEY']
 	) {
 		$pk = true;
 	}
@@ -248,8 +244,8 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = [], $nom = ''
 function nogroupby_if($depart, $arrivee, $col) {
 	if (
 		empty($arrivee['key']['PRIMARY KEY'])
-		or !($pk = $arrivee['key']['PRIMARY KEY'])
-		or empty($depart['key']['PRIMARY KEY'])
+		|| !($pk = $arrivee['key']['PRIMARY KEY'])
+		|| empty($depart['key']['PRIMARY KEY'])
 	) {
 		return false;
 	}
@@ -257,8 +253,7 @@ function nogroupby_if($depart, $arrivee, $col) {
 	if (is_array($col)) {
 		$col = implode(', *', $col);
 	} // cas id_objet, objet
-	return (preg_match("/^$id_primary, *$col$/", $pk) or
-		preg_match("/^$col, *$id_primary$/", $pk));
+	return (preg_match("/^$id_primary, *$col$/", $pk) || preg_match("/^$col, *$id_primary$/", $pk));
 }
 
 /**
@@ -327,7 +322,7 @@ function liste_champs_jointures($nom, $desc, $primary = false) {
  */
 function split_key($v, $join = []) {
 	foreach (preg_split('/,\s*/', $v) as $k) {
-		if (strpos($k, '(') !== false) {
+		if (str_contains($k, '(')) {
 			$k = explode('(', $k);
 			$k = trim(reset($k));
 		}
@@ -373,13 +368,13 @@ function calculer_chaine_jointures(
 	}
 	// quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet
 	// faire une jointure sur objet tout seul n'a pas de sens
-	if (in_array('id_objet', $milieu_exclus) and !in_array('objet', $milieu_exclus)) {
+	if (in_array('id_objet', $milieu_exclus) && !in_array('objet', $milieu_exclus)) {
 		$milieu_exclus[] = 'objet';
 	}
 
 	[$dnom, $ddesc] = $depart;
 	[$anom, $adesc] = $arrivee;
-	if (!count($vu)) {
+	if ($vu === []) {
 		$vu[] = $dnom; // ne pas oublier la table de depart
 		$vu[] = $anom; // ne pas oublier la table d'arrivee
 	}
@@ -398,7 +393,7 @@ function calculer_chaine_jointures(
 	// enlever les cles dde depart exclues par l'appel
 	$keys = array_diff($keys, $milieu_exclus);
 
-	$v = !$keys ? false : array_intersect(array_values($keys), $akeys);
+	$v = $keys ? array_intersect(array_values($keys), $akeys) : false;
 
 	if ($v) {
 		return [[$dnom, [$adesc['table'], $adesc], array_shift($v)]];
@@ -423,12 +418,12 @@ function calculer_chaine_jointures(
 		// id_objet,objet a l'arrivee
 		// si oui on la prend
 		foreach ($keys as $key) {
-			if (count($v = trouver_champs_decomposes($key, $adesc)) > 1) {
-				if (count($v) == count(array_intersect($v, $akeys))) {
-					$v = decompose_champ_id_objet($key); // id_objet,objet,'article'
-					array_unshift($v, $key); // id_article,id_objet,objet,'article'
-					return [[$dnom, [$adesc['table'], $adesc], $v]];
-				}
+			if (count($v = trouver_champs_decomposes($key, $adesc)) > 1 && count($v) == count(array_intersect($v, $akeys))) {
+				$v = decompose_champ_id_objet($key);
+				// id_objet,objet,'article'
+				array_unshift($v, $key);
+				// id_article,id_objet,objet,'article'
+				return [[$dnom, [$adesc['table'], $adesc], $v]];
 			}
 		}
 	}
@@ -442,9 +437,9 @@ function calculer_chaine_jointures(
 	foreach ($boucle->jointures as $v) {
 		if (
 			$v
-			and !in_array($v, $vu)
-			and $def = $trouver_table($v, $boucle->sql_serveur)
-			and !in_array($def['table_sql'], $vu)
+			&& !in_array($v, $vu)
+			&& ($def = $trouver_table($v, $boucle->sql_serveur))
+			&& !in_array($def['table_sql'], $vu)
 		) {
 			// ne pas tester les cles qui sont exclues a l'appel
 			// ie la cle de la jointure precedente
@@ -459,8 +454,7 @@ function calculer_chaine_jointures(
 					$vu,
 					$test_cles,
 					1
-				))
-				and $max_iter--
+				)) && $max_iter--
 			) {
 				$jointure_directe_possible = reset($jointure_directe_possible);
 				$milieu = end($jointure_directe_possible);
@@ -543,20 +537,20 @@ function chercher_champ_dans_tables($cle, $tables, $connect, $checkarrivee = fal
 	}
 
 	foreach ($tables as $k => $table) {
-		if ($table && $desc = $trouver_table($table, $connect)) {
-			if (
+		if (
+			$table
+			&& $desc = $trouver_table($table, $connect)
+			&& (
 				isset($desc['field'])
-				// verifier que toutes les cles cherchees sont la
-				and (count(array_intersect($cle, array_keys($desc['field']))) == count($cle))
-				// si on sait ou on veut arriver, il faut que ca colle
-				and ($checkarrivee == false || $checkarrivee == $desc['table'])
-			) {
-				return [
-					'desc' => $desc,
-					'table' => $desc['table'],
-					'alias' => $k,
-				];
-			}
+				&& count(array_intersect($cle, array_keys($desc['field']))) === count($cle)
+				&& ($checkarrivee == false || $checkarrivee == $desc['table'])
+			)
+		) {
+			return [
+				'desc' => $desc,
+				'table' => $desc['table'],
+				'alias' => $k,
+			];
 		}
 	}
 
@@ -601,8 +595,8 @@ function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
 	// au premier coup, on essaye de decomposer, si possible
 	if (
 		count($cle) == 1
-		and $c = reset($cle)
-		and is_array($decompose = decompose_champ_id_objet($c))
+		&& ($c = reset($cle))
+		&& is_array($decompose = decompose_champ_id_objet($c))
 	) {
 		$desc = $boucle->show;
 
diff --git a/ecrire/public/normaliser.php b/ecrire/public/normaliser.php
index 1f918f8ca0..fb9cc382f4 100644
--- a/ecrire/public/normaliser.php
+++ b/ecrire/public/normaliser.php
@@ -27,11 +27,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 // -> https://www.spip.net/fr_article901.html
 
 function phraser_vieux_logos(&$p) {
-	if ($p->param[0][0]) {
-		$args = [''];
-	} else {
-		$args = array_shift($p->param);
-	}
+	$args = $p->param[0][0] ? [''] : array_shift($p->param);
 
 	foreach ($p->param as $couple) {
 		$nom = trim($couple[0]);
@@ -75,20 +71,12 @@ function phraser_vieux_logos(&$p) {
 
 
 function phraser_logo_faux_filtres($nom) {
-	switch ($nom) {
-		case 'top':
-		case 'left':
-		case 'right':
-		case 'center':
-		case 'bottom':
-			return 0;
-		case 'lien':
-			return 1;
-		case 'fichier':
-			return 2;
-		default:
-			return $nom;
-	}
+	return match ($nom) {
+		'top', 'left', 'right', 'center', 'bottom' => 0,
+		'lien' => 1,
+		'fichier' => 2,
+		default => $nom,
+	};
 }
 
 
@@ -105,7 +93,8 @@ function phraser_vieux_emb(&$p) {
 	$param = ['', [$texte]];
 
 	// Transformer les filtres en arguments
-	for ($i = 0; $i < (is_countable($p->param) ? count($p->param) : 0); $i++) {
+	$paramCount = is_countable($p->param) ? count($p->param) : 0;
+	for ($i = 0; $i < $paramCount; $i++) {
 		if ($p->param[$i][0]) {
 			if (!strstr($p->param[$i][0], '=')) {
 				break;
@@ -187,16 +176,16 @@ function normaliser_args_inclumodel($p) {
 function normaliser_inclure($champ) {
 	normaliser_args_inclumodel($champ);
 	$l = $champ->param[0];
-	if (is_array($l) and !$l[0]) {
+	if (is_array($l) && !$l[0]) {
 		foreach ($l as $k => $p) {
-			if ($p and $p[0]->type == 'texte' and !strpos($p[0]->texte, '=')) {
+			if ($p && $p[0]->type == 'texte' && !strpos($p[0]->texte, '=')) {
 				$p[0]->texte = trim($p[0]->texte);
 			}
 		}
 		foreach ($l as $k => $p) {
 			if (
-				!$p or $p[0]->type != 'texte' or
-				!preg_match('/^fond\s*=\s*(.*)$/', $p[0]->texte, $r)
+				!$p || $p[0]->type != 'texte'
+				|| !preg_match('/^fond\s*=\s*(.*)$/', $p[0]->texte, $r)
 			) {
 				continue;
 			}
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 88cc4ce85c..7de666bc39 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -41,7 +41,7 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', string $conn
 		$lang = $GLOBALS['meta']['langue_site'];
 	}
 
-	$select = ((!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang']) and $lang <> $GLOBALS['spip_lang']);
+	$select = ((!isset($GLOBALS['forcer_lang']) || !$GLOBALS['forcer_lang']) && $lang != $GLOBALS['spip_lang']);
 	if ($select) {
 		$select = lang_select($lang);
 	}
@@ -144,7 +144,7 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', string $conn
 		spip_log("calcul ($profile) [$skel] $infos"
 			. ' (' . strlen($page['texte']) . ' octets)');
 
-		if (defined('_CALCUL_PROFILER') and intval($profile) > _CALCUL_PROFILER) {
+		if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) {
 			spip_log("calcul ($profile) [$skel] $infos"
 				. ' (' . strlen($page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI'], 'profiler' . _LOG_AVERTISSEMENT);
 		}
@@ -157,8 +157,8 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', string $conn
 			$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
 			if (
 				$GLOBALS['debug_objets']['sourcefile']
-				and (_request('var_mode_objet') == $fonc)
-				and (_request('var_mode_affiche') == 'resultat')
+				&& _request('var_mode_objet') == $fonc
+				&& _request('var_mode_affiche') == 'resultat'
 			) {
 				erreur_squelette();
 			}
@@ -169,7 +169,7 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', string $conn
 			// si aucun #CACHE{} spécifié
 			// le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
 			// entre public et prive
-			if (test_espace_prive() or strncmp($fond, 'modeles/', 8) == 0) {
+			if (test_espace_prive() || str_starts_with($fond, 'modeles/')) {
 				$page['entetes']['X-Spip-Cache'] = 0;
 			} else {
 				$page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000;
@@ -180,7 +180,7 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', string $conn
 
 		// faire remonter le fichier source
 		static $js_inclus = false;
-		if (defined('_VAR_INCLURE') and _VAR_INCLURE) {
+		if (defined('_VAR_INCLURE') && _VAR_INCLURE) {
 			$page['sourcefile'] = $sourcefile;
 			$page['texte'] =
 				"<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>'
@@ -212,7 +212,7 @@ function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) {
 	$line = 0;
 	foreach ($contexte as $var => $val) {
 		$line++;
-		if ($max_lines and $max_lines < $line) {
+		if ($max_lines && $max_lines < $line) {
 			$infos[] = '…';
 			break;
 		}
@@ -225,7 +225,7 @@ function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) {
 				$val = 'array:' . count($val);
 			}
 		} elseif (is_object($val)) {
-			$val = get_class($val);
+			$val = $val::class;
 		} elseif (strlen("$val") > 30) {
 			$val = substr("$val", 0, 29) . '…';
 			if (strstr($val, ' ')) {
@@ -238,7 +238,7 @@ function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) {
 		}
 		$infos[] = $var . '=' . $val;
 	}
-	return join(', ', $infos);
+	return implode(', ', $infos);
 }
 
 
@@ -277,8 +277,8 @@ function tester_redirection($fond, $contexte, $connect) {
 function public_tester_redirection_dist($fond, $contexte, $connect) {
 	if (
 		$fond == 'article'
-		and !empty($contexte['id_article'])
-		and $id_article = intval($contexte['id_article'])
+		&& !empty($contexte['id_article'])
+		&& ($id_article = (int) $contexte['id_article'])
 	) {
 		include_spip('public/quete'); // pour quete_virtuel et ses dependances
 		$m = quete_virtuel($id_article, $connect) ?? '';
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index 46b37469cf..ed9b993c78 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -85,7 +85,7 @@ function phraser_inclure($texte, $ligne, $result) {
 		$fichier = $match[2];
 		# assurer ici la migration .php3 => .php
 		# et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
-		if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
+		if ($fichier && preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
 			$fichier = $r[1];
 		}
 		$champ->texte = ($fichier !== 'page.php') ? $fichier : '';
@@ -93,7 +93,7 @@ function phraser_inclure($texte, $ligne, $result) {
 		// on assimile {var=val} a une liste de un argument sans fonction
 		$pos_apres = 0;
 		phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
-		if (!$champ->texte or (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
+		if (!$champ->texte || (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
 			if (!function_exists('normaliser_inclure')) {
 				include_spip('public/normaliser');
 			}
@@ -129,7 +129,7 @@ function phraser_polyglotte($texte, $ligne, $result) {
 			$texte = substr($texte, $p + strlen($match[0]));
 			while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
 				$trad = $regs[1];
-				if ($trad or $lang) {
+				if ($trad || $lang) {
 					$champ->traductions[$lang] = $trad;
 				}
 				$lang = $regs[2];
@@ -239,7 +239,7 @@ function phraser_champs($texte, $ligne, $result) {
 		$champ->nom_champ = $match[3];
 		$champ->etoile = $match[5];
 
-		if ($suite and $suite[0] == '{') {
+		if ($suite && $suite[0] == '{') {
 			phraser_arg($suite, '', [], $champ);
 			// ce ltrim est une ereur de conception
 			// mais on le conserve par souci de compatibilite
@@ -275,7 +275,7 @@ function phraser_champs_etendus($texte, $ligne, $result) {
 		return $result;
 	}
 	$sep = '##';
-	while (strpos($texte, (string) $sep) !== false) {
+	while (str_contains($texte, (string) $sep)) {
 		$sep .= '#';
 	}
 
@@ -289,7 +289,6 @@ function phraser_champs_etendus($texte, $ligne, $result) {
  * sert aussi aux arguments des includes et aux criteres de boucles
  * Tres chevelu
  *
- * @param string $texte
  * @param string $fin
  * @param string $sep
  * @param $result
@@ -299,7 +298,7 @@ function phraser_champs_etendus($texte, $ligne, $result) {
  */
 function phraser_args(string $texte, $fin, $sep, $result, &$pointeur_champ, &$pos_debut) {
 	$length = strlen($texte);
-	while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
+	while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
 		$pos_debut++;
 	}
 	while (($pos_debut < $length) && !str_contains($fin, $texte[$pos_debut])) {
@@ -307,7 +306,7 @@ function phraser_args(string $texte, $fin, $sep, $result, &$pointeur_champ, &$po
 		$st = substr($texte, $pos_debut);
 		$result = phraser_arg($st, $sep, $result, $pointeur_champ);
 		$pos_debut = $length - strlen($st);
-		while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
+		while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
 			$pos_debut++;
 		}
 	}
@@ -353,7 +352,7 @@ function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
 			preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
 		} else {
 			preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
-			if (!isset($regs[2]) or !strlen($regs[2])) {
+			if (!isset($regs[2]) || !strlen($regs[2])) {
 				$err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
 				erreur_squelette($err_f, $pointeur_champ);
 				$champ = new Texte();
@@ -422,7 +421,7 @@ function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
 				$result[] = $champ;
 			}
 		}
-		if (isset($args[0]) and $args[0] == ',') {
+		if (isset($args[0]) && $args[0] == ',') {
 			$args = ltrim(substr($args, 1));
 			if ($collecte) {
 				$res[] = $collecte;
@@ -454,7 +453,7 @@ function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
 	$res = [];
 	while (($p = strpos($texte, (string) "%$sep")) !== false) {
-		if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
+		if (!preg_match(',^%' . preg_quote($sep, ',') . '([0-9]+)@,', substr($texte, $p), $m)) {
 			break;
 		}
 		$debut = substr($texte, 0, $p);
@@ -560,7 +559,7 @@ function phraser_vieux(&$champ) {
 				include_spip('public/normaliser');
 			}
 			phraser_vieux_modele($champ);
-		} elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
+		} elseif ($nom == 'INCLURE' || $nom == 'INCLUDE') {
 			if (!function_exists('phraser_vieux_inclu')) {
 				include_spip('public/normaliser');
 			}
@@ -605,15 +604,14 @@ function phraser_criteres($params, &$result) {
 			// plus d'un argument et pas le critere IN:
 			// detecter comme on peut si c'est le critere implicite LIMIT debut, fin
 			if (
-				$var->type != 'texte'
-				or preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
+				$var->type != 'texte' || preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
 			) {
 				$op = ',';
 				$not = false;
 				$cond = false;
 			} else {
 				// Le debut du premier argument est l'operateur
-				preg_match('/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
+				preg_match('/^([!]?)([a-zA-Z]\w*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
 				$op = $m[2];
 				$not = (bool) $m[1];
 				$cond = (bool) $m[3];
@@ -668,7 +666,7 @@ function phraser_criteres($params, &$result) {
 				// les separateurs
 				if ($var->apres) {
 					$result->separateur[] = $param;
-				} elseif (($param == 'tout') or ($param == 'tous')) {
+				} elseif ($param == 'tout' || $param == 'tous') {
 					$result->modificateur['tout'] = true;
 				} elseif ($param == 'plat') {
 					$result->modificateur['plat'] = true;
@@ -681,11 +679,11 @@ function phraser_criteres($params, &$result) {
 				// traités normalement.
 				elseif (
 					strcasecmp($type, 'hierarchie') == 0
-					and !preg_match(",^id_rubrique\b,", $param)
-					and preg_match(',^id_\w+\s*$,', $param)
+					&& !preg_match(",^id_rubrique\b,", $param)
+					&& preg_match(',^id_\w+\s*$,', $param)
 				) {
 					$result->modificateur['tout'] = true;
-				} elseif (strcasecmp($type, 'hierarchie') == 0 and $param == 'id_rubrique') {
+				} elseif (strcasecmp($type, 'hierarchie') == 0 && $param == 'id_rubrique') {
 					// rien a faire sur {id_rubrique} tout seul
 				} else {
 					// pas d'emplacement statique, faut un dynamique
@@ -709,7 +707,7 @@ function phraser_criteres($params, &$result) {
 						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)
 					) {
 						$a2 = trim($m[8]);
-						if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
+						if ($a2 && ($a2[0] == "'" || $a2[0] == '"') && $a2[0] == substr($a2, -1)) {
 							$a2 = substr($a2, 1, -1);
 						}
 						$crit = phraser_critere_infixe(
@@ -833,7 +831,7 @@ function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_t
 		}
 		if (
 			$pos_parent === false
-			or (strlen($id_boucle) and !(is_numeric($id_boucle) or strpos($id_boucle, '_') === 0))
+			|| strlen($id_boucle) && (!is_numeric($id_boucle) && !str_starts_with($id_boucle, '_'))
 		) {
 			$result = new Boucle();
 			$result->id_parent = $id_parent;
@@ -872,7 +870,7 @@ function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_t
 			$pos_precond = strpos($texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
 			if (
 				$pos_precond !== false
-				and $pos_precond < $boucle['debut_boucle']
+				&& $pos_precond < $boucle['debut_boucle']
 			) {
 				$boucle['debut_boucle'] = $pos_precond;
 				$boucle['pos_precond'] = $pos_precond;
@@ -883,7 +881,7 @@ function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_t
 			$pos_preaff = strpos($texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
 			if (
 				$pos_preaff !== false
-				and $pos_preaff < $boucle['debut_boucle']
+				&& $pos_preaff < $boucle['debut_boucle']
 			) {
 				$boucle['debut_boucle'] = $pos_preaff;
 				$boucle['pos_preaff'] = $pos_preaff;
@@ -893,7 +891,7 @@ function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_t
 				$pos_derniere_boucle_anonyme = $pos_boucle;
 			}
 
-			if (is_null($premiere_boucle) or $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
+			if (is_null($premiere_boucle) || $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
 				$premiere_boucle = $boucle;
 			}
 		}
@@ -937,7 +935,7 @@ function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte
 	$pos_apres = strpos($texte, $apres_boucle, $pos_courante);
 	if (
 		$pos_apres !== false
-		and (!$pos_anonyme_next or $pos_apres < $pos_anonyme_next)
+		&& (!$pos_anonyme_next || $pos_apres < $pos_anonyme_next)
 	) {
 		$boucle['pos_postcond'] = $pos_apres;
 		$pos_apres += strlen($apres_boucle);
@@ -952,7 +950,7 @@ function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte
 	$pos_altern = strpos($texte, $altern_boucle, $pos_courante);
 	if (
 		$pos_altern !== false
-		and (!$pos_anonyme_next or $pos_altern < $pos_anonyme_next)
+		&& (!$pos_anonyme_next || $pos_altern < $pos_anonyme_next)
 	) {
 		$boucle['pos_altern'] = $pos_altern;
 		$pos_altern += strlen($altern_boucle);
@@ -967,7 +965,7 @@ function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte
 	$pos_postaff = strpos($texte, $postaff_boucle, $pos_courante);
 	if (
 		$pos_postaff !== false
-		and (!$pos_anonyme_next or $pos_postaff < $pos_anonyme_next)
+		&& (!$pos_anonyme_next || $pos_postaff < $pos_anonyme_next)
 	) {
 		$boucle['pos_postaff'] = $pos_postaff;
 		$pos_postaff += strlen($postaff_boucle);
@@ -987,11 +985,11 @@ function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte
 function phraser_boucle_placeholder(&$champ, $boucle_placeholder = null, $boucle = null) {
 	static $boucles_connues = [];
 	// si c'est un appel pour memoriser une boucle, memorisons la
-	if (is_string($champ) and !empty($boucle_placeholder) and !empty($boucle)) {
+	if (is_string($champ) && !empty($boucle_placeholder) && !empty($boucle)) {
 		$boucles_connues[$boucle_placeholder][$champ] = &$boucle;
 	}
 	else {
-		if (!empty($champ->nom_champ) and !empty($boucles_connues[$champ->nom_champ])) {
+		if (!empty($champ->nom_champ) && !empty($boucles_connues[$champ->nom_champ])) {
 			$placeholder = $champ->nom_champ;
 			$id = reset($champ->param[0][1]);
 			$id = $id->texte;
@@ -1026,7 +1024,7 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_
 	if (is_null($boucle_placeholder)) {
 		do {
 			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
-		} while (strpos($texte, $boucle_placeholder) !== false);
+		} while (str_contains($texte, $boucle_placeholder));
 	}
 
 	$ligne_debut_initial = $ligne_debut_texte;
@@ -1074,8 +1072,8 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_
 
 		if (
 			!preg_match(SPEC_BOUCLE, $texte, $match, 0, $pos_milieu)
-			or ($pos_match = strpos($texte, (string) $match[0], $pos_milieu)) === false
-			or $pos_match > $pos_milieu
+			|| ($pos_match = strpos($texte, (string) $match[0], $pos_milieu)) === false
+			|| $pos_match > $pos_milieu
 		) {
 			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
 			erreur_squelette($err_b, $result);
@@ -1145,7 +1143,7 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_
 				do {
 					while (
 						$nb_close < $nb_open
-						and $p = strpos($texte, $fin_boucle, $pos_fin + 1)
+						&& ($p = strpos($texte, $fin_boucle, $pos_fin + 1))
 					) {
 						$nb_close++;
 						$pos_fin = $p;
@@ -1155,13 +1153,13 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_
 						break;
 					}
 					while (
-						$p = strpos($texte, $search_debut_boucle, $search_from)
-						and $p < $pos_fin
+						($p = strpos($texte, $search_debut_boucle, $search_from))
+						&& $p < $pos_fin
 					) {
 						$nb_open++;
 						$search_from = $p + 1;
 					}
-				} while ($nb_close < $nb_open and $maxiter++ < 5);
+				} while ($nb_close < $nb_open && $maxiter++ < 5);
 
 				$pos_courante = $pos_fin + strlen($fin_boucle);
 			}
@@ -1279,7 +1277,5 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_
 		$pos_debut_texte = $pos_courante;
 	}
 
-	$all_res = phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
-
-	return $all_res;
+	return phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
 }
diff --git a/ecrire/public/quete.php b/ecrire/public/quete.php
index be97dda63d..37d1e9a5c4 100644
--- a/ecrire/public/quete.php
+++ b/ecrire/public/quete.php
@@ -35,7 +35,7 @@ function quete_virtuel($id_article, $connect) {
 	return sql_getfetsel(
 		'virtuel',
 		'spip_articles',
-		['id_article=' . intval($id_article), "statut='publie'"],
+		['id_article=' . (int) $id_article, "statut='publie'"],
 		'',
 		'',
 		'',
@@ -65,7 +65,7 @@ function quete_parent_lang($table, $id, string $connect = '') {
 				!$desc = $trouver_table(
 					$table,
 					$connect
-				) or !isset($desc['field']['id_rubrique'])
+				) || !isset($desc['field']['id_rubrique'])
 			) {
 				// pas de parent rubrique, on passe
 				$cache_quete[$connect][$table]['_select'] = false;
@@ -80,7 +80,7 @@ function quete_parent_lang($table, $id, string $connect = '') {
 			$cache_quete[$connect][$table][$id] = sql_fetsel(
 				$cache_quete[$connect][$table]['_select'],
 				$table,
-				$cache_quete[$connect][$table]['_id'] . '=' . intval($id),
+				$cache_quete[$connect][$table]['_id'] . '=' . (int) $id,
 				'',
 				'',
 				'',
@@ -107,7 +107,7 @@ function quete_parent_lang($table, $id, string $connect = '') {
  * @return int
  */
 function quete_parent($id_rubrique, string $connect = '') {
-	if (!$id_rubrique = intval($id_rubrique)) {
+	if (!$id_rubrique = (int) $id_rubrique) {
 		return 0;
 	}
 	$id_parent = quete_parent_lang('spip_rubriques', $id_rubrique, $connect);
@@ -139,7 +139,6 @@ function quete_rubrique($id_article, $serveur) {
  * @uses quete_parent()
  *
  * @param int $id
- * @param string $connect
  * @return int
  */
 function quete_profondeur($id, string $connect = '') {
@@ -165,13 +164,13 @@ function quete_profondeur($id, string $connect = '') {
  *     Morceau de la requête SQL testant la date
  */
 function quete_condition_postdates($champ_date, $serveur = '', $ignore_previsu = false) {
-	if (defined('_VAR_PREVIEW') and _VAR_PREVIEW and !$ignore_previsu) {
+	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
 		return '1=1';
 	}
 
 	return
 		(isset($GLOBALS['meta']['date_prochain_postdate'])
-			and $GLOBALS['meta']['date_prochain_postdate'] > time())
+			&& $GLOBALS['meta']['date_prochain_postdate'] > time())
 			? "$champ_date<" . sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur)
 			: '1=1';
 }
@@ -201,11 +200,11 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign
 	}
 
 	$liste_statuts = $publie;
-	if (defined('_VAR_PREVIEW') and _VAR_PREVIEW and !$ignore_previsu) {
+	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
 		$liste_statuts = $previsu;
 	}
 	$not = false;
-	if (strncmp($liste_statuts, '!', 1) == 0) {
+	if (str_starts_with($liste_statuts, '!')) {
 		$not = true;
 		$liste_statuts = substr($liste_statuts, 1);
 	}
@@ -219,17 +218,17 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign
 	foreach ($liste_statuts as $k => $v) {
 		// filtrage /auteur pour limiter les objets d'un statut (prepa en general)
 		// a ceux de l'auteur identifie
-		if (strpos($v, '/') !== false) {
+		if (str_contains($v, '/')) {
 			$v = explode('/', $v);
 			$filtre = end($v);
 			$v = reset($v);
 			$v = preg_replace(',\W,', '', $v);
 			if (
 				$filtre == 'auteur'
-				and (strpos($mstatut, '.') !== false)
-				and $objet = explode('.', $mstatut)
-				and $id_table = reset($objet)
-				and $objet = objet_type($id_table)
+				&& str_contains($mstatut, '.')
+				&& ($objet = explode('.', $mstatut))
+				&& ($id_table = reset($objet))
+				&& ($objet = objet_type($id_table))
 			) {
 				$w = "$mstatut<>" . sql_quote($v);
 
@@ -239,7 +238,7 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign
 				if ($desc = decrire_token_previsu()) {
 					$id_auteur = $desc['id_auteur'];
 				} elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
-					$id_auteur = intval($GLOBALS['visiteur_session']['id_auteur']);
+					$id_auteur = (int) $GLOBALS['visiteur_session']['id_auteur'];
 				} else {
 					$id_auteur = null;
 				}
@@ -254,7 +253,7 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign
 						$where[] = "($w OR $id_table.$primary IN (" . sql_get_select(
 							'ssss.id_objet',
 							'spip_auteurs_liens AS ssss',
-							'ssss.objet=' . sql_quote($objet) . ' AND ssss.id_auteur=' . intval($id_auteur),
+							'ssss.objet=' . sql_quote($objet) . ' AND ssss.id_auteur=' . (int) $id_auteur,
 							'',
 							'',
 							'',
@@ -298,7 +297,7 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign
  * @return array|bool|null
  */
 function quete_fichier($id_document, $serveur = '') {
-	return sql_getfetsel('fichier', 'spip_documents', ('id_document=' . intval($id_document)), '', [], '', '', $serveur);
+	return sql_getfetsel('fichier', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
 }
 
 /**
@@ -309,7 +308,7 @@ function quete_fichier($id_document, $serveur = '') {
  * @return array|bool
  */
 function quete_document($id_document, $serveur = '') {
-	return sql_fetsel('*', 'spip_documents', ('id_document=' . intval($id_document)), '', [], '', '', $serveur);
+	return sql_fetsel('*', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
 }
 
 /**
@@ -365,12 +364,7 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag = false) {
 				// Si on a déjà demandé un survol directement ($onoff = off)
 				// ou qu'on a demandé uniquement le normal ($onoff = on)
 				// alors on ne cherche pas du tout le survol ici
-				if ($onoff != 'ON') {
-					$off = '';
-				} else {
-					// Sinon, c'est qu'on demande normal ET survol à la fois, donc on cherche maintenant le survol
-					$off = quete_logo_objet($id, $objet, 'off');
-				}
+				$off = $onoff != 'ON' ? '' : quete_logo_objet($id, $objet, 'off');
 
 				// on retourne une url du type IMG/artonXX?timestamp
 				// qui permet de distinguer le changement de logo
@@ -378,7 +372,7 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag = false) {
 				$res = [
 					$on['chemin'] . ($on['timestamp'] ? "?{$on['timestamp']}" : ''),
 					($off ? $off['chemin'] . ($off['timestamp'] ? "?{$off['timestamp']}" : '') : ''),
-					(!$taille ? '' : (' ' . $taille[3]))
+					($taille ? ' ' . $taille[3] : (''))
 				];
 				$res['src'] = $res[0];
 				$res['logo_on'] = $res[0];
@@ -403,7 +397,7 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag = false) {
 					$id = $id_rubrique;
 					$id_rubrique = 0;
 				} else {
-					if ($id and $cle_objet == 'id_rubrique') {
+					if ($id && $cle_objet == 'id_rubrique') {
 						$id = quete_parent($id);
 					} else {
 						return '';
@@ -487,8 +481,8 @@ function quete_logo_file($row, $connect = null) {
 	// si c'est une vignette type doc, la renvoyer direct
 	if (
 		strcmp($logo, _DIR_PLUGINS) == 0
-		or strcmp($logo, _DIR_PLUGINS_DIST) == 0
-		or strcmp($logo, _DIR_RACINE . 'prive/') == 0
+		|| strcmp($logo, _DIR_PLUGINS_DIST) == 0
+		|| strcmp($logo, _DIR_RACINE . 'prive/') == 0
 	) {
 		return $logo;
 	}
@@ -527,7 +521,7 @@ function quete_logo_document($row, $lien, $align, $mode_logo, $x, $y, string $co
 		$logo = vignette_logo_document($row, $connect);
 	}
 	// si on veut explicitement la vignette, ne rien renvoyer si il n'y en a pas
-	if ($mode_logo == 'vignette' and !$logo) {
+	if ($mode_logo == 'vignette' && !$logo) {
 		return '';
 	}
 	if ($mode_logo == 'icone') {
@@ -595,12 +589,11 @@ function document_spip_externe($fichier, $connect) {
  * ou vide si pas de vignette
  *
  * @param array $row
- * @param string $connect
  * @return string
  */
 function vignette_logo_document($row, string $connect = '') {
 
-	if (!$row or empty($row['id_vignette'])) {
+	if (!$row || empty($row['id_vignette'])) {
 		return '';
 	}
 	$fichier = quete_fichier($row['id_vignette'], $connect);
@@ -609,7 +602,7 @@ function vignette_logo_document($row, string $connect = '') {
 	}
 
 	$f = get_spip_doc($fichier);
-	if ($f and @file_exists($f)) {
+	if ($f && @file_exists($f)) {
 		return $f;
 	}
 	if ($row['mode'] !== 'vignette') {
@@ -628,7 +621,6 @@ function vignette_logo_document($row, string $connect = '') {
  * @param array $reference
  * @param int $parent
  * @param string $type
- * @param string $connect
  * @return bool|string
  */
 function calcul_exposer($id, $prim, $reference, $parent, $type, string $connect = '') {
@@ -650,7 +642,7 @@ function calcul_exposer($id, $prim, $reference, $parent, $type, string $connect
 					if (
 						isset($reference[$t])
 						// cas de la reference donnee dynamiquement par la pagination
-						or isset($reference["@$t"])
+						|| isset($reference["@$t"])
 					) {
 						$type = $t;
 						$principal = $reference[$type] ?? $reference["@$type"];
@@ -666,7 +658,7 @@ function calcul_exposer($id, $prim, $reference, $parent, $type, string $connect
 				$exposer[$m][$type][$principal] = true;
 				if ($type == 'id_mot') {
 					if (!$parent) {
-						$parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . intval($principal), '', '', '', '', $connect);
+						$parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . (int) $principal, '', '', '', '', $connect);
 					}
 					if ($parent) {
 						$exposer[$m]['id_groupe'][$parent] = true;
@@ -708,16 +700,16 @@ function calcul_exposer($id, $prim, $reference, $parent, $type, string $connect
 function quete_debut_pagination($primary, $valeur, $pas, $iter) {
 	// on ne devrait pas arriver ici si la cle primaire est inexistante
 	// ou composee, mais verifions
-	if (!$primary or preg_match('/[,\s]/', $primary)) {
+	if (!$primary || preg_match('/[,\s]/', $primary)) {
 		return 0;
 	}
 
 	$pos = 0;
-	while ($row = $iter->fetch() and $row[$primary] != $valeur) {
+	while (($row = $iter->fetch()) && $row[$primary] != $valeur) {
 		$pos++;
 	}
 	// si on a pas trouve
-	if (!$row or $row[$primary] != $valeur) {
+	if (!$row || $row[$primary] != $valeur) {
 		return 0;
 	}
 
@@ -729,15 +721,11 @@ function quete_debut_pagination($primary, $valeur, $pas, $iter) {
  * Retourne true si ce where doit être appliqué,
  * dans le cas des critères avec ? tel que `{id_article ?}`
  *
- * @param mixed $value
  * @return boolean
  */
-function is_whereable($value): bool {
+function is_whereable(mixed $value): bool {
 	if (is_array($value) && count($value)) {
 		return true;
 	}
-	if (is_scalar($value) && strlen($value)) {
-		return true;
-	}
-	return false;
+ 	return is_scalar($value) && strlen($value);
 }
diff --git a/ecrire/public/sandbox.php b/ecrire/public/sandbox.php
index 7362119818..aaf0085474 100644
--- a/ecrire/public/sandbox.php
+++ b/ecrire/public/sandbox.php
@@ -40,9 +40,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
  *     texte
  */
 function sandbox_composer_texte($texte, &$p) {
-	$code = "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
-
-	return $code;
+	return "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
 }
 
 
@@ -67,13 +65,9 @@ function sandbox_composer_filtre($fonc, $code, $arglist, &$p, $nb_arg_droite = 1
 	elseif ($f = chercher_filtre($fonc)) {
 		// cas particulier : le filtre |set doit acceder a la $Pile
 		// proto: filtre_set(&$Pile, $val, $args...)
-		if (strpbrk($f, ':')) { // Class::method
-			$refl = new ReflectionMethod($f);
-		} else {
-			$refl = new ReflectionFunction($f);
-		}
+		$refl = strpbrk($f, ':') ? new ReflectionMethod($f) : new ReflectionFunction($f);
 		$refs = $refl->getParameters();
-		if (isset($refs[0]) and $refs[0]->name == 'Pile') {
+		if (isset($refs[0]) && $refs[0]->name == 'Pile') {
 			$code = "$f(\$Pile,$code$arglist)";
 			$nb_arg_gauche = 2; // la balise à laquelle s'applique le filtre + $Pile
 		} else {
@@ -118,11 +112,7 @@ else {
 function sandbox_composer_inclure_php($fichier, &$p, $_contexte) {
 	$compil = texte_script(memoriser_contexte_compil($p));
 	// si inexistant, on essaiera a l'execution
-	if ($path = find_in_path($fichier)) {
-		$path = "\"$path\"";
-	} else {
-		$path = "find_in_path(\"$fichier\")";
-	}
+	$path = ($path = find_in_path($fichier)) ? "\"$path\"" : "find_in_path(\"$fichier\")";
 
 	return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
 }
@@ -139,7 +129,7 @@ function sandbox_composer_interdire_scripts($code, &$p) {
 	// Securite
 	if (
 		$p->interdire_scripts
-		and $p->etoile != '**'
+		&& $p->etoile != '**'
 	) {
 		if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) {
 			$code = "interdire_scripts($code)";
@@ -183,7 +173,7 @@ function sandbox_filtrer_squelette($skel, $corps, $filtres) {
 	foreach ($series_filtres as $filtres) {
 		if (is_countable($filtres) ? count($filtres) : 0) {
 			foreach ($filtres as $filtre) {
-				if ($filtre and $f = chercher_filtre($filtre)) {
+				if ($filtre && ($f = chercher_filtre($filtre))) {
 					$corps = $f($corps);
 				}
 			}
diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php
index 5808092c6f..85a4bcf21c 100644
--- a/ecrire/public/styliser.php
+++ b/ecrire/public/styliser.php
@@ -42,11 +42,11 @@ function public_styliser_dist($fond, $contexte, $lang = '', string $connect = ''
 
 	// s'assurer que le fond est licite
 	// car il peut etre construit a partir d'une variable d'environnement
-	if (strpos($fond, '../') !== false or strncmp($fond, '/', 1) == 0) {
+	if (str_contains($fond, '../') || str_starts_with($fond, '/')) {
 		$fond = '404';
 	}
 
-	if (strncmp($fond, 'modeles/', 8) == 0) {
+	if (str_starts_with($fond, 'modeles/')) {
 		$modele = substr($fond, 8);
 		$modele = styliser_modele($modele, null, $contexte);
 		$fond = "modeles/$modele";
@@ -78,7 +78,7 @@ function public_styliser_dist($fond, $contexte, $lang = '', string $connect = ''
 		'data' => $squelette['fond'],
 	];
 
-	if (test_espace_prive() or defined('_ZPIP')) {
+	if (test_espace_prive() || defined('_ZPIP')) {
 		if (!$styliser_par_z) {
 			$styliser_par_z = charger_fonction('styliser_par_z', 'public');
 		}
@@ -111,11 +111,11 @@ function public_styliser_dist($fond, $contexte, $lang = '', string $connect = ''
 function styliser_par_objets($flux) {
 	if (
 		test_espace_prive()
-		and !$squelette = $flux['data']
-		and strncmp($flux['args']['fond'], 'prive/objets/', 13) == 0
-		and $echafauder = charger_fonction('echafauder', 'prive', true)
+		&& !($squelette = $flux['data'])
+		&& str_starts_with($flux['args']['fond'], 'prive/objets/')
+		&& ($echafauder = charger_fonction('echafauder', 'prive', true))
 	) {
-		if (strncmp($flux['args']['fond'], 'prive/objets/liste/', 19) == 0) {
+		if (str_starts_with($flux['args']['fond'], 'prive/objets/liste/')) {
 			$table = table_objet(substr($flux['args']['fond'], 19));
 			$table_sql = table_objet_sql($table);
 			$objets = lister_tables_objets_sql();
@@ -123,7 +123,7 @@ function styliser_par_objets($flux) {
 				$flux['data'] = $echafauder($table, $table, $table_sql, 'prive/objets/liste/objets', $flux['args']['ext']);
 			}
 		}
-		if (strncmp($flux['args']['fond'], 'prive/objets/contenu/', 21) == 0) {
+		if (str_starts_with($flux['args']['fond'], 'prive/objets/contenu/')) {
 			$type = substr($flux['args']['fond'], 21);
 			$table = table_objet($type);
 			$table_sql = table_objet_sql($table);
@@ -147,7 +147,7 @@ function styliser_par_objets($flux) {
  *
  * @staticvar array $liste_objets
  * @param array $contexte
- * @return array
+ * @return array|false
  */
 function quete_rubrique_fond($contexte) {
 	static $liste_objets = null;
@@ -168,7 +168,7 @@ function quete_rubrique_fond($contexte) {
 		}
 	}
 	$c = array_intersect_key($contexte, $liste_objets);
-	if (!count($c)) {
+	if ($c === []) {
 		return false;
 	}
 
@@ -178,18 +178,15 @@ function quete_rubrique_fond($contexte) {
 		return $quete[$s];
 	}
 
-	if (isset($c['id_rubrique']) and $r = $c['id_rubrique']) {
+	if (isset($c['id_rubrique']) && ($r = $c['id_rubrique'])) {
 		unset($c['id_rubrique']);
 		$c = ['id_rubrique' => $r] + $c;
 	}
 
 	foreach ($c as $_id => $id) {
-		if (
-			$id
-			and $row = quete_parent_lang(table_objet_sql($liste_objets[$_id]), $id)
-		) {
+		if ($id && ($row = quete_parent_lang(table_objet_sql($liste_objets[$_id]), $id))) {
 			$lang = $row['lang'] ?? '';
-			if ($_id == 'id_rubrique' or (isset($row['id_rubrique']) and $id = $row['id_rubrique'])) {
+			if ($_id == 'id_rubrique' || isset($row['id_rubrique']) && ($id = $row['id_rubrique'])) {
 				return $quete[$s] = [$id, $lang];
 			}
 		}
diff --git a/ecrire/public/styliser_par_z.php b/ecrire/public/styliser_par_z.php
index 5306e3d2c3..fd4821280b 100644
--- a/ecrire/public/styliser_par_z.php
+++ b/ecrire/public/styliser_par_z.php
@@ -63,20 +63,20 @@ function public_styliser_par_z_dist($flux) {
 
 	$fond = $flux['args']['fond'];
 
-	if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) {
+	if ($prepend || strncmp($fond, $prefix_path, $prefix_length) == 0) {
 		$fond = substr($fond, $prefix_length);
 		$squelette = $flux['data'];
 		$ext = $flux['args']['ext'];
 		// Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
 		if (
 			defined('_Z_AJAX_PARALLEL_LOAD_OK')
-			and $dir = explode('/', $fond)
-			and count($dir) == 2 // pas un sous repertoire
-			and $dir = reset($dir)
-			and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
-			and defined($apl_constant)
-			and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
-			and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL
+			&& ($dir = explode('/', $fond))
+			&& count($dir) == 2 // pas un sous repertoire
+			&& ($dir = reset($dir))
+			&& in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
+			&& defined($apl_constant)
+			&& in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
+			&& ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
 		) {
 			$flux['data'] = $pipe;
 
@@ -84,7 +84,7 @@ function public_styliser_par_z_dist($flux) {
 		}
 
 		// surcharger aussi les squelettes venant de squelettes-dist/
-		if ($squelette and !z_fond_valide($squelette)) {
+		if ($squelette && !z_fond_valide($squelette)) {
 			$squelette = '';
 			$echafauder = '';
 		}
@@ -101,12 +101,9 @@ function public_styliser_par_z_dist($flux) {
 		if (!$squelette) {
 			// si on est sur un ?page=XX non trouve
 			if (
-				(isset($flux['args']['contexte'][$page])
-					and $flux['args']['contexte'][$page] == $fond)
-				or (isset($flux['args']['contexte']['type-page'])
-					and $flux['args']['contexte']['type-page'] == $fond)
-				or ($fond == 'sommaire'
-					and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page]))
+				isset($flux['args']['contexte'][$page]) && $flux['args']['contexte'][$page] == $fond
+				|| isset($flux['args']['contexte']['type-page']) && $flux['args']['contexte']['type-page'] == $fond
+				|| $fond == 'sommaire' && (!isset($flux['args']['contexte'][$page]) || !$flux['args']['contexte'][$page])
 			) {
 				// si on est sur un ?page=XX non trouve
 				// se brancher sur contenu/xx si il existe
@@ -125,7 +122,7 @@ function public_styliser_par_z_dist($flux) {
 			// generer un fond automatique a la volee pour les webmestres
 			elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) {
 				$type = substr($fond, strlen($z_contenu) + 1);
-				if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
+				if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
 					$type = $flux['args']['contexte'][$page];
 				}
 				if (!isset($disponible[$type])) {
@@ -135,11 +132,11 @@ function public_styliser_par_z_dist($flux) {
 					$flux['data'] = $disponible[$type];
 				} elseif (
 					$echafauder
-					and include_spip('inc/autoriser')
-					and isset($GLOBALS['visiteur_session']['statut']) // performance
-					and autoriser('echafauder', $type)
-					and $is = $disponible[$type]
-					and is_array($is)
+					&& include_spip('inc/autoriser')
+					&& isset($GLOBALS['visiteur_session']['statut'])
+					&& autoriser('echafauder', $type)
+					&& ($is = $disponible[$type])
+					&& is_array($is)
 				) {
 					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
 				} else {
@@ -158,19 +155,19 @@ function public_styliser_par_z_dist($flux) {
 			// se rabbatre sur le dist.html du bloc concerne
 			else {
 				if (
-					$dir = explode('/', $fond)
-					and $dir = reset($dir)
-					and $dir !== $z_contenu
-					and in_array($dir, $z_blocs)
+					($dir = explode('/', $fond))
+					&& ($dir = reset($dir))
+					&& $dir !== $z_contenu
+					&& in_array($dir, $z_blocs)
 				) {
 					$type = substr($fond, strlen("$dir/"));
-					if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
+					if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
 						$type = $flux['args']['contexte'][$page];
 					}
-					if ($type !== 'page' and !isset($disponible[$type])) {
+					if ($type !== 'page' && !isset($disponible[$type])) {
 						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
 					}
-					if ($type == 'page' or $disponible[$type]) {
+					if ($type == 'page' || $disponible[$type]) {
 						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
 					}
 				}
@@ -182,33 +179,31 @@ function public_styliser_par_z_dist($flux) {
 		// body-sommaire.html
 		// pour des raisons de perfo, les declinaisons doivent etre dans le
 		// meme dossier que body.html
-		if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) {
+		if ($fond == 'body' && str_ends_with($squelette, $fond)) {
 			if (
 				isset($flux['args']['contexte']['type-page'])
-				and (
-					(isset($flux['args']['contexte']['composition'])
-						and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext"))
-					or
-					file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
+				&& (
+					isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
+					|| file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
 				)
 			) {
 				$flux['data'] = $f;
 			}
 		} elseif (
 			$fond == 'structure'
-			and z_sanitize_var_zajax()
-			and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext")
+			&& z_sanitize_var_zajax()
+			&& ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
 		) {
 			$flux['data'] = substr($f, 0, -strlen(".$ext"));
 		} // chercher le fond correspondant a la composition
 		elseif (
 			isset($flux['args']['contexte']['composition'])
-			and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond))
-			and $dir = substr($fond, $prefix_length)
-			and $dir = explode('/', $dir)
-			and $dir = reset($dir)
-			and in_array($dir, $z_blocs)
-			and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext")
+			&& (basename($fond) == 'page' || $squelette && str_ends_with($squelette, $fond))
+			&& ($dir = substr($fond, $prefix_length))
+			&& ($dir = explode('/', $dir))
+			&& ($dir = reset($dir))
+			&& in_array($dir, $z_blocs)
+			&& ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
 		) {
 			$flux['data'] = substr($f, 0, -strlen(".$ext"));
 		}
@@ -267,15 +262,9 @@ function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder
  * @return bool
  *   `true` si on peut l'utiliser, `false` sinon.
  **/
-function z_fond_valide($squelette) {
-	if (
-		!_ZCORE_EXCLURE_PATH
-		or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette)
-	) {
-		return true;
-	}
-
-	return false;
+function z_fond_valide($squelette)
+{
+    return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
 }
 
 /**
@@ -294,8 +283,8 @@ function z_fond_valide($squelette) {
  */
 function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) {
 	if (
-		(defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f))
-		or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f))
+		defined('_ZCORE_BLOC_PREFIX_SKEL') && ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")) && z_fond_valide($f)
+		|| ($f = find_in_path("$prefix_path$bloc/$fond.$ext")) && z_fond_valide($f)
 	) {
 		return substr($f, 0, -strlen(".$ext"));
 	}
@@ -331,7 +320,7 @@ function z_echafaudable($type) {
 			// peut etre c'est un exec=types qui liste tous les objets "type"
 			if (
 				($t = objet_type($type, false)) !== $type
-				and $e = trouver_objet_exec($t)
+				&& ($e = trouver_objet_exec($t))
 			) {
 				return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
 			}
@@ -386,17 +375,13 @@ function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) {
 		} else {
 			$trouver_table = charger_fonction('trouver_table', 'base');
 			$desc = $trouver_table($table_sql);
-			if (isset($desc['field']['id_rubrique'])) {
-				$fond = 'objet_edit';
-			} else {
-				$fond = 'objet_edit.sans_rubrique';
-			}
+			$fond = isset($desc['field']['id_rubrique']) ? 'objet_edit' : 'objet_edit.sans_rubrique';
 		}
 		$dir = z_blocs(test_espace_prive());
 		$dir = reset($dir);
 		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>';
 	} // page objets
-	elseif ($type = $desc_exec and !str_contains($type, '/')) {
+	elseif (($type = $desc_exec) && !str_contains($type, '/')) {
 		$dir = z_blocs(test_espace_prive());
 		$dir = reset($dir);
 		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
@@ -428,7 +413,7 @@ function z_sanitize_var_zajax() {
 	}
 	if (
 		!$z_blocs = z_blocs(test_espace_prive())
-		or !in_array($z_ajax, $z_blocs)
+		|| !in_array($z_ajax, $z_blocs)
 	) {
 		set_request('var_zajax'); // enlever cette demande incongrue
 		$z_ajax = false;
diff --git a/ecrire/public/tracer.php b/ecrire/public/tracer.php
index ee0651fd58..b9ceccd244 100644
--- a/ecrire/public/tracer.php
+++ b/ecrire/public/tracer.php
@@ -15,8 +15,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 
 function trace_query_start() {
 	static $trace = '?';
-	if ($trace === '?' or defined('_DEBUG_TRACE_QUERIES')) {
-		if (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES) {
+	if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) {
+		if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
 			$trace = true;
 		}
 		else {
@@ -24,14 +24,14 @@ function trace_query_start() {
 				// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
 				// car ici on ne sait pas si c'est un hit anonyme
 				// ou une requete SQL faite avant chargement de la session
-				$trace = (!empty($_GET['var_profile']) ? '?' : false);
+				$trace = (empty($_GET['var_profile']) ? false : '?');
 			}
 			else {
 				include_spip('inc/autoriser');
 				// gare au bouclage sur calcul de droits au premier appel
 				// A fortiori quand on demande une trace
 				$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
-				$trace = (!empty($_GET['var_profile']) and autoriser('debug'));
+				$trace = (!empty($_GET['var_profile']) && autoriser('debug'));
 			}
 		}
 	}
@@ -46,14 +46,14 @@ function trace_query_end($query, $start, $result, $erreur, $serveur = '') {
 			// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
 			// car ici on ne sait pas si c'est un hit anonyme
 			// ou une requete SQL faite avant chargement de la session
-			$trace = (!empty($_GET['var_profile']) ? '?' : false);
+			$trace = (empty($_GET['var_profile']) ? false : '?');
 		}
 		else {
 			include_spip('inc/autoriser');
 			// gare au bouclage sur calcul de droits au premier appel
 			// A fortiori quand on demande une trace
 			$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
-			$trace = (!empty($_GET['var_profile']) and autoriser('debug'));
+			$trace = (!empty($_GET['var_profile']) && autoriser('debug'));
 		}
 	}
 	if ($start) {
@@ -67,7 +67,7 @@ function trace_query_end($query, $start, $result, $erreur, $serveur = '') {
 		}
 	}
 	// tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
-	if ($trace and $erreur and !preg_match('/^select\b/i', $query)) {
+	if ($trace && $erreur && !preg_match('/^select\b/i', $query)) {
 		erreur_squelette([sql_errno($serveur), $erreur, $query]);
 	}
 
@@ -81,7 +81,7 @@ function trace_query_chrono($dt, $query, $result, $serveur = '') {
 	$x = _request('var_mode_objet');
 	if (isset($GLOBALS['debug']['aucasou'])) {
 		[, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou'];
-		if ($x and !preg_match("/$boucle\$/", $x)) {
+		if ($x && !preg_match("/$boucle\$/", $x)) {
 			return;
 		}
 		if ($serveur) {
@@ -100,7 +100,7 @@ function trace_query_chrono($dt, $query, $result, $serveur = '') {
 
 	$q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
 	$e = sql_explain($query, $serveur);
-	$r = str_replace('Resource id ', '', (is_object($result) ? get_class($result) : $result));
+	$r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result));
 	$GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
 }
 
@@ -145,7 +145,7 @@ function chrono_requete($temps) {
 			. "<tr><th>Time</th><td>$dt</td></tr>"
 			. "<tr><th>Order</th><td>$nb</td></tr>"
 			. "<tr><th>Res</th><td>$res</td></tr>"
-			. join('', $explain)
+			. implode('', $explain)
 			. '</table>';
 
 		$temps[$key] = [$e, $env, $k];
@@ -180,13 +180,13 @@ function chrono_requete($temps) {
 	// Fabriquer le tableau des liens de navigation dans le grand tableau
 	foreach ($d as $k => $v) {
 		$d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
-			. join('', $t[$k]);
+			. implode('', $t[$k]);
 	}
 
 	$navigation = [
 		_T('zbug_statistiques'),
 		'<tr><td>'
-		. join("</td></tr>\n<tr><td>", $d)
+		. implode("</td></tr>\n<tr><td>", $d)
 		. "</td></tr>\n"
 		. (# _request('var_mode_objet') ? '' :
 		('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
-- 
GitLab