计费字段中的快捷码不起作用

时间:2018-11-22 作者:Viking777

WooCommerce:3.5.1 WordPress:4.9.8

我想用GeoIP短代码中的数据自动设置计费字段,但它不起作用。

add_filter( \'woocommerce_checkout_fields\', \'set_checkout_field_input_value_default\' );

function set_checkout_field_input_value_default($fields) {
    $fields[\'billing\'][\'billing_city\'][\'default\'] = \'[geoip_detect2 property="city"]\';
    $fields[\'billing\'][\'billing_state\'][\'default\'] = \'[geoip_detect2 property="mostSpecificSubdivision"]\';
    return $fields;
}
此解决方案没有帮助:Shortcode not working inside html input

输出

<input type="text" class="input-text " name="billing_city" id="billing_city" placeholder="" value="[geoip_detect2 property=&quot;city&quot;]" autocomplete="address-level2">

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

“官方”的答案是,您需要使用do_shortcode() 要处理短代码,您不能简单地在代码中应用短代码。这是您的原始代码和“官方”do_shortcode() 方式:

 add_filter( \'woocommerce_checkout_fields\', \'set_checkout_field_input_value_default\' );

function set_checkout_field_input_value_default($fields) {
    $fields[\'billing\'][\'billing_city\'][\'default\'] = do_shortcode( \'[geoip_detect2 property="city"]\' );
    $fields[\'billing\'][\'billing_state\'][\'default\'] = do_shortcode( \'[geoip_detect2 property="mostSpecificSubdivision"]\' );
    return $fields;
}
虽然这种方法将解析短代码,但我个人建议您NOT 使用do_shortcode() 因为它必须通过a fairly extensive regex to process. 最好找到所讨论的短代码的实际回调函数并直接使用它。是的,有时候这很困难,在某些情况下也很棘手。但谢天谢地a good article and a better solution at this link.

下面是如何使用J.D.Grimes的方法(如本文所讨论的,包括他的实用程序函数以及为使用它而修改的代码片段):

/**
 * Call a shortcode function by tag name.
 *
 * @author J.D. Grimes
 * @link https://codesymphony.co/dont-do_shortcode/
 *
 * @param string $tag     The shortcode whose function to call.
 * @param array  $atts    The attributes to pass to the shortcode function. Optional.
 * @param array  $content The shortcode\'s content. Default is null (none).
 *
 * @return string|bool False on failure, the result of the shortcode on success.
 */
function do_shortcode_func( $tag, array $atts = array(), $content = null ) {

    global $shortcode_tags;

    if ( ! isset( $shortcode_tags[ $tag ] ) )
        return false;

    return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
}

add_filter( \'woocommerce_checkout_fields\', \'set_checkout_field_input_value_default\' );

function set_checkout_field_input_value_default($fields) {
    $fields[\'billing\'][\'billing_city\'][\'default\'] = do_shortcode_func( \'geoip_detect2\', array( \'property\' => "city" ) );
    $fields[\'billing\'][\'billing_state\'][\'default\'] = do_shortcode_func( \'geoip_detect2\', array( \'property\' => "mostSpecificSubdivision" ) );
    return $fields;
}
任何一种方法都是“正确的”,应该能够解决问题(至少在短代码解析方面)。希望这对你有帮助。

结束

相关推荐

Do not parse shortcode in CPT

我有一个CPT,我不想在它的内容中解析shortcode(使用\\u content()函数)。我可以使用remove\\u filter删除短代码的默认过滤器。但我如何确定我只是为了我想要的CPT而删除过滤器?我有一个在页面中使用的快捷码[我的自定义快捷码]。此短代码使用WP\\U查询和输出CPT帖子。我不想在这篇CPT文章中分析短代码。我是否应该在短代码解析挂钩之前用虚拟内容更改短代码,并在之后替换回来?或者我应该在我的CPT输出之前删除短代码的默认过滤器,然后在我的CPT输出完成后再次添加短代码的默