Как изменить текст кнопки "выбрать опцию" в Woocommerce?

как я могу изменить этот PHP-код, чтобы изменить выбор опции на основе идентификатора элемента select в плагине Woocommerce для WordPress? Я считаю, что нашел правильный PHP-файл в wc-template-function.php, но отсутствие навыков PHP сдерживает меня. Вот что у меня есть до сих пор:

if ( ! function_exists( 'wc_dropdown_variation_attribute_options' ) ) {

    /**
     * Output a list of variation attributes for use in the cart forms.
     *
     * @param array $args
     * @since 2.4.0
     */
    function wc_dropdown_variation_attribute_options( $args = array() ) {
        $args = wp_parse_args( $args, array(
            'options'          => false,
            'attribute'        => false,
            'product'          => false,
            'selected'         => false,
            'name'             => '',
            'id'               => '',
            'class'            => '',
            'show_option_none' => __( 'Choose an option', 'woocommerce' ),
            'show_option_color' => __( 'Choose a color', 'woocommerce' ),
            'show_option_size' => __( 'Choose a size', 'woocommerce' )
        ) );

        $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'];

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

        echo '<select id="' . esc_attr( $id ) . '" class="' . esc_attr( $class ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '">';

        if ( $args['show_option_none'] ) {
            echo '<option value="">' . esc_html( $args['show_option_none'] ) . '</option>';
        }
        if ( $args['$id_colors'] ) {
            echo '<option value="">' . esc_html( $args['show_option_color'] ) . '</option>';
        }
        if ( $args['$id_sizes'] ) {
            echo '<option value="">' . esc_html( $args['show_option_size'] ) . '</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->id, $attribute, array( 'fields' => 'all' ) );

                foreach ( $terms as $term ) {
                    if ( in_array( $term->slug, $options ) ) {
                        echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $args['selected'] ), $term->slug, false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</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 );
                    echo '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
                }
            }
        }

        echo '</select>';
    }
}

вы можете увидеть, где я пытался добавить show_option_color и show_option_size в массив, а затем добавить операторы if для них, но он, похоже, не работает. Я не уверен, как ссылаться на идентификатор элемента select и писать оператор if на основе того, является ли он правильным элементом select.

вот HTML, который я пытаюсь настроить.

<select id="sizes" class="" name="attribute_sizes" data-attribute_name="attribute_sizes">Want this to say Choose a size</select>

<select id="colors" class="" name="attribute_sizes" data-attribute_name="attribute_sizes">Want this to say Choose a color</select>

переменной.php код строки 27-38:

<?php foreach ( $attributes as $attribute_name => $options ) : ?>
                    <tr>
                        <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
                        <td class="value">
                            <?php
                                $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
                                wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
                                echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : '';
                            ?>
                        </td>
                    </tr>
                <?php endforeach;?>

8 ответов


это идеальный вариант использования для пользовательского фильтра! Сначала я опишу метод, который не является самым быстрым, но, вероятно, самым чистым и простым для понимания для всех, кто может прочитать ваш код. Я также опишу "грязный" способ, который должен выполнять эту работу, если вы находитесь в кризисе времени.

Быстрый Способ:

место, где это отображается, находится в файле:

/wp-content/plugins/woocommerce/templates/single-product/add-to-cart/variable.php

по линии 27 в зависимости от по вашей версии WooCommerce, вы увидите что-то вроде этой строки:

<option value=""><?php echo __( 'Choose an option', 'woocommerce' ) ?>&hellip;</option>

функция _ _ () запускает первый параметр через систему перевода WordPress, используя текстовый домен "woocommerce". Лучше всего сохранить возможность перевода, поэтому мы хотим изменить этот текст, прежде чем отправлять его через функцию перевода.

эта строка кода происходит во время цикла, который выводит все атрибуты вариации продукта. Это позволяет нам легко увидеть, какой атрибут выводится, посмотрев на $name переменной.

нам нужно будет сделать функцию, которая принимает переменную $name и выводит строку на ее основе. Это выглядело бы примерно так:--9-->

function get_text_for_select_based_on_attribute($attribute) {

// Find the name of the attribute for the slug we passed in to the function
$attribute_name = wc_attribute_label($attribute);

// Create a string for our select
$select_text = 'Select a ' . $attribute_name;

// Send the $select_text variable back to our calling function
return $select_text;
}

теперь, перед кодом в строке 27 переменной.php, мы можем поставить что-то вроде этого:

<?php 

  $select_text = get_text_for_select_based_on_attribute($name);

?>

затем просто замените "выбрать опцию" с переменной $select_text:

<option value=""><?php echo __( $select_text, 'woocommerce' ) ?>&hellip;</option>

не забудьте сделайте это все в переопределении шаблона или ваша настройка будет потеряна при следующем обновлении!

http://docs.woothemes.com/document/template-structure/

Более Чистый Путь:

лучший и более расширяемый способ сделать это-добавить пользовательский фильтр для прохождения этого. Это несколько дополнительных шагов, но позволяет легко добавить пользовательскую логику, если вы хотите изменить функциональность в каждом конкретном случае в зависимости от вашего товар.

во-первых, сделайте пользовательский фильтр с семантически значимым именем и поместите его где-нибудь в свои функции.php-файл для темы:

add_filter('variable_product_select_text', 'get_text_for_select_based_on_attribute', 10, 1);

затем в переменной.php-файл, вместо того, чтобы просто вызывать функцию напрямую, передайте ее через новый фильтр:

$select_text = apply_filters('variable_product_select_text', $name);

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

обновление для WC 2.4

