2015-08-23 3 views
7

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

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> 

variable.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;?> 
+0

Можете ли вы прояснить эту деталь? 'Выберите вариант, основанный на идентификаторе в' Вы имели в виду на основе идентификатора продукта? –

+0

Несомненно. У каждого продукта нет возможности выбрать, выбрать параметр размера, выбрать параметр цвета или оба варианта. Однако вместо того, чтобы говорить о выборе размера или выборе цвета, все они просто говорят «Выберите вариант». Я просто хочу, чтобы каждый сказал, выберите цвет или выберите размер, основанный на том, что вы на самом деле выбираете. Выбирать цветные кнопки имеют идентификатор #colors, а кнопки выбора размера имеют идентификатор #sizes, но текст отображения для обоих говорит «Выберите вариант. Надеюсь, это уточнит. – jfoutch

+1

Да, это помогает. коротко! –

ответ

9

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

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

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

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

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

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

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

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

Нам нужно будет сделать функцию, которая принимает переменную $ 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 variable.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); 

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

Обновление для 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 
+0

Да, спасибо. Однако я обнаружил, что в моей версии Woocommerce эта конкретная строка не находится в переменной.php. Однако я нашел ее в woocommerce/includes/wc-template-functions.php. Код переменной.pp для OP выше. – jfoutch

+0

Я считаю, что код, указанный вами в wc-template-functions.php, будет применяться ко ВСЕМ выбору вывода WooCommerce, а не только на страницах продукта. Какую версию WC вы используете? Я могу отслеживать способ вашей конкретной версии. –

+0

Это версия 2.4.4 – jfoutch

1

Вот довольно простое решение для туалета> 2,4, что позволяет избежать перезаписи функций и захламлять свой functions.php ..

Добавить файл variable.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); 
} ?> 

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

+0

Я добавил переменную.php в корневую директорию моей темы (с style.css и functions.php) и изменил код на то, что у вас есть выше, и я не получаю никаких изменений с «выбрать вариант». http://pastebin.com/FBTmmCKq - это то, что моя переменная. php выглядит как – jfoutch

+1

@jfoutch. Вам необходимо следовать структуре каталога шаблонов woocommerce в папке переопределения темы ([http://docs.woothemes.com/document/template- структура /] (http://docs.woothemes.com/document/template-structure/)), поэтому поместите его в 'YOUR_THEME_ROOT/woocommerce/single-product/add-to-cart/variable.php' – thomasfw

+1

@jfoutch You также необходимо удалить дополнительный '', который у вас есть в строке 46. Редактор переполнения стека решил сократить этот код. В основном просто замените исходный цикл foreach выше. – thomasfw

5

На самом деле существует более простой способ его настройки.

Если вы посмотрите на основной туалет файл WC-шаблон-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. Поэтому я хотел бы показать выпадающий этикетку вместо выбрать вариант текста, так что я изменить фу

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+, поэтому будьте осторожны.

2

Я нашел способ с 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); 
0

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

Откройте файл переменной.pp (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 Благодаря

+0

Не работал для меня. Кажется, это недостаток "(" между wc_dropdown_variation_attribute_options и массивом. Прекрасно работает после добавления отсутствующего "(" Спасибо! – danzo

-1

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

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); 
} 
0

Если вы хотите изменить выпадающий текст из «Выберите опцию» в WooCommerce, добавьте следующее functions.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; 
} 
Смежные вопросы