Gancho para solicitação de URL

4

Eu gostaria de disponibilizar arquivos XML, em vez de permitir que o navegador os exiba em linha.

Eu sei que posso usar o cabeçalho Content-Disposition: attachment HTTP (claro, soluções melhores são bem-vindas!). Eu quero adicionar este cabeçalho em todas as respostas HTTP quando um usuário tenta baixar um arquivo XML.

Eu posso usar o seguinte código PHP:

header('Content-Disposition: attachment; filename="the_filename.xml"');

O problema é: quando eu posso chamar esta instrução? Qual gancho devo usar e como?

    
por User 03.10.2012 / 15:23

3 respostas

4

Na verdade, minha recomendação seria fazer as coisas de maneira um pouco diferente. Você pode adicionar um ponto de extremidade de reescrita personalizado ao WordPress para lidar com esses arquivos especificamente.

Por exemplo, o URL http://site.com/download-xml/the_filename faria o download automático do arquivo especificado como anexo.

Primeiro, você precisa adicionar um ponto de extremidade de reescrita personalizado para configurá-lo:

function add_endpoint() {
    add_rewrite_endpoint( 'download-xml', EP_ALL );
}
add_action( 'init', 'add_endpoint' );

Isso convenientemente também adiciona uma variável de consulta para que possamos verificar se esse ponto de extremidade está sendo usado durante um redirecionamento de modelo padrão.

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

Na função acima, você pode fazer o que precisar para baixar o arquivo. Carregue-o do diretório /wp-content/uploads como um fluxo, defina os cabeçalhos dos arquivos (com disposição de conteúdo definida como "anexo"), gere dinamicamente o conteúdo com base em algo no banco de dados, o que você quiser.

Apenas certifique-se de ter a chamada exit() no final, caso contrário o WordPress tentará executar suas chamadas de redirecionamento de modelo regulares e você obterá alguns erros "cabeçalhos já enviados" feios mais tarde.

    
por EAMann 03.10.2012 / 20:14
2

Você precisará dar uma olhada em API de plug-in / Referência de ação / enviar cabeçalhos

Exemplo:

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

Acho que você pode usar o gancho de ação parse_request parse_request

add_action('parse_request', 'handleDownload', 10, 1);
    
por Sumit Parkash 23.03.2018 / 20:02