如何在 Woocommerce 的管理订单详细信息页面中显示全价(含税)?

问题描述 投票:0回答:2

在 Woocommerce 的管理订单详细信息页面中,除了“不含税价格”和“税费”之外,我还希望显示客户为每个商品行支付的全价(含税)。 令人惊讶的是,它并不是 woo-commerce 的核心选项。 到目前为止,我已经关注了 Woocommerce - 在管理订单摘要中显示全价(含税)Woocommerce - 管理订单详细信息页面。 我已经尝试了两个不同的代码片段(感谢分享它的人),并且它可以很好地添加一个列,其中包含几乎所有情况的价格(包括税费)

除了,它会导致致命错误/退款订单中断,这对商业网站来说并不好,正如你可以想象的那样。

你能帮我吗?我是 PHP 新手,正在学习 PHP,所以我不是专家,我找不到代码中出了什么问题。

现在我正在使用 Honza Kopecky 提供的代码(谢谢!)在 https://stackoverflow.com/a/69532601/17338625 :

function action_woocommerce_admin_order_item_values( $null, WC_Order_Item $item) {
$val = floatval($item->get_total()) + floatval($item->get_total_tax());
?>
<td class="item_full_cost" data-sort-value="<?= $val ?>">
    <div class="view" style="font-weight: bold; text-align: right; padding-right: 10px;">
        <?= wc_price($val, ['currency' => $item->get_order()->get_currency()]) ?>
    </div>
    <?php
    $refunded = $item->get_order()->get_total_refunded_for_item( $item->get_id() );

    if ( $refunded ) {
        echo '<small class="refunded">-' . wc_price( $refunded, array( 'currency' => $item->get_order()->get_currency() ) ) . '</small>';
    }
    ?>
</td>
<?php
};
add_action( 'woocommerce_admin_order_item_values', 'action_woocommerce_admin_order_item_values', 10, 2 );


function action_woocommerce_admin_order_item_headers( $order ) {
    echo '<th class="line_full_cost sortable" data-sort="float" style="font-weight:bold;text-align: right;">' . __('Price incl. VAT') .'</th>';
};
add_action( 'woocommerce_admin_order_item_headers', 'action_woocommerce_admin_order_item_headers', 10, 3 );

我想对于退款订单,某些功能不同或某些金额为负数,也许这就是这个代码片段导致致命错误的原因? 也许在代码中添加一个条件会更容易,而不是在订单退款时显示含税价格?但我不知道该怎么办...

非常感谢您的宝贵时间!

php woocommerce admin
2个回答
0
投票

刚刚找到了一些可能对您有所帮助的钩子。

首先,我们使用 woo 在 html-order-items.php 中提供的钩子添加一个额外的表头

 add_action('woocommerce_admin_order_item_headers', 'order_header',10,1);

function order_header($order){
    ?>
        <th class="total_with_vat sortable" colspan="2" data-sort="float"><?php esc_html_e( 'Total + Vat', 'woocommerce' ); ?></th>
    <?php
}

然后使用 woocommerce_admin_order_item_values 添加额外的表字段并获取产品价格。我做了几项检查。首先你应该检查当前对象是否是产品,因为在订单项目中不仅有产品,还有,运输 - 运输类型,费用 - 费用类型rudrastyh 在这里做一个很好的解释

第二次检查是当我显示总价时,我检查产品 $item['total'] 是否等于 0,因为它可能是礼物或免费,所以不需要显示价格。

    add_action('woocommerce_admin_order_item_values', 'show_total', 10, 3);

function show_total( $product, $item, $item_id ){
    if (!is_a($product, 'WC_Product')){
        return;
    }
?>
        <td class="item_total_cost" colspan="2" width="1%">
        <div class="view">
            <?php
            echo ($item['total'] >  0) ? $product->get_price() . get_woocommerce_currency_symbol() : $item['total'] . get_woocommerce_currency_symbol() ;
            ?>
        </div>
    </td>
<?php
}

0
投票

您引用的 Honza Kopecky 提供的答案绝对应该让您接近您所需要的。

您是对的,当尝试进行退款并触发错误时,系统的行为有所不同,这并不是因为负值,而是因为

woocommerce_admin_order_item_values
钩子在订单项目更改和退款时都会触发 就 WooCommerce 而言,不完全订单,在这种情况下传递给您的钩子的
$item
也是WC_Order_Item类的一个实例,这会触发错误消息。您可以通过删除函数声明中的强类型类名来解决此问题:

function action_woocommerce_admin_order_item_values( $null, $item)

您也正确地认为需要进行

if

条件检查来处理不同的行为,它可能看起来像这样:

if ( 'line_item' == $item->get_type() ) { /* rest of code */ }}

这是一项检查,以确保您正在处理订单行项目,以便像 

$item->get_order()->get_currency()

这样的方法不会抛出类似

Uncaught Error: Call to a member function get_currency() on bool
. 的错误 所以修改后的代码可能看起来像这样:

function action_woocommerce_admin_order_item_values( $null, $item ) { $val = floatval($item->get_total()) + floatval($item->get_total_tax()); if ( 'line_item' == $item->get_type() ) { ?> <td class="item_full_cost" data-sort-value="<?= $val ?>"> ... </td> <?php } };

或者...您也可以安装我的团队构建的插件(
https://wordpress.org/plugins/rd-wc-order-modifier/

),该插件将此功能添加到订单屏幕,因为我们遇到了非常同样的问题!

© www.soinside.com 2019 - 2024. All rights reserved.