消息本身是不可过滤的,因此更改它的最简单方法是使用gettext
过滤器:
function wpse_284393_checkout_message( $translated_text, $text, $domain ) {
if ( $domain !== \'woocommerce\' ) {
return $translated_text;
}
if ( $text = \'Unfortunately <strong>we do not ship %s</strong>. Please enter an alternative shipping address.\' ) {
$translated_text = \'New message goes here, %s will be replaced with shipping location.\';
}
return $translated_text;
}
add_filter( \'gettext\', \'wpse_284393_checkout_message\', 10, 3 );
But, 这个解决方案的问题是
gettext
在WordPress中为每一行文本运行。这意味着将检查每行文本的
woocommerce
域,然后将检查WooCommerce中的每一行文本,以查看是否是要替换的文本。这可能是
big performance problem.
所以,我们可以用另一种方法来解决这个问题,使用woocommerce_after_checkout_validation
钩此钩子在签出验证结束时激发,并在此处生成错误消息。我们可以使用这个钩子来首先查看错误消息是否存在,如果存在,则用新消息替换它,而不是对消息进行站点范围的文本替换。由于这只会在签出时发生,因此对性能的影响要小得多:
function wpse_284393_checkout_message( $data, $errors ) {
if ( empty( $errors ) ) {
return;
}
$shipping_error = $errors->get_error_message( \'shipping\' );
if ( $shipping_error && $shipping_error === \'Unfortunately <strong>we do not ship %s</strong>. Please enter an alternative shipping address.\' ) {
$errors->remove( \'shipping\' );
$errors->add( \'shipping\', sprintf( \'My new error message about shipping %s here.\', WC()->countries->shipping_to_prefix() . \' \' . WC()->customer->get_shipping_country() );
}
}
add_action( \'woocommerce_after_checkout_validation\', \'wpse_284393_checkout_message\' );
通过使用
sprintf()
和
WC()->countries->shipping_to_prefix() . \' \' . WC()->customer->get_shipping_country()
我可以设置消息以供使用
%s
与原始消息的方式相同。