Crochet pour la demande d'URL

4

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 HTTP (bien entendu, les meilleures solutions sont les bienvenues!). Je souhaite ajouter cet en-tête à 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 puis-je appeler cette instruction? Quel crochet dois-je utiliser et comment?

    
posée User 03.10.2012 - 15:23

3 réponses

4

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' );

Cela ajoute également une variable de requête afin que nous puissions vérifier si ce noeud final est utilisé lors d'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, comme vous le souhaitez.

Assurez-vous simplement d'avoir l'appel exit() à la fin, sinon WordPress essaiera d'exécuter ses appels de redirection de modèle habituels et vous obtiendrez ultérieurement des erreurs "d'entêtes déjà envoyées".

    
réponse donnée EAMann 03.10.2012 - 20:14
2

Vous devrez jeter un coup d'œil à API de plugin / Référence d'action / en-têtes d'envoi

Exemple:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
     header( 'X-UA-Compatible: IE=edge,chrome=1' );
}
    
réponse donnée Michael Ecklund 03.10.2012 - 15:29
0

Je pense que vous pouvez utiliser le crochet d'action parse_request parse_request

add_action('parse_request', 'handleDownload', 10, 1);
    
réponse donnée Sumit Parkash 23.03.2018 - 20:02

Lire d'autres questions sur les étiquettes