Tovább a tartalomhoz

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, 2 prioritá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.

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

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

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 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ő 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:

Tiszteletben tartjuk a magánszférádat

Sütiket használunk a böngészési élmény javítására és a forgalom elemzésére. Az analitika csak akkor indul, ha engeded. Adatvédelmi irányelvek, Sütitájékoztató.

Sütibeállítások