使用Wordpress

时间:2018-10-30 13:12:23

标签: php wordpress

我为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上写一些特定的东西?

这是开发人员工具中响应标头的屏幕截图: enter image description here

4 个答案:

答案 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

有关您的代码的其他注释:

  1. 锚中缺少下划线;它应该是: <?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');

  2. 摆脱<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>