Các thuật ngữ thuộc tính sản phẩm được phân tách bằng dấu phẩy nếu có nhiều giá trị

Jan 13 2021

Trong WooCommerce, tôi hiện đang xây dựng một chức năng sẽ lặp lại một số thuộc tính sản phẩm trong trang cửa hàng. Tôi muốn phân tách các giá trị này bằng dấu phẩy nếu có sẵn nhiều giá trị thuộc tính, nhưng tôi không biết làm thế nào.

Mã của tôi:

add_action('woocommerce_after_shop_loop_item_title', 'TitleVariations', 10);
function TitleVariations()
{
global $product; $colormonth = $product->get_attribute('color-month'); $finish = $product->get_attribute('finish'); $design = $product->get_attribute('design'); echo '<span class="variation-display">'; echo __($colormonth, 'woocommerce');
echo __($finish, 'woocommerce'); echo __($crossdesign, 'woocommerce');
echo '</span>';
}

Trả lời

2 LoicTheAztec Jan 13 2021 at 22:50

Phương thức WC_Product get_attribute()cung cấp một chuỗi giá trị được phân tách bằng dấu phẩy khi có nhiều hơn một giá trị… Bạn cũng cần kiểm tra xem mỗi thuộc tính khác nhau đều có trong danh sách một thuật ngữ…

Để lấy tên nhãn thuộc tính sản phẩm, bạn có thể sử dụng wc_attribute_label()hàm thuộc tính sản phẩm.

1). Nếu bạn muốn nhận từng thuộc tính sản phẩm với tên nhãn và (các) giá trị thuật ngữ (mỗi thuộc tính khác nhau trong một dòng), bạn sẽ sử dụng cách sau để thay thế.

Bộ xử lý mã này cũng có các thuộc tính sản phẩm tùy chỉnh :

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product; // Here define your product attribute names (slugs) $attribute_names = array('color-month', 'finish', 'design'); 
    $attributes = array(); // Initializing // Loop Through product attributes array foreach( $attribute_names as $attribute_name ) { if( taxonomy_exists( 'pa_' . $attribute_name )  ) {
            $attribute = 'pa_' . $attribute_name; // Custom taxonomy
        } else {
            $attribute = $attribute_name; // Custom attribute (not a taxonomy)
        }

        $values_str = $product->get_attribute($attribute); if ( $values_str ) {
            $attributes[] = '<strong>' . wc_attribute_label($attribute) . ':</strong> ' . $values_str; } } // Output product attribute label / values pairs (one by line) if( ! empty( $attributes ) ) { 
        echo '<span class="variation-display">' . implode( '<br>', $attributes ) . '</span>';
    }
}

2). Nhưng nếu bạn muốn nhận tất cả các điều khoản thuộc tính sản phẩm của mình dưới dạng chuỗi được phân tách bằng dấu phẩy, mã của bạn sẽ giống như trong Hiển thị các thuộc tính sản phẩm cụ thể dưới tiêu đề sản phẩm trong các trang lưu trữ của Woocommerce .

Vì vậy, đối với mã của bạn:

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product;
        
    $color_month = $product->get_attribute('color-month');
    $finish = $product->get_attribute('finish');
    $design = $product->get_attribute('design');

    $attributes = array(); // Initializing if ( $color_month ) {
        $attributes[] = $color_month;
    }
    if (  $finish ) { $attributes[] = $finish; } if ( $design ) {
        $attributes[] = $design;
    }

    // Output product attribute values
    if( ! empty( $attributes ) ) { echo '<span class="variation-display">' . implode( ', ', $attributes ) . '</span>';
    }
}

Mã nằm trong tệp functions.php của chủ đề con đang hoạt động (hoặc chủ đề hoạt động). Nó sẽ hoạt động.

3 u_mulder Jan 13 2021 at 22:14

Thu thập các giá trị của bạn vào mảng và sau đó là implodemảng này:

$values = [ __($colormonth, 'woocommerce'),
    __($finish, 'woocommerce'), __($crossdesign, 'woocommerce'),
];

// if some values returned by `__()` are empty strings, 
// you can filter your array so as to remove them
$values = array_filter($values);

echo '<span class="variation-display">';
echo implode(', ', $values);
echo '</span>';