我为Wordpress开发了一个小插件(用于培训)。该插件允许从表单获取数据,将其保存到csv文件中,然后管理员可以下载该文件。
我的问题是我无法下载此文件。当我单击下载按钮时,它将打开一个download.php页面,但是什么也没有发生。
我尝试了不同的解决方案,但没有任何效果。这是主文件的代码:
<?php
/*
Plugin Name: Form to CSV
Version: 1.0
Author: Grégory Huyghe
*/
// 1. Shortcode
function ftc_shortcode() {
readfile("form-to-csv.html", 1);
}
add_shortcode( 'form_csv', 'ftc_shortcode' );
// 1.1 CSS
function ftc_style() {
wp_register_style('stylesheet', plugins_url('form-to-csv.css', __FILE__));
wp_enqueue_style('stylesheet');
}
add_action('admin_init', 'ftc_style');
// 2. Onglet plugin dans panneau admin pour voir et télécharger les données collectées
function ftc_menu_item() {
add_menu_page(
__( 'Form to CSV', 'textdomain' ),
'Form to CSV',
'manage_options',
'form-to-csv',
'ftc_menu_plugin',
'dashicons-portfolio',
21
);
}
add_action('admin_menu', 'ftc_menu_item');
// 3. Ecrire les données dans un fichier
// 3.1 Variables
$error = '';
$fname = sanitize_text_field($_POST['prenom']);
$lname = sanitize_text_field($_POST['nom']);
$email = sanitize_email($_POST['email']);
$checkbox = implode(" / ", (array)$_POST['films']);
// 3.2 Clean_text
function clean_text($clean) {
$trimmed = trim($clean);
$stripped = stripslashes($clean);
$special = htmlspecialchars($clean);
return $clean;
}
// 3.3 Submission form
if(isset($_POST['submit'])) {
$success = true;
if(empty($_POST['prenom']) OR empty($_POST['nom']) OR empty($_POST['email'])) {
$error = '<p>Veuillez réessayer</p>';
} else {
$fname = clean_text($_POST['prenom']);
$lname = clean_text($_POST['nom']);
$email = clean_text($_POST['email']);
}
if($error == '' && $success = true) {
// Ecriture dans fichier csv
$file_open = fopen('C:\Users\huygh\Desktop\form-to-csv.csv', 'a');
$index = count(file('C:\Users\huygh\Desktop\form-to-csv.csv'));
if ($index == 0) {
$index = $index +1;
} else if ($index > 0) {
$index = $index +1;
}
$form_data = array(
'id' => $index,
'prenom' => $fname,
'nom' => $lname,
'email' => $email,
'films' => $checkbox
);
fputcsv($file_open, $form_data);
header( 'Location: index.php' );
exit();
}
}
// 4. Récupérer ses infos dans un custom post accessible depuis le panneau admin. Pas d'envoi de mail.
// 4.1 Récupérer et Afficher les données dans l'onglet du plugin
function ftc_menu_plugin() {
// if (isset($_GET['action']) && $_GET['action'] == 'download') {
// header('Location: C:\Users\huygh\Desktop\form-to-csv.csv');
// header('Content-Disposition: attachment; filename="form-to-csv.csv"');
// header("Content-Type: application/force-download");
// header("Content-Transfer-Encoding: Binary");
// header("Pragma: no-cache");
// header("Expires: 0");
//
// readfile('form-to-csv.csv');
//
// echo "toto";
// }
$counter = 0;
echo "<html><body><table>\n\n";
// Titres du tableau
echo "<thead>";
echo "<tr class=\"titles\">";
echo "<th>ID</th>";
echo "<th>Prénom</th>";
echo "<th>Nom</th>";
echo "<th>Email</th>";
echo "<th>Sélection</th>";
echo "</tr>\n";
echo "</thead>";
if (($file_read = fopen('C:\Users\huygh\Desktop\form-to-csv.csv', 'r')) !== FALSE) {
while (($data = fgetcsv($file_read)) !== FALSE && $counter < 20) {
echo "<tr>";
$counter++;
foreach ($data as $cell) {
echo "<td>" . $cell . "</td>";
}
echo "</tr>\n";
}
}
fclose($file_read);
echo "\n</table></body></html>";
// 4.2 Télécharger ce fichier .csv depuis l'onglet du plugin
?>
<a href="download.php" target="_blank">
<button class="button__csv">Télécharger fichier CSV</button>
</a>
<a href="delete.php" target="blank">
<button class="button__csv button__csv--delete">Supprimer données</button>
</a>
<?php
以及download.php的代码:
<?php
header('Content-Disposition: attachment; filename="form-to-csv.csv"');
header('Content-Type: text/csv');
readfile('C:\\Users\\huygh\\Desktop\\form-to-csv.csv');
正如您在主文件代码中看到的那样,我还尝试了不使用download.php页面的解决方案,并按如下所示编写了一个标记:
<a href="?action=download" target="blank">
但是没有任何效果。 问题是否出自标题?还是从Wordpress上写一些特定的东西?
答案 0 :(得分:1)
很抱歉在这里回答,但是我没有足够的声誉来发表评论。
我看到您的标题位于注释行中,并且在其下方有更多代码,但是根据我的经验,标题下的所有代码都不会执行,您应该尝试将标题的位置移到底部。
如果我错了,请纠正我。
答案 1 :(得分:1)
如Jamie_D所述,使用private static URL createURL(String path) {
try {
return ....;
} catch(MalformedURLException e){
// handle somehow
throw new RuntimeException(e);
}
}
会将用户转发到指定的地址(例如您的 3.3提交表格代码块中)。
从代码块中删除该行,您应该获得所需的下载页面:
Location
有关您的代码的其他注释:
锚中缺少下划线;它应该是:
<?php
header('Content-Disposition: attachment; filename="form-to-csv.csv"');
header('Content-Type: text/csv');
// take care to escape the backslashes properly:
readfile('C:\\Users\huygh\\Desktop\\form-to-csv.csv');
摆脱<a href="download.php" target="_blank">Link</a>
结束标记:我看到了在结束标记后出现控制/不可见字符的情况,这些问题导致下载麻烦,因为它们随后作为文件内容的一部分进行传输。
在提问者的情况下,问题不是由于发送给客户端的标头不正确,而是指向?php>
的路径不正确。
答案 2 :(得分:0)
这是解决方案,这是关于download.php位置的一个简单错误,该位置必须位于wp-admin文件夹中。
为了将download.php文件保留在plugin文件夹中,我为a标签写了一个相对URL:
<a href="/Plugin/wp-content/plugins/form-to-csv/download.php"
SaschaM78的答案: 如您所见,找不到“ download.php”,404表示“找不到页面”。确保该文件确实位于“ plugins / wp-admin”中。 – 54分钟前SaschaM78
答案 3 :(得分:0)
您可以使用HTML5的download属性直接下载文件,
<a href="C:\\Users\\huygh\\Desktop\\form-to-csv.csv" download="form-to-csv.csv">download form-to-csv.csv</a>