WooCommerce结账:如何更改结账字段的$field_tainer?

时间:2018-10-03 作者:manifestor

默认情况下,签出字段包装在<p class="form-row... HTML由woocommerce_form_field() 核心功能(参见$field_container) - 我想改变这种行为。如何在不改变核心功能的情况下做到这一点?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

这个woocommerce_form_field() 是一个pluggable 作用defined 具体如下:

if ( ! function_exists( \'woocommerce_form_field\' ) ) {

    /**
     * Outputs a checkout/address form field.
     *
     * @param string $key Key.
     * @param mixed  $args Arguments.
     * @param string $value (default: null).
     * @return string
     */
    function woocommerce_form_field( $key, $args, $value = null ) {
        ...
    }
}
所以你可以复制whole 编码到主题的函数中。php文件,并修改表单字段包装器以满足您的需求,就像我更改包装器标记的地方一样pdiv:

if ( ! function_exists( \'woocommerce_form_field\' ) ) {

    /**
     * Outputs a checkout/address form field.
     *
     * @param string $key Key.
     * @param mixed  $args Arguments.
     * @param string $value (default: null).
     * @return string
     */
    function woocommerce_form_field( $key, $args, $value = null ) {
        ...
        $field_container = \'<div class="form-row %1$s" id="%2$s" data-priority="\' . esc_attr( $sort ) . \'">%3$s</div>\';

        switch ( $args[\'type\'] ) {
            ...
            case \'state\':
                ...

                if ( is_array( $states ) && empty( $states ) ) {

                    $field_container = \'<div class="form-row %1$s" id="%2$s" style="display: none">%3$s</div>\';

                    ...

                } ...
            ...
        }

        ...
    }
}
或您可以使用woocommerce_form_field 过滤器,就像这样(我在这里使用preg_replace() 将包装的标记从pdiv):

add_filter( \'woocommerce_form_field\', \'my_woocommerce_form_field\' );
function my_woocommerce_form_field( $field ) {
    return preg_replace(
        \'#<p class="form-row (.*?)"(.*?)>(.*?)</p>#\',
        \'<div class="form-row $1 test"$2>$3</div>\',
        $field
    );
}
在我的例子中,替代方法工作得很好,但当然,没有其他(插件、主题或自定义)代码可以更改包装器的标记/HTML。

希望这有帮助。

结束

相关推荐