如何在fputcsv中使用foreach?

Sku*_*urt 5 php wordpress foreach fputcsv woocommerce

我正在尝试将具有特定订单状态的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);
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 3

您似乎已经关闭了foreach()早期 - 打开循环上方的文件,将标题放在顶部,并将其放在fputcsv()里面,然后关闭循环外的文件。您还需要使用“a” - 追加模式而不是“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)
Run Code Online (Sandbox Code Playgroud)

Ross Smith II 在这里的答案可能有用fputcsv does not write any data in a CSV file

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

章节foreach()PHP“foreach”实际上是如何工作的?