批量更改 WooCommerce 可变产品的属性下拉列表的顺序

Bulk change the order of attributes dropdowns on WooCommerce variable products

我的产品有 2 个产品属性:颜色尺寸。它们按该顺序呈现。我需要切换它们,以便大小始终排在第一位。

WooCommerce 文件 single-product/add-to-cart/variable.php 似乎负责输出,但我不够熟练,无法建议更改此代码,这将使它按 attribute_idattribute_name 排序, 或反转默认顺序。现在他们似乎按分类术语或 slug 而不是实际属性数据排序,更改 woocommerce_attribute_taxonomies table 中的属性 ID 或名称没有帮助。

请帮我破解这个。

我已经搜索了这个但没有运气,答案可能隐藏在关于属性术语顺序的许多问题中,这不是我在这里要问的。

编辑:我有数以千计的产品,因此按产品手动重新订购是行不通的。

$attribute_keys = array_keys( $attributes );

do_action( 'woocommerce_before_add_to_cart_form' ); ?>

<form class="variations_form cart" action="<?php echo esc_url( apply_filters( 'woocommerce_add_to_cart_form_action', $product->get_permalink() ) ); ?>" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint( $product->get_id() ); ?>" data-product_variations="<?php echo htmlspecialchars( wp_json_encode( $available_variations ) ); // WPCS: XSS ok. ?>">
    <?php do_action( 'woocommerce_before_variations_form' ); ?>

    <?php if ( empty( $available_variations ) && false !== $available_variations ) : ?>
        <p class="stock out-of-stock"><?php esc_html_e( 'This product is currently out of stock and unavailable.', 'woocommerce' ); ?></p>
    <?php else : ?>
        <table class="variations" cellspacing="0">
            <tbody>
                <?php foreach ( $attributes as $attribute_name => $options ) : ?>
                    <tr>
                        <td class="label"><label for="<?php echo esc_attr( sanitize_title( $attribute_name ) ); ?>"><?php echo wc_attribute_label( $attribute_name ); // WPCS: XSS ok. ?></label></td>
                        <td class="value">
                            <?php
                                wc_dropdown_variation_attribute_options( array(
                                    'options'   => $options,
                                    'attribute' => $attribute_name,
                                    'product'   => $product,
                                ) );
                                echo end( $attribute_keys ) === $attribute_name ? wp_kses_post( apply_filters( 'woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . esc_html__( 'Clear', 'woocommerce' ) . '</a>' ) ) : '';
                            ?>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>

更新: (与您的编辑有关)

无法使用代码更改它,因为它由 WC_Product_Variable_Data_Store_CPT Class on read_variation_attributes() 方法处理并且没有可用的挂钩。

此外,由于缓存了该数据,因此不应该合理地欢迎过滤器挂钩..

一般来说,对于大多数人来说,您的实际问题不会发生,因为他们在向可变产品添加属性时对每个产品设置了从头开始的排序。

现在您可以尝试在数据库上更改它,但这似乎不可能,因为产品属性排序是基于位于 [=] 的 序列化数组 的索引12=] 对于变量产品 post_id 使用 meta_key = _product_attributes.


原回答:

在可变产品设置中,在 "Product data" (metabox) > 属性 (tab) 下,您可以添加产品属性。您也可以重新排序它们,只需 拖放它们 到所需的位置。

这将影响可变产品在前端的产品属性下拉列表的顺序。所以你不需要任何代码。

In database, the product attributes sorting is based on the index of an array located in wp_postmeta for a variable product post_id using the meta_key = _product_attributes