在 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 );
我想对于退款订单,某些功能不同或某些金额为负数,也许这就是这个代码片段导致致命错误的原因? 也许在代码中添加一个条件会更容易,而不是在订单退款时显示含税价格?但我不知道该怎么办...
非常感谢您的宝贵时间!
刚刚找到了一些可能对您有所帮助的钩子。
首先,我们使用 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
}
您引用的 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/