¿Cómo usar foreach en fputcsv?

5 minutos de lectura

avatar de usuario
Skurt

Estoy tratando de exportar los detalles del pedido de Woocommerce con un estado de pedido específico a un archivo de texto. Mi problema es que solo obtendrá detalles para un pedido porque no estoy usando foreach. ¿Alguien sabe cómo puedo cambiar mi código para que obtenga todos los pedidos en filas separadas?

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);

avatar de usuario
Steve

Parece que has cerrado la foreach() temprano: abra el archivo sobre el bucle, coloque los encabezados en la parte superior y tenga el fputcsv() dentro de él y luego cierre el archivo fuera del ciclo. También debe usar el modo “a” – agregar – no “w” o sobrescribirá todo cada vez.

Mantenga su parte de WordPress y Query en la parte superior e intente este orden para el código, de modo que el ciclo pase sobre el fputcsv() cada vez que obtiene un nuevo elemento:

Si necesita colocar los encabezados dentro del archivo, este tiene un código adecuado 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)

La respuesta de Ross Smith II aquí podría ser útil fputcsv no escribe ningún dato en un archivo CSV

y es posible que deba agregar un “\n” al final de la línea (solo comillas dobles) para asegurarse de que no aparezcan todos en la misma línea que se desplaza por millas. Podría ser una referencia útil http://php.net/manual/en/function.fputcsv.php

Capítulo y versículo sobre foreach(): ¿Cómo funciona realmente PHP ‘foreach’?

¿Ha sido útil esta solución?