如何在fputcsv中使用foreach?

时间:2015-12-25 14:28:57

标签: php wordpress foreach woocommerce fputcsv

我正在尝试将具有特定订单状态的woocommerce订单详细信息导出到文本文件中。我的问题是,它只会获得一个订单的详细信息,因为我没有使用foreach。有谁知道我怎么能改变我的代码所以它会在不同的行中获得所有订单?

define('WP_USE_THEMES', false);
require('/var/www/html/wp-blog-header.php');

global $wpdb;
global $woocommerce;
$args = array(
    'post_type'         => 'shop_order',
    'post_status'       => 'publish',
            'posts_per_page' => -1,
    'tax_query' => array(
                array(
                    'taxonomy' => 'shop_order_status',
                    'field' => 'slug',
                    'terms' => array('processing')
                )
            )
);

$my_query = new WP_Query($args);
$orders = $my_query->posts;
foreach($orders as $order)
{
$order_id = $order->ID;
    $billing_first_name =get_post_meta($order_id,'_billing_first_name',true);
    $billing_last_name = get_post_meta($order_id,'_billing_last_name',true);
    $billing_name = $billing_first_name. " ". $billing_last_name ;
    $billing_address = get_post_meta($order_id,'_billing_address_1',true);
    $billing_address2 = get_post_meta($order_id,'_billing_address_2',true);
    $billing_city = get_post_meta($order_id,'_billing_city',true);
    $billing_postcode = get_post_meta($order_id,'_billing_postcode',true);
    $billing_country = get_post_meta($order_id,'_billing_country',true);
    $billing_email = get_post_meta($order_id,'_billing_email',true);
    $billing_phone = get_post_meta($order_id,'_billing_phone',true);
}

//headers
header('Pragma: public');
header('Expires: 0');
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=export.txt;');

//open file pointer to standard output
$fp = fopen('php://output', 'w');
if ($fp)
{
fputcsv($fp, array("[quickid]", "[sender]", "[receiver]", "[orgno]", "[vatno]", "[category1text]", "[category2text]", "[category3text]", "[category1no]", "[category2no]", "[category3no]", "[name]", "[address1]", "[address2]", "[zipcode]", "[city]", "[state]", "[country]", "[contact]", "[email]", "[phone]", "[fax]", "[sms]", "[doorcode]", "[postaladdress1]", "[postaladdress2]", "[postalzipcode]", "[postalcity]", "[postalstate]", "[postalcountry]", "[deliv1]", "[deliv2]", "[deliv3]", "[deliv4]", "[receiverref]", "[senderref]", "[codref]", "[profilegroup]", "[account_1_type]", "[account_1_number]", "[account_1_bic]", "[account_2_type]", "[account_2_number]", "[account_2_bic]", "[account_3_type]", "[account_3_number]", "[account_3_bic]", "[account_4_type]", "[account_4_number]", "[account_4_bic]", "[account_5_type]", "[account_5_number]", "[account_5_bic]", "[partner_plab_custno]", "[partner_plab_receiverid]", "[partner_plab_destcode]", "[partner_hit_custno]", "[partner_hit_retailerid]", "[partner_hit_sortpos]", "[partner_pbrev_custno]", "[partner_pbrev_paymentmethod]"), "\t", " ");
fputcsv($fp, array("1", "N", "Y", "", "", "", "", "", "", "", "", $billing_name, $billing_address, $billing_address2, $billing_postcode, $billing_city, "", $billing_country, $billing_name, $billing_email, $billing_phone, "", $billing_phone, "", $billing_address, $billing_address2, $billing_postcode, $billing_city, "", $billing_country, "", "", "", "", "Ordernummer", "Ordernummer", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), "\t", " ");
}
fclose($fp);

1 个答案:

答案 0 :(得分:1)

您似乎已提前关闭foreach() - 在循环上方打开文件,将标题放在顶部,然后在其中放置fputcsv(),然后在循环外关闭文件。你还需要使用“a” - append - mode而不是“w”,否则每次都会覆盖所有内容。

将WordPress和Query部分保留在顶部并尝试此代码的顺序,以便每次获取新项目时循环都会经过fputcsv()

