Как использовать foreach в 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);

person Skurt    schedule 25.12.2015    source источник


Ответы (1)


Кажется, вы закрыли foreach() раньше - откройте файл над циклом, поместите заголовки вверху и поместите fputcsv() внутри него, а затем закройте файл вне цикла. Вам также нужно использовать режим "a" - append, а не "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]", "[accountforeach()type]", "[accountforeach()number]", "[accountforeach()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)

Ответ Росса Смита II здесь может быть полезен данные в файле CSV

и вам может понадобиться добавить «\n» в конце строки (только двойные кавычки), чтобы убедиться, что они не все появляются в одной строке, которая прокручивается на мили. Может быть полезна ссылка http://php.net/manual/en/function.fputcsv.php

Глава и стих о foreach(): Как на самом деле работает PHP foreach?

person Steve    schedule 26.12.2015