首页 > 解决方案 > 在订单历史记录表中隐藏总计,并根据 WooCommerce 中的订单状态查看订单弹出窗口

问题描述

我正在使用一个订单提案插件,它在结帐页面上为用户创建一个自定义网关,这样当他们结帐时,他们的订单就会以“已请求提案”状态创建。

目前,我已经设置了我的网站,以便价格隐藏在前端(在大多数地方,如产品循环、单个商店页面、购物车、迷你购物车、结帐等),因为网站的流程是

  1. 客户将他们想要的物品添加到购物车中。
  2. 他们在结帐页面上请求报价,然后他们的订单被创建,订单状态设置为“已请求提案”。目前,客户在其订单历史记录表中看到此订单,并显示其订单的总数。
  3. 店长收到通知,在填写所要求的产品价格等后,将订单状态从“已请求提案”更改为“提案”。
  4. 客户收到提案已发送的通知,他们可以接受或拒绝该提案。此时,当订单状态设置为“建议”时,客户最终应该能够在其订单历史记录表的“总计”列中看到该特定订单的总数。

所以基本上,我要做的是,如果特定订单的订单状态设置为“proposal_requested”,那么该订单的“总计”列中的单元格应该显示适用的内容,如“-”或“N/A” ",因为在向他们发送报价之前,客户不得查看价格。如果可能,该订单状态的“查看订单”弹出窗口中的价格也应该被隐藏。

这是我迄今为止尝试过的方法,可以从订单视图弹出窗口中的表格中删除价格列。

        $order_data     = $order->get_data();
        $order_status   = $order_data['status'];

        if( $order_status == 'order-proposalreq' ) {              
            echo '<td class="woocommerce-table__product-total product-total"> - </td>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 
        }
        else{
            echo '<td class="woocommerce-table__product-total product-total">' . $order->get_formatted_line_subtotal( $item ) . '</td>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 
        }

这基本上在价格单元格中为处于“order-proposalreq”状态的订单输入“-”。

标签: phpwordpresswoocommerceorders

解决方案


从模板文件中可以看出,两个总计都使用该get_formatted_order_total()函数。

因此,要根据订单状态调整总计的显示,我们可以使用woocommerce_get_formatted_order_total过滤器挂钩。

注意:根据您的需要调整“有订单状态”:

function filter_woocommerce_get_formatted_order_total( $formatted_total, $order, $tax_display, $display_refunded ) {
    // For a certain order status
    if ( $order->has_status( 'completed' ) ) {
        return __( 'N/A', 'woocommerce' );
    }
    
    // Show the original
    return $formatted_total;
}
add_filter( 'woocommerce_get_formatted_order_total', 'filter_woocommerce_get_formatted_order_total', 10, 4 );

结果:

在此处输入图像描述

如您所见,这在这两种情况下都有效,只是订单历史记录表中多了一个文本“for ... items” 。


为了避免这种情况woocommerce_my_account_my_orders_column_{$column_id},我们可以通过钩子覆盖现有的列。

// Overwrite the existing 'order-total' column
function filter_woocommerce_my_account_my_orders_column_order_total( $order ) { 
    // For a certain order status
    if ( $order->has_status( 'completed' ) ) {
        echo __( 'N/A', 'woocommerce' );
    // Show the original
    } else {
        // Get item count
        $item_count = $order->get_item_count() - $order->get_item_count_refunded();
        
        // translators: 1: formatted order total 2: total order items
        echo wp_kses_post( sprintf( _n( '%1$s for %2$s item', '%1$s for %2$s items', $item_count, 'woocommerce' ), $order->get_formatted_order_total(), $item_count ) );
    }
}
add_action( 'woocommerce_my_account_my_orders_column_order-total', 'filter_woocommerce_my_account_my_orders_column_order_total', 10, 1 );

推荐阅读