Un ZIP peut être téléchargeable publiquement sans être placé dans public_html. Le site conserve alors les archives dans un dossier extérieur à la racine publique et WordPress sert le fichier à travers un point d’entrée contrôlé.
Pour les ressources Phoenix, un shortcode avec le nom du ZIP suffit. Aucun type de contenu ni écran de réglages supplémentaire n’est nécessaire.
Choisir un dossier et une convention simple
Dans ce projet, le dossier porte le nom dowload_asset, conformément à la convention retenue. L’emplacement par défaut est le parent du dossier WordPress. Il doit réellement se trouver hors de la racine HTTP.
prositewebco/
dowload_asset/
phoenix-premier-design.zip
public/
wp-config.php
wp-content/
Si WordPress est installé dans un sous-dossier public ou si votre hébergement utilise une autre arborescence, définissez le chemin explicitement dans wp-config.php :
define('PHOENIX_DOWNLOAD_DIR', '/chemin/prive/dowload_asset');
Ce chemin est un réglage de déploiement. Il n’est jamais affiché dans le HTML. Le processus PHP doit pouvoir lire les fichiers ; aucun droit d’écriture public n’est requis pour servir les archives.
Afficher le lien avec le shortcode
Ajoutez un bloc Shortcode dans un article WordPress et renseignez le nom exact du fichier :
[download_asset file="phoenix-premier-design.zip" label="Télécharger le design d’exemple"]
Le shortcode produit un bouton vers le point d’entrée WordPress, accompagné de la taille du fichier. Il ne lit pas le ZIP pour l’insérer dans la page et ne crée pas d’entrée supplémentaire en base.
Les exemples de code contenus dans les guides restent des exemples : le rendu éditorial les protège pour qu’un shortcode écrit dans un bloc Code ne soit pas exécuté.
Contrôler le nom et le chemin réel
Le traitement accepte un nom de ZIP simple, sans séparateur de dossier. Il refuse les traversées de chemin et les extensions inattendues.
La vérification du nom ne suffit pas. Le code résout le dossier et le fichier avec realpath(), puis contrôle que le chemin obtenu reste à l’intérieur du dossier autorisé. Un lien symbolique qui pointe ailleurs doit être refusé.
Le traitement vérifie également que le dossier des archives n’est pas situé sous ABSPATH ou sous la racine HTTP connue du serveur. Une mauvaise configuration ne doit pas transformer la convention privée en simple sous-dossier public.
Servir une réponse de téléchargement
Le point d’entrée est branché aux actions WordPress pour visiteurs connectés et déconnectés. Il accepte les requêtes GET et HEAD, contrôle le fichier avant d’envoyer les en-têtes, puis transmet son contenu en flux.
La réponse indique notamment le type ZIP, la disposition en pièce jointe et la taille. Elle utilise aussi nosniff et un en-tête demandant de ne pas indexer l’archive.
Ce téléchargement public ne dépend pas d’un nonce expirant dans une page mise en cache. Il ne constitue pas pour autant un contrôle d’accès : toute personne qui possède le lien peut télécharger une archive autorisée. Pour des ressources confidentielles ou payantes, il faut concevoir les droits et les règles de délivrance correspondants.
Maintenir les ressources dans le temps
Donnez aux archives des noms stables et documentez leur contenu. Pour une évolution incompatible, un nouveau nom versionné peut éviter qu’un ancien article décrive des fichiers qui ne correspondent plus à ses exemples.
Le ZIP doit inclure un README, les prérequis et les limites. Il ne doit pas contenir des sauvegardes de production, des contacts, des clés ou le cœur privé de Phoenix sans autorisation adaptée.
Contrôlez le fichier depuis une session déconnectée après chaque déploiement. Essayez aussi un nom absent, un chemin interdit et une requête HEAD.
Le guide de mise en production explique où placer les fichiers. La recette finale complète les essais côté utilisateur.