версия 2.4 WooCommerce вводит другой способ получения атрибутов и связанных с ними выбора. Поскольку они все еще не предоставили фильтр для этого, я бы рекомендовал переопределить функцию wc_dropdown_variation_attribute_options с помощью методов, описанных выше. Поэтому скопируйте и вставьте всю функцию в функции вашей темы.файл PHP начиная с объявление и добавление переменной для выделенного текста, если это не цвет или размер:

//Don't include the if(!function_exists(...) part.

wc_dropdown_variation_attribute_options($args = array()) {
  // Uses the same function as above, or optionally a custom filter
  $select_text = get_text_for_select_based_on_attribute($args['attribute']);

  wc_dropdown_variation_attribute_options( $args = array() ) {
    $args = wp_parse_args( $args, array(
        'options'          => false,
        'attribute'        => false,
        'product'          => false,
        'selected'         => false,
        'name'             => '',
        'id'               => '',
        'class'            => '',
        'show_option_none' => __( $select_text, 'woocommerce' ),
        'show_option_color' => __( 'Choose a color', 'woocommerce' ),
        'show_option_size' => __( 'Choose a size', 'woocommerce' )
    ) );
// Put the rest of the function here

на самом деле есть более простой способ, чтобы настроить его.

Если вы посмотрите на основной файл WC wc-template-functions.php вы можете видеть, что массив внутри функции wc_dropdown_variation_attribute_options на самом деле является аргументами со следующими парами ключевых значений:

'options'          => false,
'attribute'        => false,
'product'          => false,
'selected'         => false,
'name'             => '',
'id'               => '',
'class'            => '',
'show_option_none' => __( 'Choose an option', 'woocommerce' )

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

wc_dropdown_variation_attribute_options(
    array(
         'options' => $options,
         'attribute' => $attribute_name,
         'product' => $product,
         'selected' => $selected,
         'show_option_none' => wc_attribute_label( $attribute_name )
    )
);

то же самое с другими парами. Hoep это помогает. Кстати, это работает только в WC 2.4+ , поэтому будьте осторожны.


Я нашел способ с WC 2.5. Добавьте это в функции.на PHP:

function my_dropdown_variation_attribute_options_html($html, $args){
    $html = str_replace('Choose an option', 'Choose', $html);
    return $html;
}
add_filter('woocommerce_dropdown_variation_attribute_options_html', 'my_dropdown_variation_attribute_options_html', 10, 2);

Я сделал это, используя комбинацию других ответов здесь, и это сработало хорошо для меня.

Это было сделано с помощью WooCoommerce 3.3.5 и предположим, что фильтр был добавлен относительно недавно.

вы используете фильтр для


вот довольно простое решение для WC > 2.4, которое позволяет избежать перезаписи функций и загромождения ваших функций.РНР..

добавить переменной.в PHP файл для вашей темы (http://docs.woothemes.com/document/template-structure/), и изменить это (из строки 27):

<?php foreach ( $attributes as $attribute_name => $options ) : ?>
<tr>
    <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
    <td class="value">
        <?php
            $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
            wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
            echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : '';
        ?>
    </td>
</tr><?php endforeach;?>

для этого:

<?php 
$variations_arr = array();
foreach ( $attributes as $attribute_name => $options ) : 
    ob_start(); ?>
    <tr>
        <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
        <td class="value">
            <?php $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
            wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
            echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : ''; ?>
        </td>
    </tr>
    <?php $variations_ob = ob_get_clean();
    $variations_arr[wc_attribute_label($attribute_name)] = $variations_ob;
endforeach;

foreach ($variations_arr as $name => $ob) {
    echo str_ireplace('choose an option', 'Choose '.$name, $ob );
} ?>

это заменит "выбрать опцию" на "выбрать размер", "выбрать цвет" и т. д. в зависимости от имени атрибута.


Если вы хотите изменить выпадающий текст из "выбрать опцию" в Woocommerce, добавьте следующие функции.php файл в вашей теме:

add_filter('woocommerce_dropdown_variation_attribute_options_args', 'my_change_choose_an_option_text_func', 10, 2);

function my_change_choose_an_option_text_func($args){ 
    $args['show_option_none'] = __( 'New Text', 'your_text_domain' ); 
    return $args; 
}

Если вам интересно, как заменить "выбрать опцию" на соответствующее имя атрибута/варианта, то вот как вы можете это сделать. изменить переменную.php и lookout для кода, как показано ниже

открыть переменной.php (wp-content / plugins/woocommerce / включает / переменную.php) файл на ваш woocommerce и изменить это (из строки 41 в 43): (удалить этот код 3 строки)

$selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( urldecode( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) : $product->get_variation_default_attribute( $attribute_name );
wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
echo end( $attribute_keys ) === $attribute_name ? apply_filters( 'woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . __( 'Clear', 'woocommerce' ) . '</a>' ) : '';

затем добавьте этот код

wc_dropdown_variation_attribute_options
array( 'options' => $options,
'attribute' => $attribute_name,
'product' => $product,
'selected' => $selected,
'show_option_none'=> wc_attribute_label( $attribute_name )
) );

он работает все WordPress версия Спасибо


обновленный код, сделанный для тех, кто все еще заинтересован

add_filter( 'woocommerce_dropdown_variation_attribute_options_args', 
fix_option', 10 ); 
function fix_option( $args ) {
    $attr = get_taxonomy( $args['attribute'] ); 
    $label = $attr->labels->name; 
    $fix = str_replace('Product', '', $label); 
    $fix = strtolower($fix); /
    $args['show_option_none'] = apply_filters( 'the_title', 'Select a '.$fix ); 
}