Как я могу принудительно загрузить файл в бэкэнд WordPress?

Я хотел бы добавить кнопку «Нажмите, чтобы загрузить», чтобы один из моих плагинов WordPress, и я не уверен, какой крючок использовать. До сих пор подключение «admin_init» к этому коду, похоже, работает:

заголовок
 header("Content-type: application/x-msdownload");
 header("Content-Disposition: attachment; filename=data.csv");
 header("Pragma: no-cache");
 header("Expires: 0");
 echo 'data';
 exit();

Это похоже на работу, но я просто хочу посмотреть, есть ли там лучшая практика.

Спасибо, Dave

28 голосов | спросил Dave Morris 31 +03002010-10-31T19:29:28+03:00312010bEurope/MoscowSun, 31 Oct 2010 19:29:28 +0300 2010, 19:29:28

3 ответа


37

Если вы правильно поняли, что хотите иметь URL-адрес примерно следующего , ответ на который будет отображаться в браузере - это ваш файл .CSV и нет сгенерированного контента из WordPress?

http://example.com/download/data.csv

Я думаю, что вы ищете hook 'template_redirect'. Вы можете найти 'template_redirect' в /wp-includes/template-loader.php, который является файлом, с которым должны ознакомиться все разработчики WordPress; он короткий и сладкий и маршрутизирует каждую загрузку без админ-страницы, поэтому не забудьте взглянуть на нее.

Просто добавьте следующее в файл functions.php вашей темы или в другой файл, который вы include в 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();
  }
}

Обратите внимание на тест для URL '/downloads/data.csv', проверив $_SERVER['REQUEST_URI']. Также обратите внимание на добавленный ,true,200 на ваш вызов header(), где вы устанавливаете Content-type; это потому, что WordPress установит код состояния 404 «Не найден» , потому что он не распознает URL. Это не проблема, поскольку, поскольку true сообщает header(), чтобы заменить установленный 404 WordPress и использовать HTTP 200 «Okay» .

И вот как это выглядит в FireFox ( Примечание ), скриншот не имеет виртуального каталога /downloads/, потому что после взятия и аннотации скриншота это просто показалось хорошей идеей добавить виртуальный каталог '/downloads/'):

Снимок экрана загрузки URL-файла CSV

UPDATE

Если вы хотите, чтобы загрузка была обработана с URL-адреса с префиксом /wp-admin/, чтобы дать пользователю визуальную индикацию того, что она защищена логином, вы также можете сделать это ; следует описание одного из способов.

На этот раз я инкапсулирован в класс, называемый DownloadCSV, и для создания пользовательской "возможности , называемой 'download_csv' для 'administrator' role (читайте о ролях и возможностях здесь ) Вы можете просто отключить предопределенную 'administrator', если хотите, и если это так, просто найдите & замените 'export' на 'download_csv' и удалите вызов 'export' и функцию register_activation_hook(). Кстати, необходимость в активационном крюке - одна из причин, по которой я переместил это в плагин, а не в файл activate() темы. *

Я также добавил меню «Загрузить CSV» в меню «Инструменты» , используя functions.php и связав его с 'download_csv'.

Наконец, я выбрал крючок add_submenu_page(), потому что это был самый ранний подходящий крючок, который я мог бы использовать. Вы можете использовать 'download_csv', но этот крючок запускается намного позже (1130-й вызов крюка против 3-го вызова крюка), поэтому почему WordPress делает больше отбрасываемой работы, чем нужно? (Я использовал инструмент Подключить плагин , чтобы выяснить, какой крючок использовать.)

На крючке я проверяю, чтобы мой URL начинался с'plugins_loaded', проверив переменную 'admin_init', я проверю, что /wp-admin/tools.php, и если это пройдет, Я тестирую $pagenow, чтобы узнать, содержит ли он current_user_can('download_csv'); если да, то мы запускаем практически тот же код, что и раньше. Я также удаляю $_GET['download'] из вызова data.csv в предыдущем примере, потому что здесь WordPress знает, что это хороший URL-адрес, поэтому не был установлен статус 404 все же. Итак, вот ваш код:

,true,200

И вот скриншот активированного плагина: Снимок экрана с плагином с показом активированного плагина

И, наконец, вот скриншот запуска загрузки: Снимок экрана с загрузкой файла по URL-адресу из меню« Инструменты »администратора WordPress«> </p></body></html>

ответил MikeSchinkel 1 12010vEurope/Moscow11bEurope/MoscowMon, 01 Nov 2010 14:09:54 +0300 2010, 14:09:54
3

еще один полезный плагин для экспорта в CSV. может быть полезно для некоторых

    <?php

class CSVExport
{
/**
* Constructor
*/
public function __construct()
{
if(isset($_GET['download_report']))
{
$csv = $this->generate_csv();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"report.csv\";" );
header("Content-Transfer-Encoding: binary");

echo $csv;
exit;
}

// Add extra menu items for admins
add_action('admin_menu', array($this, 'admin_menu'));

// Create end-points
add_filter('query_vars', array($this, 'query_vars'));
add_action('parse_request', array($this, 'parse_request'));
}

/**
* Add extra menu items for admins
*/
public function admin_menu()
{
add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report'));
}

/**
* Allow for custom query variables
*/
public function query_vars($query_vars)
{
$query_vars[] = 'download_report';
return $query_vars;
}

/**
* Parse the request
*/
public function parse_request(&$wp)
{
if(array_key_exists('download_report', $wp->query_vars))
{
$this->download_report();
exit;
}
}

/**
* Download report
*/
public function download_report()
{
echo '<div class="wrap">';
echo '<div id="icon-tools" class="icon32">
</div>';
echo '<h2>Download Report</h2>';
//$url = site_url();

echo '<p>Export the Users';
}

/**
* Converting data to CSV
*/
public function generate_csv()
{
$csv_output = '';
$table = 'users';

$result = mysql_query("SHOW COLUMNS FROM ".$table."");

$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output = $csv_output . $row['Field'].",";
$i++;
}
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j].",";
}
$csv_output .= "\n";
}

return $csv_output;
}
}

// Instantiate a singleton of this plugin
$csvExport = new CSVExport();
ответил Developer 4 Jpm1000000pmFri, 04 Jan 2013 20:26:38 +040013 2013, 20:26:38
2

admin_init Крючок или load- (страница) Крюк, похоже, работает, WordPress не был установлен в этом состоянии. Я использую load- (page) Hook, потому что он запускается при загрузке страницы меню администрирования. Вы можете загрузить свой скрипт для определенной страницы.

Вы можете проверить load- (page) Hook on WordPress Codex

Если вы используете admin_init Hook, убедитесь, что проверить nonce , используя check_admin_referer или другой скрипт, возможно, это условие выведет вашу загрузку файл.

ответил Joko Wandiro 24 WedEurope/Moscow2014-12-24T10:54:38+03:00Europe/Moscow12bEurope/MoscowWed, 24 Dec 2014 10:54:38 +0300 2014, 10:54:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132