将CSV功能导出到我的插件

时间:2012-08-27 作者:pixeline

我需要在插件中构建“导出为.csv”功能。问题是:我得到的标题已经发送了警告,因为在调用“export”函数时,Wordpress已经开始渲染了。

我设置它的方式是通过设置屏幕中的一个小表单,该动作属性指向插件文件夹中的一个文件(download.csv.php),该文件不应显示,只需提示csv转储的文件下载对话框即可。

这是我的密码。

在我的插件设置屏幕中:

<form method="post" id="download_form"  action="<?php echo plugins_url( \'download.csv.php\' , __FILE__ ); ?>">
            <input type="hidden" name="download" value="<?php echo get_home_path(); ?>" />
            <input type="submit" name="download_csv"  class="button-primary" value="<?php _e(\'Download the log (.csv)\', $this->localizationDomain); ?>" />
        </form>
和下载。csv。php文件:

$core = $_POST[\'download\'].\'wp-load.php\';

if(isset($_POST[\'download\']) && is_file($core)){

    require_once( $core );

    global $wpdb;

    $rows = $wpdb->get_results(\'SELECT * FROM `\'.$this->dbName.\'`;\',ARRAY_A);

    if($rows){

        require_once(\'classes/csvmaker.class.php\');
        $CSV = new CSVMaker();

        $CSVHeader = array();
        $CSVHeader[\'id\'] = "ID";
        $CSVHeader[\'when\'] = "WHEN";
        $CSVHeader[\'who\'] = "WHO";
        $CSVHeader[\'description\'] = "DESCRIPTION";
        $CSVHeader[\'type\'] = "TYPE";

        foreach($rows as $r){
            $CSV->addEntry($r);
        }
        $file_name = plugin_dir_path(__FILE__).\'data.csv\';
        file_put_contents($file_name,$CSV->buildDoc);
        ob_start();
        header("Expires: Mon, 1 Apr 1974 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");
        header("Content-type: application/CSV");
        header("Content-Disposition: attachment; filename=$file_name.csv");
        echo $CSV->buildDoc;
        return ob_get_clean();
        exit;

    } 
我做错了什么?

3 个回复
最合适的回答,由SO网友:Otto 整理而成

你做错了什么,可以用下面这句话来解释:

哪个动作属性指向插件文件夹中的文件(download.csv.php),不应该显示,只需提示csv转储的文件下载对话框即可。

此代码:

$core = $_POST[\'download\'].\'wp-load.php\';
if(isset($_POST[\'download\']) && is_file($core)){
    require_once( $core );
基本上,你要做的是a)跳出WordPress环境,直接访问插件的某些部分,b)然后尝试从该文件中加载WordPress环境(我可能会补充说,这是以一种极其不安全的方式进行的)。

与其这样做,不如一开始就呆在WordPress环境中,并按照您希望的方式覆盖输出。

更好的方法是留在admin中,钩住admin\\u init,检测何时需要获取CSV输出并返回该输出。

因此,对于您的表单,请执行以下操作:

<form method="post" id="download_form" action="">
            <input type="submit" name="download_csv" class="button-primary" value="<?php _e(\'Download the log (.csv)\', $this->localizationDomain); ?>" />
    </form>
请注意,此处未使用任何操作。这意味着它将提交回您的同一管理页面,没有任何更改。现在,您可以在连接到admin\\u init action hook的任何函数中检测到,如下所示:

global $plugin_page;
if ( isset($_POST[\'download_csv\']) && $plugin_page == \'whatever\' ) {
    echo "HELLO"; die;
}
$plugin\\u page global将设置为页面=普通插件设置屏幕中的任何内容。不要像我在这里那样重复“HELLO”,而是在插件中调用一个函数来正确生成和输出CSV、标题和所有内容,然后消亡。或者类似的东西。

请注意,这过于简单,可能不安全。您可能还想在此处执行nonce和功能检查,以确保允许用户下载此CSV并打算这样做。

SO网友:Aafaq Ahmad

Putting the whole updated code.

在插件更新中

<form method="post" id="download_form" action="">

<input type="submit" name="download_csv" class="button-primary" value="<?php _e(\'Download the log (.csv)\', $this->localizationDomain); ?>" />

</form>
现在在您的功能中。php

add_action("admin_init", "download_csv");

function download_csv() {

  if (isset($_POST[\'download_csv\'])) {

    global $wpdb;

    $sql = "SELECT * FROM {$wpdb->prefix}table_name";

    $rows = $wpdb->get_results($sql, \'ARRAY_A\');

    if ($rows) {

        $csv_fields = array();
        $csv_fields[] = "first_column";
        $csv_fields[] = \'second_column\';

        $output_filename = \'file_name\' .\'.csv\';
        $output_handle = @fopen(\'php://output\', \'w\');

        header(\'Cache-Control: must-revalidate, post-check=0, pre-check=0\');
        header(\'Content-Description: File Transfer\');
        header(\'Content-type: text/csv\');
        header(\'Content-Disposition: attachment; filename=\' . 
        $output_filename);
        header(\'Expires: 0\');
        header(\'Pragma: public\');

        $first = true;
       // Parse results to csv format
        foreach ($rows as $row) {

       // Add table headers
            if ($first) {

               $titles = array();

                foreach ($row as $key => $val) {

                    $titles[] = $key;

                }

                fputcsv($output_handle, $titles);

                $first = false;
            }

            $leadArray = (array) $row; // Cast the Object to an array
            // Add row to file
            fputcsv($output_handle, $leadArray);
        }

        //echo \'<a href="\'.$output_handle.\'">test</a>\';

        // Close output file stream
        fclose($output_handle);

        die();
    }
  }
}

SO网友:Debbie Kurth

我在使用上述方法时遇到了一些问题-add\\u action。否不希望插件自动执行此功能。相反,我需要一个管理解决方案。

1、发现清理缓存或HTML输出进入csv文件
2。“您必须”;退出“;过程。

这是我的解决方案。根据自己的需要更改表格和字段:

 function Export()
 {
  global $wpdb; 

  header(\'Content-Type: text/csv\');
  header(\'Content-Disposition: attachment; filename="export.csv"\');

 // clean output buffer
 ob_end_clean();

 $fp = fopen(\'php://output\', \'w\');

 $header_row = array(
    0 => \'field 1 label\',
    1 => \'field 2 label\',
    2 => \'field 3 label\',
     );


 fputcsv($fp, $header_row); 

 $Table_Name   = $wpdb->prefix.\'YourTable\'; 
 $sql_query    = $wpdb->prepare("SELECT * FROM $Table_Name", 1) ;
 $rows         = $wpdb->get_results($sql_query, ARRAY_A);
 if(!empty($rows)) 
   {
    foreach($rows as $Record)
      {  

 $OutputRecord = array($Record[\'field1\'],$Record[\'field2\'],$Record[\'field3\']);   
  fputcsv($fp, $OutputRecord);       
   }
  }

fclose( $fp );
exit;
}
更新:自从我写这篇文章以来,如果您通过短码或直接调用在前端使用代码,HTML头数据就会进入文件。在后端/管理部分使用此选项,效果非常好。

结束

相关推荐

my theme breaks WP export

我知道这是一个模糊的问题,如果你有心情的话,请花点时间在上面,我不需要因为没有更准确的回答而被激怒。我正在开发一个主题,由于某种原因,它破坏了WordPress的导出功能。我并没有要求任何人来解决我的问题,但在花了几个小时的时间之后,我想问一下,是否有人认识到这个问题,并会给我一个提示,告诉我应该朝什么方向寻找问题。不知何故,我觉得这与临时检查失败有关,但不确定。。无论如何,问题是,如果我单击页面中的导出按钮http://www.myserver.com/wp-admin/export.php