如何在Woocommerce中的“选择选项”中更改按钮文本?

时间:2015-08-23 19:21:41

标签: php wordpress woocommerce

如何更改此PHP代码以更改选择基于WordPress Woocommerce插件中select元素的ID的选项?我相信我在wc-template-function.php中找到了正确的PHP文件,但我缺乏PHP技能让我退缩。以下是我到目前为止的情况:

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df1 = pd.DataFrame({'AAA':np.array([5,3]),'BBB':np.array([6,1]),
 .....: 'DDD':np.array([10,2]),'CCC':np.array([2,4])})
In [4]: df2 = pd.DataFrame({'AAA':np.array([5,2]),'DDD':np.array([2,1]),
 .....: 'BBB':np.array([5,4])})
In [5]: df = pd.concat([df1,df2])
In [6]: df.transpose()
      0  1   0   1
AAA   5  3   5   2
BBB   6  1   5   4 
CCC   2  4 NaN NaN
DDD  10  2   2   1
In [7]: vals = np.nan_to_num(df.values)
In [8]: _mean = (vals[0,:]*vals[1,:]+vals[2,:]*vals[3,:])/(vals[1,:]+vals[3,:])
In [9]: _sum = (vals[1,:]+vals[3,:])
In [10]: result = pd.DataFrame(columns = df.columns,data = [_mean,_sum], index=['mean','sum'])
In [11]: result.transpose()
         mean  sum
AAA  5.000000    5
BBB  5.200000    5
CCC  2.000000    4
DDD  7.333333    3

您可以看到我尝试将show_option_color和show_option_size添加到数组中的位置,然后为它们添加if语句,但它似乎不起作用。我不确定如何引用select元素的id并根据if语句是否是正确的select元素来编写if语句。

这是我试图定位的HTML。

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>';
    }
}

variable.php代码行27 - 38:

<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>

8 个答案:

答案 0 :(得分:10)

这是自定义过滤器的完美用例!我首先要描述的方法并不是最快捷的方法,但对于可能需要阅读代码的其他人来说,这可能是最干净,最容易理解的方法。如果你处于紧张状态,我还会描述一种“更脏”的方式。

快速方式:

查找显示位置的位置在文件中:

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

第27行,根据你的WooCommerce版本,你会看到类似这样的内容:

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

__()函数使用'woocommerce'文本域通过WordPress的翻译系统运行第一个参数。最好保留翻译的可能性,因此我们希望在通过翻译功能发送之前更改此文本。

这一行代码发生在输出所有产品变体属性的循环中。这样,我们就可以通过查看 $ 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;
}

现在,在变量.php第27行的代码之前,我们可以这样做:

<?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/

清洁方式:

更好,更可扩展的方法是添加一个自定义过滤器来传递它。这是一些额外的步骤,但如果您希望根据您的产品逐个覆盖功能,则可以轻松添加更多自定义逻辑。

首先,使用具有语义意义的名称制作自定义过滤器,并将其放在powers.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的更新

WooCommerce 2.4版介绍了获取属性及其相关选择的不同方法。由于他们仍然没有为此提供过滤器,我建议使用上述方法覆盖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

答案 1 :(得分:7)

我找到了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);

答案 2 :(得分:6)

实际上有一种更简单的方法来定制它。

如果您查看核心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' )

现在您需要做的是在variable.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+,所以要小心。

答案 3 :(得分:4)

我在这里使用其他答案的组合完成了这项工作并且对我来说效果很好。

这是使用WooCoommerce 3.3.5完成的,并假设相对最近添加了过滤器。

您将过滤器用于wc_dropdown_variation_attribute_options()功能。

// define the woocommerce_dropdown_variation_attribute_options_args callback 
function filter_woocommerce_dropdown_variation_attribute_options_args( $array ) { 

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

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

    $array['show_option_none'] = __( $select_text, 'woocommerce' );
    return $array; 
}; 

// add the filter 
add_filter( 'woocommerce_dropdown_variation_attribute_options_args', 'filter_woocommerce_dropdown_variation_attribute_options_args', 10, 1 ); 

希望这有助于某人。

答案 4 :(得分:2)

这是WC&gt; 2.4的一个非常简单的解决方案,它可以避免重写功能并使你的函数混乱。

variable.php 文件添加到您的主题(http://docs.woothemes.com/document/template-structure/),并更改此项(从第27行):

<html ng-app="testing">
<head>
    <title>Angular ng-change test</title>
</head>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <div class="row" ng-controller="ChgCtrl">
        <div class="col-md-12">
            <form>
                <div class="form-group">
                    <span class="text-info">ng-change</span>
                    <input type="checkbox" ng-model="formElem.checkbox" ng-change="toggleChange(formElem.checkbox)" ng-checked="formElem.checkbox == 1"/>
                </div>
            </form>
        </div>
        <div class="col-md-12">            
            <div class="col-md-6">
                <h3>JQuery change event:</h3>
                <P id="jq-messages"></p>
            </div>        
            <div class="col-md-6">                    
                <h3>Angular change event:</h3>
                <p>{{message_change}}</p>
            </div>
            <p class="text-danger">Please note the first click on checkbox.</p>
        </div>
    </div>
    <script type="text/javascript">
        var app = angular.module('testing', []);
        app.controller('ChgCtrl', function ($scope) {
            $scope.formElem = {
                checkbox: 1
            };
            $scope.message_change = '';

            $scope.toggleChange = function (data) {
                $scope.message_change = data === true ? 'Checked' : 'Unchecked';
                console.info(data === true ? 'Checked' : 'Unchecked');
            };
        });

        $(function () {
            $('input[type=checkbox]').on('change', function (e) {
                $('#jq-messages').html($(this).is(':checked') ? 'Checked' : 'Unchecked');
                console.log($(this).is(':checked'));
            });
        });
    </script>
</body>

到此:

<?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;?>

这将取代&#39;选择一个选项&#39;使用&#39;选择尺寸&#39;,&#39;选择颜色&#39;等等,取决于您的属性名称。

答案 5 :(得分:1)

如果您希望更改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; 
}

答案 6 :(得分:0)

如果您想知道如何将“选择一个选项”替换为相应的属性/变体名称,那么您可以通过以下方式进行操作。 编辑variable.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版本 感谢

答案 7 :(得分:-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 ); 
}