如果您需要将标头放在文件中,则其中包含合适的代码https://www.jonasjohn.de/snippets/php/post-request.htm

 //open file pointer to standard output
 $fp = fopen('php://output', 'a');
 if ($fp){
     if (filesize($fp) == 0){ 
     // headers
     // add your header rows if it is a new file
     // you may need to move these header(...); to the top of your page  
     // if you get "Headers already sent" errors as you have already included (required)
     // a header - otherwise print them using fputs(); to the output file 
     // if that is where you want them.
     // for example fputs($fp, "Pragma: public\r\n"); 
     //             fputs($fp, "Content-type: text/csv\r\n");

     header('Pragma: public');
     header('Expires: 0');
     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=export.txt;');
     // add your CSV header row if it is a new file
     fputcsv($fp, array("[quickid]", "[sender]", "[receiver]", "[orgno]", "[vatno]", "[category1text]", "[category2text]", "[category3text]", "[category1no]", "[category2no]", "[category3no]", "[name]", "[address1]", "[address2]", "[zipcode]", "[city]", "[state]", "[country]", "[contact]", "[email]", "[phone]", "[fax]", "[sms]", "[doorcode]", "[postaladdress1]", "[postaladdress2]", "[postalzipcode]", "[postalcity]", "[postalstate]", "[postalcountry]", "[deliv1]", "[deliv2]", "[deliv3]", "[deliv4]", "[receiverref]", "[senderref]", "[codref]", "[profilegroup]", "[account_1_type]", "[account_1_number]", "[account_1_bic]", "[account_2_type]", "[account_2_number]", "[account_2_bic]", "[account_3_type]", "[account_3_number]", "[account_3_bic]", "[account_4_type]", "[account_4_number]", "[account_4_bic]", "[account_5_type]", "[account_5_number]", "[account_5_bic]", "[partner_plab_custno]", "[partner_plab_receiverid]", "[partner_plab_destcode]", "[partner_hit_custno]", "[partner_hit_retailerid]", "[partner_hit_sortpos]", "[partner_pbrev_custno]", "[partner_pbrev_paymentmethod]"), "\t", " ", "\n");
     } // end of adding headers if new file

     $my_query = new WP_Query($args);
     $orders = $my_query->posts;
     foreach($orders as $order)
     {
     $order_id = $order->ID;
         $billing_first_name =get_post_meta($order_id,'_billing_first_name',true);
         $billing_last_name = get_post_meta($order_id,'_billing_last_name',true);
         $billing_name = $billing_first_name. " ". $billing_last_name ;
         $billing_address = get_post_meta($order_id,'_billing_address_1',true);
         $billing_address2 = get_post_meta($order_id,'_billing_address_2',true);
         $billing_city = get_post_meta($order_id,'_billing_city',true);
         $billing_postcode = get_post_meta($order_id,'_billing_postcode',true);
         $billing_country = get_post_meta($order_id,'_billing_country',true);
         $billing_email = get_post_meta($order_id,'_billing_email',true);
         $billing_phone = get_post_meta($order_id,'_billing_phone',true);

         fputcsv($fp, array("1", "N", "Y", "", "", "", "", "", "", "", "", $billing_name, $billing_address, $billing_address2, $billing_postcode, $billing_city, "", $billing_country, $billing_name, $billing_email, $billing_phone, "", $billing_phone, "", $billing_address, $billing_address2, $billing_postcode, $billing_city, "", $billing_country, "", "", "", "", "Ordernummer", "Ordernummer", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), "\t", " ", "\n");

     }  // end of foreach
 fclose($fp);
 }else{
 echo "Failed to open file $fp";
 }  // end of if ($fp)

罗斯史密斯二世在这里的回答可能有用fputcsv doesn't write any data in a CSV file

并且您可能需要在该行的末尾添加“\ n”(仅限双引号),以确保它们不会全部显示在滚动数英里的同一行上。可能是方便的参考http://php.net/manual/en/function.fputcsv.php

章节和foreach()的经文: How does PHP 'foreach' actually work?

相关问题