/home/<utilisateur>/pix-flow.com/public_html. Rends le PHP tolérant : teste aussi home + chemin.Mini-formation · tiré de ~25 conversations
Comment tu pilotes des sites WordPress par script : un fichier PHP qui lance WP-CLI, appelé par n8n, pour installer, mettre à jour et nettoyer chaque site, plus les erreurs de chemin et de fichiers que tu as croisées.
WP-CLI exécute des commandes WordPress en ligne de commande. Sur ton hébergement mutualisé, tu n'as pas toujours de SSH pratique : tu as donc déposé un fichier `auto.php` qui reçoit une requête, vérifie une clé, choisit la commande dans une liste blanche et lance wp ... avec shell_exec() dans le bon dossier. n8n appelle ce fichier avec ma_fonction_wpcli=<action> et un wp_path par site.
wp_path change d'un appel à l'autre.<?php
if (!hash_equals($cle_attendue, $_REQUEST['key'] ?? '')) { http_response_code(403); exit; }
$commandes = [
'update_plugins' => 'plugin update --all',
'update_core' => 'core update',
'status' => 'core check-update',
];
$cmd = $_REQUEST['ma_fonction_wpcli'] ?? '';
if (!isset($commandes[$cmd])) { http_response_code(400); exit('Commande non autorisée'); }
$sortie = shell_exec(sprintf('cd %s && /usr/local/bin/wp %s 2>&1',
escapeshellarg($wp_path), $commandes[$cmd]));escapeshellarg() sur chaque valeur venant de la requête.ob_clean(), header('Content-Type: application/json'), display_errors à 0, sinon n8n reçoit du HTML et casse.Pourquoi passer par une liste blanche de commandes ?
Créer base, utilisateur et domaine via l'API cPanel (o2switch).
Téléverser et extraire WordPress (FTP ou API Fileman).
wp core download --locale=fr_FR si les fichiers ne sont pas déjà posés.
wp config create avec nom de base, utilisateur, mot de passe, hôte.
wp core install avec l'URL, le titre et le compte administrateur.
Thème et plugins depuis tes ZIP locaux, puis réglages (permaliens…).
| Action n8n | Commande WP-CLI |
|---|---|
wp_get_version | core version |
wp_get_statut | core check-update |
wp_update | core update |
wp_get_permalien / wp_update_permalien | option get|update permalink_structure |
wp_restore | db import %s |
wp_core_download, wp_config_create, wp_core_install | core download, config create, core install |
/home/<utilisateur>/pix-flow.com/public_html. Rends le PHP tolérant : teste aussi home + chemin.wp_path).ls <wp_path>/wp-config.php côté serveur.site_path (/public_html selon la racine FTP).Le script dit « dossier du site inexistant » avec un chemin qui commence par `/pix-flow.com/…`. Que faire ?
public_html/exemple.fr/public_html/exemple.fr/wordpress.L'archive WordPress contient un dossier wordpress/. Si tu extrais dans un chemin déjà complet et que destfiles répète ce chemin, tu obtiens des dossiers imbriqués. Extrais dans le dossier du site avec `destfiles: "."`, puis déplace le contenu de wordpress/.
{ "cpanel_jsonapi_module": "Fileman", "cpanel_jsonapi_func": "fileop",
"dir": "/public_html/exemple.fr/wordpress",
"op": "move", "sourcefiles": "*", "destfiles": "/public_html/exemple.fr" }
// puis les fichiers cachés (.htaccess…) avec "sourcefiles": ".*"
// puis "op": "trash" sur le dossier wordpress videAuthorization ; valeur : cpanel UTILISATEUR:JETON.wp theme install refuse un thème déjà présent (« le dossier existe déjà »). Ton besoin est une mise à jour depuis un ZIP local : tu as donc écrit theme_update et plugins_update sur le même modèle.
/themes/Pegasus-1.6.zip, /plugins/pix-up.zip) et contient un dossier au vrai slug.wp theme install <zip> --force --activate.wp plugin install <zip> --force --activate --skip-themes.realpath(__DIR__ . "/../plugins/{$name}.zip") depuis includes/plugins.php ; sinon « ZIP introuvable ».pix-up et non le chemin du ZIP.theme activate.name.Pourquoi `wp theme install` seul ne suffit pas pour mettre à jour ton thème ?
define('DISALLOW_FILE_EDIT', true); dans wp-config.php est plus fiable que de masquer des liens.welcome-panel) via le hook dédié.Piège constaté : masquer un lien de menu en CSS ou avec remove_submenu_page laisse l'URL accessible. Seule la constante bloque réellement l'accès.
Constat de départ : un parc d'environ 4 000 sites au même ensemble de plugins, dont le vrai problème est le design (pages modifiées, CSS custom) et non les mises à jour techniques.
| Principe | Mise en œuvre |
|---|---|
| Un thème parent commun | Les écarts de design passent par des tokens CSS et des presets, pas par du CSS écrit site par site |
| Plugin « Master » léger | Il applique les tokens, charge les presets autorisés, vérifie la licence et parle à ton API |
| Intelligence au centre | Moteur de génération CSS, presets premium, mapping site → design et versions restent sur ton serveur |
| Protection du code | Impossible à 100 % si le code tourne chez le client : licence par domaine, réponses signées, mise à jour depuis un dépôt privé, pas de secret en dur |
Le plugin devient un exécuteur local ; la valeur (presets, règles, tableau de bord) reste côté API. C'est la direction du registre « Plugins & thèmes » de l'application WP.
Où placer ce qui fait la valeur de ton plugin Master ?