📅  最后修改于: 2023-12-03 15:21:12.306000             🧑  作者: Mango
在 Woocommerce 中,可以使用 WooCommerce PDF Invoices & Packing Slips 插件将发票转换为 PDF 格式进行输出。但是,有时候我们需要将发票以 HTML 格式输出,本文就将介绍如何实现这一功能。
首先,我们需要使用 WooCommerce 提供的 woocommerce_email_before_order_table
钩子来添加我们自己的 HTML 内容到订单邮件中。我们可以将以下代码添加到 functions.php
中(如果主题有定制文件的话,则建议在子主题中添加):
add_action( 'woocommerce_email_before_order_table', 'add_invoice_to_email', 10, 2 );
function add_invoice_to_email( $order, $sent_to_admin ) {
$invoice_id = get_post_meta( $order->get_id(), '_invoice_id', true );
$invoice_url = get_post_meta( $order->get_id(), '_invoice_url', true );
if ( $invoice_id && $invoice_url ) {
echo '<p>' . __( 'Invoice:', 'woocommerce' ) . ' <a href="' . esc_url( $invoice_url ) . '">' . esc_html( $invoice_id ) . '</a></p>';
}
}
在代码中,我们首先获取订单元数据中的 _invoice_id
和 _invoice_url
,再使用 woocommerce_email_before_order_table
钩子将发票信息输出到订单邮件中。
为了生成 HTML 发票,我们需要创建一个自定义页面模板(模板名称可以是 invoice-template.php
)。对于页面模板,我们建议在子主题中创建一个独立的目录,如 invoice-templates
,然后在该目录中创建页面模板文件。
以下是一个示例的页面模板,你可以在其中包含你自己公司的样式和 logo:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo esc_html__( 'Invoice', 'woocommerce' ); ?></title>
<style type="text/css">
/* your custom styles here */
</style>
</head>
<body>
<div class="header">
<img src="<?php echo esc_url( 'your-logo.jpg' ); ?>" alt="<?php echo esc_html__( 'Your Logo', 'woocommerce' ); ?>">
<h1><?php echo esc_html__( 'Invoice', 'woocommerce' ); ?></h1>
</div>
<table class="invoice-details">
<tbody>
<tr>
<td><?php echo esc_html__( 'Order ID', 'woocommerce' ); ?>:</td>
<td><?php echo esc_html( $order->get_id() ); ?></td>
</tr>
<tr>
<td><?php echo esc_html__( 'Date', 'woocommerce' ); ?>:</td>
<td><?php echo esc_html( date_i18n( get_option( 'date_format' ), strtotime( $order->get_date_created() ) ) ); ?></td>
</tr>
<tr>
<td><?php echo esc_html__( 'Total', 'woocommerce' ); ?>:</td>
<td><?php echo esc_html( wc_price( $order->get_total() ) ); ?></td>
</tr>
<tr>
<td><?php echo esc_html__( 'Payment Method', 'woocommerce' ); ?>:</td>
<td><?php echo esc_html( $order->get_payment_method_title() ); ?></td>
</tr>
</tbody>
</table>
<table class="invoice-items">
<thead>
<tr>
<th><?php echo esc_html__( 'Product', 'woocommerce' ); ?></th>
<th><?php echo esc_html__( 'Quantity', 'woocommerce' ); ?></th>
<th><?php echo esc_html__( 'Price', 'woocommerce' ); ?></th>
<th><?php echo esc_html__( 'Subtotal', 'woocommerce' ); ?></th>
</tr>
</thead>
<tbody>
<?php
foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product();
?>
<tr>
<td><?php echo esc_html( $product->get_title() ); ?></td>
<td><?php echo esc_html( $item->get_quantity() ); ?></td>
<td><?php echo esc_html( wc_price( $item->get_total() / $item->get_quantity() ) ); ?></td>
<td><?php echo esc_html( wc_price( $item->get_total() ) ); ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
</body>
</html>
在以上代码中,我们使用了 $order
对象来获取订单的相关信息,并将其输出到了 HTML 中。
最后,在订单详情页中,我们可以使用以下代码片段,将 HTML 发票作为订单元数据保存,并输出到页面中:
// Load the "Invoice" page template
add_filter( 'template_include', 'custom_template' );
function custom_template( $template ) {
// Check if this is the "Order Received" page
if ( is_order_received_page() ) {
// Load the "Invoice" page template
return get_stylesheet_directory() . '/invoice-templates/invoice-template.php';
}
return $template;
}
// Save invoice details as order meta
add_action( 'woocommerce_thankyou', 'save_invoice_details' );
function save_invoice_details( $order_id ) {
// Fetch and sanitize your invoice data
$invoice_id = 'Invoice-' . $order_id;
$invoice_html = ob_get_clean();
// Save the invoice HTML and ID as order meta
update_post_meta( $order_id, '_invoice_id', $invoice_id );
update_post_meta( $order_id, '_invoice_html', $invoice_html );
}
在以上代码中,custom_template()
函数将加载我们之前创建的 invoice-template.php
模板,而 save_invoice_details()
函数则将生成的 HTML 发票保存到订单元数据中。
通过以上的步骤,我们成功地将 Woocommerce 发票以 HTML 格式输出到了订单邮件中和订单详情页中。这样,客户就可以方便地获得他们购买的产品的发票信息了。
希望这篇文章对你有帮助!