在Woocommerce上处理产品类型。

问题描述 投票:0回答:1

我真的很困惑,如果我尝试以这种方式获得Woocommerce中的产品类型,如何正确地获得它。

$product->get_type();

它总是返回 simple 即使产品是可变的,我又尝试了以下的方法。

$terms = get_the_terms($this->product->get_id(), 'product_type');
$product_type = (!empty($terms)) ? sanitize_title(current($terms)->name) : 'simple';

从上面的代码中可以看出,它得到了分类学的结果 product_type 并返回分类名(如果存在),否则返回 simple.

然而,它仍然返回 simple 即使产品是可变的,我现在不知道该怎么做,因为我从woocommerce钩子的参数中获取产品对象,我不知道它是什么类型的产品,我需要做这个验证。

如何在woocommerce中适当地获取产品的类型?

更新

按照要求,我将添加完整的代码,我使用,所以你有一个更好的背景下,我试图实现什么。

基本上,我想显示一个元字段作为一列在订单行项目管理编辑屏幕。

add_action( 'woocommerce_admin_order_item_values', 'ebani_add_cost_price_column_order_value_admin_edit', 10, 3);
function ebani_add_cost_price_column_order_value_admin_edit( $product, $item, $item_id ) {
    
    $order = $item->get_order();
    
    ?>
    <td class="item_cost_price" width="1%" data-sort-value="<?php echo esc_attr( $order->get_item_subtotal( $item, false, true ) ); ?>">
        <div class="view">
            <?php
            if( ! is_null( $product ) ){
                
                //The right way to get the product type
                $terms = get_the_terms( $product->get_id(), 'product_type' );
                $product_type = ( !empty( $terms ) ) ? sanitize_title( current( $terms )->name ) : 'simple';
                echo $product_type;
                if( $product_type == 'variable' ) {
                    $variation_id = $item->get_variation_id();
                    echo wc_price( get_post_meta( $variation_id, 'variation_cost', true ), array( 'currency' => $order->get_currency() ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                }elseif( $product_type == 'simple' ) {
                    echo wc_price( get_post_meta( $item->get_product_id(), 'cost_price', true ), array( 'currency' => $order->get_currency() ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                }else{
                    echo "No aplica";
                }
            } else {
                echo 'No aplica';
            }
            ?>
        </div>
    </td>
    <?php
}
php wordpress woocommerce
1个回答
0
投票

我不太明白在Woocommerce中使用 get_the_terms. get_type() 足够了。

// Add header
function action_woocommerce_admin_order_item_headers( $order ) {
    echo '<th class="line_mytitle sortable" data-sort="your-sort-option">My Title</th>';
}
add_action( 'woocommerce_admin_order_item_headers', 'action_woocommerce_admin_order_item_headers', 10, 1 );

//Add content
function action_woocommerce_admin_order_item_values( $product, $item, $item_id ) {
    $order = $item->get_order();

    ?>
    <td class="item_cost_price" width="1%" data-sort-value="<?php echo esc_attr( $order->get_item_subtotal( $item, false, true ) ); ?>">
        <div class="view">
            <?php
            if( ! is_null( $product ) ) {
                // Get product type
                $product_type = $product->get_type();

                echo 'product type = ' . $product_type . '<br>';

                if( $product_type == 'variation' ) {
                    $variation_id = $item->get_variation_id();
                    echo wc_price( get_post_meta( $variation_id, 'variation_cost', true ), array( 'currency' => $order->get_currency() ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                } elseif( $product_type == 'simple' ) {
                    echo wc_price( get_post_meta( $item->get_product_id(), 'cost_price', true ), array( 'currency' => $order->get_currency() ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                } else {
                    echo "No aplica";
                }
            } else {
                echo 'No aplica';
            }
            ?>
        </div>
    </td>
    <?php
}
add_action( 'woocommerce_admin_order_item_values', 'action_woocommerce_admin_order_item_values', 10, 3 );
© www.soinside.com 2019 - 2024. All rights reserved.