Terméktáblázat és összesítő
A termékek táblázatának oszlopai, az összesítő sorainak átrendezése és a rendelési állapotok szűrése.
A termékek táblázatát két szűrő határozza meg, és a kettőt együtt kell módosítani:
pdf_template_table_headings: a táblázat fejléce (oszlopcímek).pdf_template_line_output: a tételsorok. A függvény két paramétert kap: a sorokat és a rendelés azonosítóját (10, 2prioritás és paraméterszám).
Ha az oszlopok száma vagy szélessége eltér a fejléc és a sorok között, a táblázat szétcsúszik, ezért a width értékek összege mindkét helyen 100% legyen.
Új oszlop: cikkszám (SKU)
Szekció neve “Új oszlop: cikkszám (SKU)”A példa kibővíti a táblázatot egy SKU oszloppal. A fejlécben a Qty, SKU, Product, Price Ex, Total Ex., Tax, Price Inc és Total Inc oszlop van, a tételsor pedig a rendelés tételein végigmenve ugyanezeket írja ki:
add_filter( 'pdf_template_table_headings', 'custom_pdf_table_headers' );function custom_pdf_table_headers() { $headers = '<table class="shop_table orderdetails" width="100%">' . '<thead>' . '<tr><th colspan="7" align="left"><h2>' . esc_html__( 'Order Details', PDFLANGUAGE ) . '</h2></th></tr>' . '<tr>' . '<th width="5%" valign="top" align="right">' . __( 'Qty', PDFLANGUAGE ) . '</th>' . '<th width="10%" valign="top" align="left">' . __( 'SKU', PDFLANGUAGE ) . '</th>' . '<th width="40%" valign="top" align="left">' . __( 'Product', PDFLANGUAGE ) . '</th>' . '<th width="9%" valign="top" align="right">' . __( 'Price Ex', PDFLANGUAGE ) . '</th>' . '<th width="9%" valign="top" align="right">' . __( 'Total Ex.', PDFLANGUAGE ) . '</th>' . '<th width="7%" valign="top" align="right">' . __( 'Tax', PDFLANGUAGE ) . '</th>' . '<th width="10%" valign="top" align="right">' . __( 'Price Inc', PDFLANGUAGE ) . '</th>' . '<th width="10%" valign="top" align="right">' . __( 'Total Inc', PDFLANGUAGE ) . '</th>' . '</tr>' . '</thead>' . '</table>';
return $headers;}
add_filter( 'pdf_template_line_output', 'custom_pdf_lines', 10, 2 );function custom_pdf_lines( $line, $order_id ) { $order = wc_get_order( $order_id ); $order_currency = $order->get_currency();
$pdflines = '<table width="100%"><tbody>';
foreach ( $order->get_items() as $item ) { if ( ! $item['qty'] ) { continue; }
$_product = $item->get_product(); $item_name = $item['name'];
$meta_display = ''; foreach ( $item->get_formatted_meta_data() as $meta ) { $meta_display .= '<br /><small>(' . $meta->display_key . ':' . wp_kses_post( strip_tags( $meta->display_value ) ) . ')</small>'; } if ( $meta_display ) { $item_name .= apply_filters( 'pdf_invoice_meta_output', $meta_display ); }
$pdflines .= '<tr>' . '<td valign="top" width="5%" align="right">' . $item['qty'] . ' x</td>' . '<td valign="top" width="10%">' . $_product->get_sku() . '</td>' . '<td valign="top" width="40%">' . stripslashes( $item_name ) . '</td>' . '<td valign="top" width="9%" align="right">' . wc_price( $item['line_subtotal'] / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' . '<td valign="top" width="9%" align="right">' . wc_price( $item['line_subtotal'], array( 'currency' => $order_currency ) ) . '</td>' . '<td valign="top" width="7%" align="right">' . wc_price( $item['line_subtotal_tax'] / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' . '<td valign="top" width="10%" align="right">' . wc_price( ( $item['line_subtotal'] + $item['line_subtotal_tax'] ) / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' . '<td valign="top" width="10%" align="right">' . wc_price( $item['line_subtotal'] + $item['line_subtotal_tax'], array( 'currency' => $order_currency ) ) . '</td>' . '</tr>'; }
$pdflines .= '</tbody></table>';
return $pdflines;}Az adó összege helyett az adókulcs
Szekció neve “Az adó összege helyett az adókulcs”Ugyanezzel a módszerrel a Tax (adó) oszlop helyett adókulcsot is kiírhatsz. A fejlécben az oszlop címe Tax Rate, a tételsorban pedig a cella értéke az adó és az adóalap hányadosa százalékban:
'<td valign="top" width="7%" align="right">' . 100 * ( $item['line_subtotal_tax'] / $item['line_subtotal'] ) . '%' . '</td>'A többi rész megegyezik az előző példával (a SKU oszlop nélkül, a Termék oszlop 50%-os szélességgel).
Kevesebb oszlop: csak bruttó árak
Szekció neve “Kevesebb oszlop: csak bruttó árak”Ha csak a mennyiséget, a terméket, a bruttó egységárat és a bruttó összeget akarod kiírni, a fejléc négy oszlopos legyen (Qty 10%, Product 54%, Price Inc 18%, Total Inc 18%), a tételsor pedig ezt adja ki:
'<td valign="top" width="10%" align="right">' . $item['qty'] . ' x</td>' .'<td valign="top" width="54%">' . $item_name . '</td>' .'<td valign="top" width="18%" align="right">' . wc_price( ( $item['line_subtotal'] + $item['line_tax'] ) / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' .'<td valign="top" width="18%" align="right">' . wc_price( $item['line_subtotal'] + $item['line_tax'], array( 'currency' => $order_currency ) ) . '</td>'A termék nevének kiegészítése
Szekció neve “A termék nevének kiegészítése”A pdf_invoice_item_name szűrő a tétel nevét módosítja, ha nem akarod az egész sort újraírni. Paraméterei: a név, a rendelési tétel, a termék és a rendelés. Példa a termék leírásának hozzáadására:
add_filter( 'pdf_invoice_item_name', 'add_product_description_pdf_invoice_item_name', 10, 4 );function add_product_description_pdf_invoice_item_name( $item_name, $item, $product, $order ) { $item_name .= '<p>' . $product->get_description() . '</p>'; return $item_name;}A tétel meta-adatainak kiírását a pdf_invoice_meta_output szűrő módosítja.
Az összesítő rész
Szekció neve “Az összesítő rész”Az összesítő blokkot ([[PDFORDERTOTALS]]) a bővítmény egyetlen ciklussal építi fel: végigmegy a rendelés összegsorain (get_order_item_totals()), a fizetési módot kihagyja, és minden sort két cellás táblázatsorként ír ki. A kimenetet a pdf_template_order_totals szűrő módosítja:
$order_item_totals = $order->get_order_item_totals();unset( $order_item_totals['payment_method'] );
$output = '';foreach ( $order_item_totals as $order_item_total ) { $output .= '<tr>' . '<td align="right"><strong>' . $order_item_total['label'] . '</strong></td>' . '<td align="right"><strong>' . $order_item_total['value'] . '</strong></td>' . '</tr>';}$output = apply_filters( 'pdf_template_order_totals', $output, $order_id );Ezzel a szűrővel a sablon módosítása nélkül átrendezheted az összesítő sorait. A példa a sorrendet Szállítás, Részösszeg, adók, Összesen alakra állítja, a részösszeghez hozzáadja a szállítási költséget, és ha volt visszatérítés, egy extra sort ír ki a visszatérített összegről:
add_filter( 'pdf_template_order_totals', 'custom_totals_layout_pdf_template_order_totals', 10, 2 );function custom_totals_layout_pdf_template_order_totals( $output, $order_id ) { if ( ! $order_id ) { return; }
$order = wc_get_order( $order_id ); $order_currency = $order->get_currency(); $order_item_totals = $order->get_order_item_totals();
$cart_subtotal = $order_item_totals['cart_subtotal']; $shipping = $order_item_totals['shipping']; $order_total = $order_item_totals['order_total'];
// A részösszeg a szállítási költséggel együtt. $subtotal = $order->get_subtotal(); $shipping_cost = $order->get_shipping_total(); $new_subtotal = wc_price( round( $subtotal + $shipping_cost, wc_get_price_decimals() ), array( 'currency' => $order_currency ) ); $replace_subtotal = wc_price( $subtotal, array( 'currency' => $order_currency ) ); $cart_subtotal['value'] = str_replace( $replace_subtotal, $new_subtotal, $cart_subtotal['value'] );
// Az adók kivételével minden sort kiveszünk. unset( $order_item_totals['cart_subtotal'], $order_item_totals['shipping'], $order_item_totals['payment_method'], $order_item_totals['order_total'] );
// Új sorrend. $new_order_item_totals['shipping'] = $shipping; $new_order_item_totals['cart_subtotal'] = $cart_subtotal; foreach ( $order_item_totals as $key => $value ) { $new_order_item_totals[ $key ] = $value; } $new_order_item_totals['order_total'] = $order_total;
$output = ''; foreach ( $new_order_item_totals as $order_item_total ) { $output .= '<tr>' . '<td align="right"><strong>' . $order_item_total['label'] . '</strong></td>' . '<td align="right"><strong>' . $order_item_total['value'] . '</strong></td>' . '</tr>'; }
if ( $order->get_total_refunded() > 0 ) { $output .= '<tr>' . '<td align="right"><strong>Visszatérített összeg:</strong></td>' . '<td align="right"><strong>' . wc_price( $order->get_total_refunded(), array( 'currency' => $order_currency ) ) . '</strong></td>' . '</tr>'; }
return $output;}Ha csak a szállítás értékét akarod a leírás nélkül, használd ezt a sort a $order_item_totals['shipping']['value'] értékére:
wc_price( round( $order->get_shipping_total(), wc_get_price_decimals() ), array( 'currency' => $order_currency ) );Az összesítő sorai külön cimkékkel
Szekció neve “Az összesítő sorai külön cimkékkel”A [[PDFORDERTOTALS]] cimke helyett használhatod a sorok külön cimkéit is, tetszőleges sorrendben: [[PDFORDERSUBTOTAL]], [[PDFORDERSHIPPING]], [[PDFORDERDISCOUNT]], [[PDFORDERTAX]], [[PDFORDERTOTAL]]. Minden sor kimenetét külön szűrő módosítja (mindegyik paramétere a kimenet és a rendelés azonosítója):
$output = apply_filters( 'pdf_template_order_subtotal', $output, $order_id );$output = apply_filters( 'pdf_template_order_shipping', $output, $order_id );$output = apply_filters( 'pdf_template_order_discount', $output, $order_id );$output = apply_filters( 'pdf_template_order_tax', $output, $order_id );$output = apply_filters( 'pdf_template_order_total', $output, $order_id );A kuponok sorát a pdf_template_order_coupons, a megjegyzések blokkját a pdf_template_order_notes szűrő módosítja. A külön sorokra szóló szűrők alapból nincsenek használatban, az alapértelmezett kimenetet a pdf_template_order_totals adja.
Régebben az összesítő minden sorát külön függvény kezelte, ma egyetlen ciklus. Ha még a régi szűrőidet használod, és a sablont nem másoltad a témába, azok már nem működnek. Ha a sablont a témádba másoltad, a módosításaid megmaradnak.
Rendelési állapotok, amelyeknél számla készül
Szekció neve “Rendelési állapotok, amelyeknél számla készül”A pdf_invoice_order_status_array szűrővel bővítheted (vagy lecserélheted) azoknak a rendelési állapotoknak a listáját, amelyeknél a bővítmény számlát készít. Példa egy saját állapot (dispensing) hozzáadására:
add_filter( 'pdf_invoice_order_status_array', 'add_custom_order_status_to_pdf_invoice_order_status_array', 99, 2 );function add_custom_order_status_to_pdf_invoice_order_status_array( $order_status_array ) { $order_status_array[] = 'dispensing'; return $order_status_array;}Ha a teljes listát le akarod cserélni, a függvény visszatérési értéke legyen a saját tömb, például array( 'dispensing' ).
Készült: