web-dev-qa-db-fra.com

Crochet pour demande d'URL

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?

4
User

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".

4
EAMann

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' );
}
2
Michael Ecklund

Je pense que vous pouvez utiliser le hook d'action parse_requestparse_request

add_action('parse_request', 'handleDownload', 10, 1);
0
Sumit Parkash