仅在购物车商品中显示特定的Woocommerce Bookings元数据

时间:2018-02-17 10:36:57

标签: php wordpress woocommerce cart woocommerce-bookings

我喜欢WooCommerce和WooCommerce Bookings插件。在他们的文档中,有这个解决方案,通过使用“人”数量预订多个项目。

那么预订插件的作用是什么,它将元数据广告给变体,它还包括我们当前用作预订物品数量指标的“人”。

我们接下来想要从产品变体中检索元数据[人物]并将其显示为商品数量。

到目前为止我所做的是编辑woocommerce购物车模板并将其复制到我们的子主题。 (我们不能使用钩子,因为商店桌子里没有可用的钩子。)

</td>   
<!-- Use [_persons] as product quantity  -->
<td class="product-quantity--booking">
    <?php
        if ( ! empty( $cart_item['booking'] ) ) {
            echo WC()->cart->get_item_data( $cart_item );
        }
    ?>
</td>

我需要弄清楚的是,如何过滤这些变化并仅显示我需要的元数据?我只需要显示元数据“人”。

enter image description here

接下来的事情是仅过滤开始日期和结束日期以显示在其他元数据列上。

[编辑18/02]

所以我发现我不能使用“get_item_date”,因为它不会使用任何参数来显示特定值。

我尝试使用“wc_display_item_meta”,但我不知道如何选择我需要的项目。

<!-- Use ['Persons'] as product quantity  -->
<td class="product-quantity--booking">
    <?php
        if ( ! empty( $cart_item['booking'] ) ) {
            $item_meta = wc_display_item_meta( $cart_item['booking']['Persons'])
            echo $item_meta;
        }
    ?>
</td>

通过使用vardump,我发现我需要的密钥是“['booking']['Persons']

也许有人可以帮我指出如何过滤所需物品的数组?

1 个答案:

答案 0 :(得分:3)

{* 3}}功能不得用于购物车或购物车商品。它明确用于WC_Order_Item,其中$item参数是订单项。

您将在源代码中看到:

/**
 * Display item meta data.
 *
 * @since  3.0.0
 * @param  WC_Order_Item $item Order Item.
 * @param  array         $args Arguments.
 * @return string|void
 */
function wc_display_item_meta( $item, $args = array() ) { /* … … */ }

所以这个功能在你的情况下不起作用。

怎么做(2ways)

1)您可以使用两个自定义挂钩功能,这将删除除“人员”之外的所有预订数据,这将仅删除您的可预订产品的数量。

// Display only 'Persons' for bookable products
add_filter( 'woocommerce_get_item_data', 'display_only_persons_for_bookings', 20, 2 );
function display_only_persons_for_bookings( $cart_data, $cart_item ){
    // Check that is a bookable product and that is Cart page
    if( ! isset($cart_item['booking']) || ! is_cart() ) return $cart_data; // Exit
    // Loop through this cart item data
    foreach($cart_data as $key =>$values){
        // Checking that there is some data and that is Cart page
        if( ! isset($values['name']) || ! is_cart() ) return $cart_data; // Exit

        // Removing ALL displayed data except "Persons"
        if( $values['name'] != __('Persons','woocommerce') ){
            unset($cart_data[$key]);
        }
    }
    return $cart_data;
}

// Remove cart quantity for bookable products
add_filter( 'woocommerce_cart_item_quantity', 'remove_cart_quantity_for_bookings', 20, 3 );
function remove_cart_quantity_for_bookings( $product_quantity, $cart_item_key, $cart_item ){
    // Check that is a bookable product
    if( isset($cart_item['booking']) )
        $product_quantity = '';

    return $product_quantity;
}

此代码位于您的活动子主题(或主题)的function.php文件中。

经过测试和工作。

wc_display_item_meta()

2)或者您可以删除所有预订显示的元数据并在数量字段中显示“人员”:

// Remove displayed cart item meta data for bookable products
add_filter( 'woocommerce_get_item_data', 'remove_cart_data_for_bookings', 20, 2 );
function remove_cart_data_for_bookings( $cart_data, $cart_item ){
    // Check that is a bookable product and that is Cart page
    if( ! isset($cart_item['booking']) || ! is_cart() ) return $cart_data; // Exit
    // Loop through this cart item data
    foreach($cart_data as $key =>$values){
        // Removing ALL displayed data
        unset($cart_data[$key]);
    }
    return $cart_data;
}

// Add "Persons" to replace cart quantity for bookable products
add_filter( 'woocommerce_cart_item_quantity', 'replace_cart_quantity_for_bookings', 20, 3 );
function replace_cart_quantity_for_bookings( $product_quantity, $cart_item_key, $cart_item ){
    // Check that is a bookable product
    if( isset($cart_item['booking']) ){
        $product_quantity  = '<span style="text-align: center; display:inline-block;">'.$cart_item['booking']['Persons'].'<br>
        <small>(' . __('persons','woocommerce') . ')</small><span>';
    }
    return $product_quantity;
}

此代码位于您的活动子主题(或主题)的function.php文件中。

经过测试和工作

  

如果您只管理预订产品,则可以在模板cart / cart.php中将“数量”列标签重命名为“人员”(通过您的活动主题覆盖它)。

enter image description here