📜  woocommerce 发票到 html 输出 (1)

📅  最后修改于: 2023-12-03 15:21:12.306000             🧑  作者: Mango

Woocommerce 发票到 HTML 输出

在 Woocommerce 中,可以使用 WooCommerce PDF Invoices & Packing Slips 插件将发票转换为 PDF 格式进行输出。但是,有时候我们需要将发票以 HTML 格式输出,本文就将介绍如何实现这一功能。

使用 WooCommerce 提供的钩子

首先,我们需要使用 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 发票

为了生成 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 发票

最后,在订单详情页中,我们可以使用以下代码片段,将 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 格式输出到了订单邮件中和订单详情页中。这样,客户就可以方便地获得他们购买的产品的发票信息了。

希望这篇文章对你有帮助!