Si te entiendo correctamente, ¿quieres tener una URL como la siguiente cuya respuesta al navegador será el contenido que generes, es decir, tu .CSV
archivo y ningún contenido generado de WordPress?
http://example.com/download/data.csv
Creo que estás buscando el 'template_redirect'
gancho. Puede encontrar 'template_redirect'
en /wp-includes/template-loader.php
qué archivo se encuentran todos los desarrolladores de WordPress; es breve y agradable y enruta cada carga de página no administrativa, así que asegúrese de echarle un vistazo.
Sólo tiene que añadir lo siguiente al de su tema de functions.php
archivo o en otro archivo que include
en functions.php
:
add_action('template_redirect','yoursite_template_redirect');
function yoursite_template_redirect() {
if ($_SERVER['REQUEST_URI']=='/downloads/data.csv') {
header("Content-type: application/x-msdownload",true,200);
header("Content-Disposition: attachment; filename=data.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo 'data';
exit();
}
}
Tenga en cuenta la prueba de la '/downloads/data.csv'
URL mediante la inspección $_SERVER['REQUEST_URI']
. También tenga en cuenta lo agregado ,true,200
a su header()
llamada donde configura el Content-type
; Esto se debe a que WordPress habrá configurado 404
"No encontrado" código de estado porque no reconoce la URL. Sin embargo, no es un problema, ya que true
le dice header()
que reemplace el 404
WordPress establecido y que use el código de estado HTTP 200
"Okay" .
Y así es como se ve en Firefox ( Nota tenga la captura de pantalla no tiene un /downloads/
directorio virtual porque después de tomar y anotar la captura de pantalla, me pareció una buena idea agregar un '/downloads/'
directorio virtual):
(fuente: mikeschinkel.com )
ACTUALIZAR
Si desea que la descarga se maneje desde una URL con el prefijo /wp-admin/
para dar al usuario la indicación visual de que está protegida por un inicio de sesión, también puede hacerlo; La descripción de una manera sigue.
Esta vez encapsulé en una clase, llamé DownloadCSV
, y para crear una "capacidad" de usuario llamada 'download_csv'
para el 'administrator'
rol (lea sobre Roles y Capacidades aquí ). Si lo desea, puede aprovechar el 'export'
rol predefinido y, de ser así, simplemente busque y reemplace 'download_csv'
con 'export'
y eliminar la register_activation_hook()
llamada y elactivate()
función. Por cierto, la necesidad de un enlace de activación es una de las razones por las que moví esto a un complemento en lugar de guardarlo en el functions.php
archivo del tema . *
También agregué una opción de menú "Descargar CSV" del menú "Herramientas" usando add_submenu_page()
y lo vinculé a la 'download_csv'
capacidad.
Por último, elegí el 'plugins_loaded'
gancho porque era el gancho apropiado más antiguo que podía usar. Podría usar, 'admin_init'
pero ese enlace se ejecuta mucho más tarde (1130a llamada de gancho frente a la 3ra llamada de gancho), entonces, ¿por qué dejar que WordPress haga más trabajo desechable del que necesita? (Usé mi complemento Instrument Hooks para averiguar qué gancho usar).
En el enlace que verifico para asegurarme de que mi URL comience /wp-admin/tools.php
inspeccionando la $pagenow
variable, verifico eso current_user_can('download_csv')
y si eso pasa, lo pruebo $_GET['download']
para ver si contiene data.csv
; en caso afirmativo, ejecutamos prácticamente el mismo código que antes. También eliminé la ,true,200
llamada de header()
en el ejemplo anterior porque aquí WordPress sabe que es una buena URL, por lo que aún no configuré el estado 404. Así que aquí está tu código:
<?php
/*
Plugin Name: Download CSV
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/
if (!class_exists('DownloadCSV')) {
class DownloadCSV {
static function on_load() {
add_action('plugins_loaded',array(__CLASS__,'plugins_loaded'));
add_action('admin_menu',array(__CLASS__,'admin_menu'));
register_activation_hook(__FILE__,array(__CLASS__,'activate'));
}
static function activate() {
$role = get_role('administrator');
$role->add_cap('download_csv');
}
static function admin_menu() {
add_submenu_page('tools.php', // Parent Menu
'Download CSV', // Page Title
'Download CSV', // Menu Option Label
'download_csv', // Capability
'tools.php?download=data.csv');// Option URL relative to /wp-admin/
}
static function plugins_loaded() {
global $pagenow;
if ($pagenow=='tools.php' &&
current_user_can('download_csv') &&
isset($_GET['download']) &&
$_GET['download']=='data.csv') {
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=data.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo 'data';
exit();
}
}
}
DownloadCSV::on_load();
}
Y aquí hay una captura de pantalla del complemento activado:
(fuente: mikeschinkel.com
)
Y finalmente aquí hay una captura de pantalla de la activación de la descarga:
(fuente: mikeschinkel.com )
'template_redirect'
definitivamente se ejecuta en el servidor. Si no, estaría totalmente confundido; ¿Puedes aclarar la preocupación? Gracias por adelantado./downloads/data.csv
, que es un archivo no existente, por lo que el "front end" de WordPress se encargará de esta solicitud y eventualmente llegarátemplate-redirect
. Simplemente cree un enlace en el área de administración que apunte a esta URL frontal. (Debe decirse que de esta manera, no obtienes la protección de inicio de sesión de administrador de forma gratuita; cualquiera que conozca la URL puede descargar el archivo, pero ¿tal vez hay una manera fácil de solucionarlo?)current_user_can()
con el código anterior o tomar otro enfoque. Después de este comentario, agregaré una actualización a mi respuesta.Un complemento más útil para exportar a CSV. puede ser útil para alguien
fuente
admin_init Hook o load- (page) Hook parece funcionar, WordPress no se ha configurado como encabezado en este estado. Estoy usando load- (page) Hook porque se ejecuta cuando se carga una página de menú de administración. Puede cargar su script para una página específica.
Puede verificar cargar- (página) Hook en WordPress Codex
Si está utilizando admin_init Hook, asegúrese de verificar nonce utilizando check_admin_referer u otro script, tal vez pase la condición y obtendrá el archivo de descarga.
fuente