Php 仅显示购物车项目中的特定预订元数据

Php 仅显示购物车项目中的特定预订元数据,php,wordpress,woocommerce,cart,woocommerce-bookings,Php,Wordpress,Woocommerce,Cart,Woocommerce Bookings,我喜欢有趣的WooCommerce和WooCommerce预订插件。在他们的文档中,有一种通过使用“人员”数量预订多个项目的解决方案 所以预订插件所做的,它向变体广告元数据,它还包括“人”,我们目前使用的“人”作为预订项目数量的指标 接下来我们要从产品变体中检索元数据[Persons],并将其显示为项目数量 到目前为止,我所做的是编辑woocommerce购物车模板并将其复制到我们的子主题。(我们不能用钩子,因为商店桌子上没有可用的钩子) 我需要弄清楚的是,如何过滤这些变化,并只显示我需要的

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

所以预订插件所做的,它向变体广告元数据,它还包括“人”,我们目前使用的“人”作为预订项目数量的指标

接下来我们要从产品变体中检索元数据[Persons],并将其显示为项目数量

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


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

下一步是只过滤要显示在另一个元数据列上的开始日期和结束日期

[编辑18/02]

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

我试图使用“wc\u display\u item\u 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']

也许有人能帮我指出如何筛选数组中所需的项目?

该功能不可用于购物车或购物车项目。它明确用于
WC\u Order\u 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() ) { /* … … */ }
因此,此函数在您的情况下不起作用


如何做(2种方式):

1) 您可以使用两个自定义挂钩函数,这将删除除“Persons”之外的所有预订数据,并且只删除可预订产品的数量

// 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文件中

测试和工作


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;
}
//删除可预订产品的已显示购物车项目元数据
添加过滤器('woocommerce\u get\u item\u data','remove\u cart\u data\u for\u bookings',20,2);
功能删除预订的购物车数据($cart\u data,$cart\u item){
//检查是否为可预订产品,以及是否为购物车页面
如果(!isset($cart_item['booking'])| |!is_cart())返回$cart_数据;//退出
//循环浏览此购物车项目数据
foreach($key=>$value的购物车数据){
//删除所有显示的数据
未设置($cart_data[$key]);
}
返回$cart_数据;
}
//添加“人员”以替换可预订产品的购物车数量
添加过滤器('woocommerce\u cart\u item\u quantity','replace\u cart\u quantity\u for\u bookings',20,3);
函数替换预订的购物车数量($product\U QUOTE,$cart\U item\U key,$cart\U item){
//检查是否为可预订产品
如果(isset($cart_item['booking'])){
$product\U QUOTE='.$cart\U item['booking']['Persons'].
("人","商业");; } 返回$product\U数量; }
此代码位于活动子主题(或主题)的function.php文件中

测试和工作

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


在产品页面上,预订插件没有提供数量字段?请提供url。亲爱的ShashiKumar,预订插件确实提供了数量url,但我们希望使用“persons”来表示为预订添加的自行车总数。我已经用更好的图片编辑了主页。谢谢Loic!我确实有一个错误,我试图删除非预订项目的数量编号;“致命错误:Uncaught ArgumentCounter错误:参数太少,无法执行函数remove_cart_quantity_for_bookings(),第xxx行传递了2个参数,预期正好有3个”@KevinD。我重新测试了我的第二条代码,没有发现任何错误…您是否正在尝试删除所有产品上的“数量”字段?似乎您自己的定制有一个错误…您最好在这里询问您想要更改什么,并提供必要的详细信息。你也应该接受这个答案,因为它回答了你最初的问题。谢谢
// 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;
}