Как изменить текст кнопки «Выбрать вариант» в 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 в массив, а затем добавить для них инструкции, но он, похоже, не работает. Я не уверен, как ссылаться на идентификатор элемента select и записывать оператор if на основе, если он является правильным элементом выбора.

Вот 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;?> 

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

Быстрый путь:

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

 /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 и выводит на ней строку. Это будет выглядеть примерно так:

 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/

Чистый путь:

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

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

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

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

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

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

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

Версия 2.4 WooCommerce вводит другой способ получения атрибутов и связанных с ними выборок. Поскольку они до сих пор не предоставили фильтр для этого, я бы рекомендовал переопределить функцию wc_dropdown_variation_attribute_options, используя методы, описанные выше. Поэтому скопируйте и вставьте всю функцию в файл functions.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 ) ) ); 

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

Я нашел способ с WC 2.5. Добавьте это в functions.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); 

Вот довольно простое решение для 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 ); } ?> 

Это заменит «Выбрать вариант» на «Выбрать размер», «Выбрать цвет» и т. Д. В зависимости от имени вашего атрибута.

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

Откройте файл variable.php (wp-content / plugins / woocommerce / includes / variable.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 ); }