Je souhaite rendre les fichiers XML téléchargeables au lieu de permettre au navigateur de les afficher en ligne.
Je sais que je peux utiliser l'en-tête HTTP Content-Disposition: attachment
(évidemment, de meilleures solutions sont les bienvenues!). Je souhaite ajouter cet en-tête dans toutes les réponses HTTP lorsqu'un utilisateur tente de télécharger un fichier XML.
Je peux utiliser le code PHP suivant:
header('Content-Disposition: attachment; filename="the_filename.xml"');
Le problème est le suivant: quand je peux appeler cette instruction? Quel crochet dois-je utiliser et comment?
En fait, ma recommandation serait de faire les choses un peu différemment. Vous pouvez ajouter un point de terminaison de réécriture personnalisé à WordPress pour gérer ces fichiers de manière spécifique.
Par exemple, l'URL http://site.com/download-xml/the_filename
téléchargerait automatiquement le fichier spécifié en tant que pièce jointe.
Tout d’abord, vous devez ajouter un point de terminaison de réécriture personnalisé pour le configurer:
function add_endpoint() {
add_rewrite_endpoint( 'download-xml', EP_ALL );
}
add_action( 'init', 'add_endpoint' );
De manière pratique, cela ajoute également une variable de requête afin que nous puissions vérifier si ce noeud final est utilisé pendant une redirection de modèle standard.
function download_redirect() {
global $wp_query;
// If this isn't the right kind of request, bail.
if ( ! isset( $wp_query->query_vars['download-xml'] ) || empty( $wp_query->query_vars['download-xml'] ) )
return;
// Download the file.
exit();
}
add_action( 'template_redirect', 'download_redirect' );
Dans la fonction ci-dessus, vous pouvez faire tout ce dont vous avez besoin pour télécharger le fichier. Chargez-le à partir du répertoire /wp-content/uploads
en tant que flux, définissez les en-têtes de fichier (avec content-disposition défini sur "attachment"), générez de manière dynamique le contenu en fonction de quelque chose dans la base de données, celui que vous souhaitiez.
Assurez-vous simplement d'avoir l'appel exit()
à la fin, sinon WordPress essaiera d'exécuter ses appels de redirection de gabarit habituels et vous obtiendrez ultérieurement des erreurs "d'entêtes déjà envoyées".
Vous aurez besoin de jeter un oeil à Plugin API/Action Reference/send header
Exemple:
add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
header( 'X-UA-Compatible: IE=Edge,chrome=1' );
}
Je pense que vous pouvez utiliser le hook d'action parse_request
parse_request
add_action('parse_request', 'handleDownload', 10, 1);