繁体   English   中英

Woocommerce 单变量产品中的重新排序属性下拉项

[英]Reorder attribute dropdown terms in Woocommerce single variable products

在 Woocommerce 单变量产品页面中,我想更改相关下拉菜单中尺寸选项的顺序。

其实是这样的(按字母顺序排列):
- 大号
- 米
- 加大码

我想像这样(按逻辑大小顺序):
- 米
- 大号
- 加大码

如何重新排序单一变量产品页面中的尺寸选项下拉菜单?

任何帮助表示赞赏。

这只是在属性部分设置为你的“大小”的产品属性。

1)您需要点击“配置条款”

在此处输入图片说明

2)您现在位于条款列表中。 您可以通过拖放右侧图标来对术语进行重新排序:

在此处输入图片说明

3)然后您将获得以下内容

在此处输入图片说明

现在,相关变量产品上的“大小”下拉菜单将以正确的顺序排列。

Product -> Attributes中对属性进行排序可能会非常不方便,尤其是当您有很多属性时。 这个问题可以通过woocommerce_dropdown_variation_attribute_options_html过滤器来解决。

要在产品页面上进行拖放排序,请尝试将以下代码添加到您的 functions.php 中:

add_filter('woocommerce_dropdown_variation_attribute_options_html', 'wc_dropdown_variation_attribute_options_sorted', 20, 2);
function wc_dropdown_variation_attribute_options_sorted( $html, $args ) {
$args = wp_parse_args(
    apply_filters( 'woocommerce_dropdown_variation_attribute_options_args', $args ),
    array(
        'options'          => false,
        'attribute'        => false,
        'product'          => false,
        'selected'         => false,
        'name'             => '',
        'id'               => '',
        'class'            => '',
        'show_option_none' => __( 'Choose an option', 'woocommerce' ),
    )
);

// Get selected value.
if ( false === $args['selected'] && $args['attribute'] && $args['product'] instanceof WC_Product ) {
    $selected_key = 'attribute_' . sanitize_title( $args['attribute'] );
    // phpcs:disable WordPress.Security.NonceVerification.Recommended
    $args['selected'] = isset( $_REQUEST[ $selected_key ] ) ? wc_clean( wp_unslash( $_REQUEST[ $selected_key ] ) ) : $args['product']->get_variation_default_attribute( $args['attribute'] );
    // phpcs:enable WordPress.Security.NonceVerification.Recommended
}

$options               = $args['options'];
$product               = $args['product'];
$attribute             = $args['attribute'];
$name                  = $args['name'] ? $args['name'] : 'attribute_' . sanitize_title( $attribute );
$id                    = $args['id'] ? $args['id'] : sanitize_title( $attribute );
$class                 = $args['class'];
$show_option_none      = (bool) $args['show_option_none'];
$show_option_none_text = $args['show_option_none'] ? $args['show_option_none'] : __( 'Choose an option', 'woocommerce' ); // We'll do our best to hide the placeholder, but we'll need to show something when resetting options.

if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {
    $attributes = $product->get_variation_attributes();
    $options    = $attributes[ $attribute ];
}

$html  = '<select id="' . esc_attr( $id ) . '" class="' . esc_attr( $class ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '" data-show_option_none="' . ( $show_option_none ? 'yes' : 'no' ) . '">';
$html .= '<option value="">' . esc_html( $show_option_none_text ) . '</option>';

if ( ! empty( $options ) ) {
    if ( $product && taxonomy_exists( $attribute ) ) {
        // Get terms if this is a taxonomy - ordered. We need the names too.
        $terms = wc_get_product_terms(
            $product->get_id(),
            $attribute,
            array(
                'fields' => 'all',
            )
        );
        
        //sorting starts here
        foreach($terms as $key => $term) {
            $i = 0;
            foreach($product->get_available_variations() as $variation) {
                $i++;
                if ($term->slug == $variation['attributes'][$name]) {
                    $key = $i - 1;
                    unset($terms[$key]);
                    $terms[$key] = $term;
                }
            }
        }

        ksort($terms);

        foreach ( $terms as $term ) {
            if ( in_array( $term->slug, $options, true ) ) {
                $html .= '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $args['selected'] ), $term->slug, false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name, $term, $attribute, $product ) ) . '</option>';
            }
        }
    } else {
        foreach ( $options as $option ) {
            // This handles < 2.4.0 bw compatibility where text attributes were not sanitized.
            $selected = sanitize_title( $args['selected'] ) === $args['selected'] ? selected( $args['selected'], sanitize_title( $option ), false ) : selected( $args['selected'], $option, false );
            $html    .= '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option, null, $attribute, $product ) ) . '</option>';
        }
    }
}

return $html .= '</select>';

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM