Изменить алфавитную сортировку атрибутов / вариаций на странице товара в магазине Woocommerce

У меня есть магазин Woocommerce, в котором различные атрибуты / варианты упорядочены в алфавитном порядке, когда вы нажимаете "выбрать" на странице продукта. В настоящее время я пытаюсь выяснить, как я могу отсортировать их на основе порядка в бэкэнде.

Конкретно: в настоящее время Small помещается после Large, который не чувствует себя настолько интуитивным.

Любая помощь будет более чем приветствоваться. Я гуглю уже час и не могу найти решение.

HTML / PHP моего текущего шаблона выглядит следующим образом:

<?php
    if ( is_array( $options ) ) {

        if ( isset( $_REQUEST[ 'attribute_' . sanitize_title( $name ) ] ) ) {
            $selected_value = $_REQUEST[ 'attribute_' . sanitize_title( $name ) ];
        } elseif ( isset( $selected_attributes[ sanitize_title( $name ) ] ) ) {
            $selected_value = $selected_attributes[ sanitize_title( $name ) ];
        } else {
            $selected_value = '';
        }

        // Get terms if this is a taxonomy - ordered
        if ( taxonomy_exists( $name ) ) {

            $orderby = wc_attribute_orderby( $name );

            switch ( $orderby ) {
                case 'name' :
                    $args = array( 'orderby' => 'name', 'hide_empty' => false, 'menu_order' => false );
                break;
                case 'id' :
                    $args = array( 'orderby' => 'id', 'order' => 'ASC', 'menu_order' => false, 'hide_empty' => false );
                break;
                case 'menu_order' :
                    $args = array( 'menu_order' => 'ASC', 'hide_empty' => false );
                break;
            }

            $terms = get_terms( $name, $args );

            foreach ( $terms as $term ) {
                if ( ! in_array( $term->slug, $options ) )
                    continue;

                echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $term->slug ), false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>';
            }
        } else {

            foreach ( $options as $option ) {
                echo '<option value="' . esc_attr( sanitize_title( $option ) ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $option ), false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
            }

        }
    }
?>

2 ответа

Возможно, вы уже нашли решение, так как оно довольно простое (хотя я узнал об этом, потратив 5-6 часов), но если нет, то вот оно.

  1. В админ-панели выберите Продукты >> Атрибуты.
  2. Там отредактируйте атрибут Size и измените порядок сортировки по умолчанию на "Custom Ordering" и сохраните его.
  3. Вернитесь на страницу Атрибуты и нажмите "Настроить элементы" для атрибута "Размер". Теперь в таблице значений перетащите элементы вверх или вниз в любом порядке, который вы хотите отобразить на внешнем интерфейсе.

Например в вашем случае перетащите Small в верхнюю часть таблицы и Large в нижнюю, вот и все. Нет никакой опции сохранения, так что не запутайтесь с ней, куда бы вы ни перетащили любой элемент в списке, он будет прикреплен и будет сохранен.

У меня есть решение для вашего вопроса. Просто войдите на FTP, затем перейдите в папку /wp-content/plugins/woocommerce/includes/admin/post-types/meta-boxes/class-wc-meta-box-product-data.php

В этой строке № 885 замените следующим массивом:

$args = array(
    'post_type'=>'product_variation',
    'post_status' => array( 'private', 'publish' ),
    'posts_per_page' => -1,
    'meta_key' => 'attribute_pa_woo-color', //rename with your attributes
    'post_parent' => $post->ID,
    'meta_query' => array(
        array(
            'key' => 'attribute_pa_woo-color' //rename with your attributes
        ),
        array(
            'key' => 'attribute_pa_woo-size' //rename with your attributes
        )
    )
);

В настоящее время он будет сортировать атрибуты вручную.

Другие вопросы по тегам