It seems you closed foreach() earlier - open the file above the path, place the headers at the top and close the file outside of the loop inside fputcsv() . You also need to use "a" - append - mode, not "w", or it will overwrite everything every time.
Keep the WordPress and Query part at the top and try this order for the code so that the loop fputcsv() through fputcsv() every time it gets a new element:
If you need to place the headers inside the file, this has the appropriate 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 answer here may be useful fputcsv does not write any data to the CSV file
and you may need to add "\ n" at the end of the line (for double quotes only) to make sure that they are not all displayed on the same line, which scrolls in miles. Could be a handy link http://php.net/manual/en/function.fputcsv.php
Chapter and verse on foreach() : How does PHP foreach work?