Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use foreach in fputcsv?

I am trying to export woocommerce order details with a specific order status into a textfile. My problem is that it will only get details for one order because I am not using foreach. Does anyone know how I can change my code so it will get all orders in separate rows?

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);
like image 540
Skurt Avatar asked Oct 31 '22 12:10

Skurt


1 Answers

You seem to have closed the foreach() early - open the file above the loop, put the headers at the top, and have the fputcsv() inside it then close the file outside the loop. You also need to use the "a" - append - mode not "w" or it will overwrite everything each time.

Keep your WordPress and Query part at the top and try this order for the code, so that the loop passes over the fputcsv() each time it gets a new item:

If you need to put the headers inside the file this has suitable code 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)

Ross Smith II's answer here might be useful fputcsv doesn't write any data in a CSV file

and you might need to add a "\n" at the end of the line (double quotes only) to make sure they don't all appear on the same line which scrolls across for miles. Might be handy reference http://php.net/manual/en/function.fputcsv.php

Chapter and verse on foreach(): How does PHP 'foreach' actually work?

like image 118
Steve Avatar answered Nov 15 '22 07:11

Steve