在订单历史记录中隐藏总计 table 并根据 WooCommerce 中的订单状态查看订单弹出窗口

Hide totals in the order history table and view order popup based on order status in WooCommerce

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

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

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

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

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

        $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”状态的订单,这基本上是在价格单元格中输入“-”。

如模板文件所示,两个总数都使用 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' table.


为避免这种情况,我们可以通过 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 );