Php WooCimp用于WooCuff:在签出字段中间添加复选框

Php WooCimp用于WooCuff:在签出字段中间添加复选框,php,wordpress,woocommerce,mailchimp,Php,Wordpress,Woocommerce,Mailchimp,该插件很棒,但我刚刚得到一个设计,其中WooCommerce签出中的“订阅我们的新闻稿”复选框紧跟在电子邮件字段之后,而不是在特定部分的底部: 该插件允许您键入一个动作挂钩,用于显示复选框的位置;例如,woocommerce\u checkout\u before\u customer\u details,woocommerce\u checkout\u billing\u form,这允许您将复选框放在某个部分之前或之后(只要有一个钩子),但不能放在各个字段中 有没有办法将MailChimp

该插件很棒,但我刚刚得到一个设计,其中WooCommerce签出中的“订阅我们的新闻稿”复选框紧跟在电子邮件字段之后,而不是在特定部分的底部:

该插件允许您键入一个动作挂钩,用于显示复选框的位置;例如,
woocommerce\u checkout\u before\u customer\u details
woocommerce\u checkout\u billing\u form
,这允许您将复选框放在某个部分之前或之后(只要有一个钩子),但不能放在各个字段中


有没有办法将MailChimp复选框添加到某个字段之前或之后的特定点?

签出字段在循环中输出,循环使用
woocommerce\u form\u field()
函数回显每个字段:

$fields = $checkout->get_checkout_fields( 'billing' );

foreach ( $fields as $key => $field ) {
    woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
}
此函数为每个特定字段类型(例如,
woocommerce\u form\u field\u email
)提供了大量过滤器,但没有操作挂钩

但是,您可以使用其中一个过滤器和一些小技巧来添加自己的挂钩:

///
//  Add MailChimp checkbox after email field
///

function vnm_mc_after_email_field($field, $key, $args, $value) {
    ob_start();

    do_action('vnm_before_email_field');

    echo $field;

    do_action('vnm_after_email_field');

    return ob_get_clean();
}

add_filter('woocommerce_form_field_email', 'vnm_mc_after_email_field', 10, 4);
由于WordPress筛选器始终必须返回发送给它的第一个参数的版本(在本例中为
$field
),我们所做的就是打开输出缓冲区,在字段前后添加我们自己的操作(
vnm_before_email_field
vnm_before_email_field
),然后返回输出缓冲区

然后,在WooCommerce->MailChimp->Audience下的MailChimp插件设置中,只需添加刚刚为字段创建的钩子:

…和完成。注意,如果需要,您实际上可以在每个WooCommerce签出字段周围添加操作挂钩,只需添加以下内容(未测试):

///
//  Add `before` & `after` actions around every WooCommerce checkout field
///

function vnm_wc_form_field_actions($field, $key, $args, $value) {
    ob_start();

    do_action('vnm_before_' . $args['type'] . '_field');

    echo $field;

    do_action('vnm_after_' . $args['type'] . '_field');

    return ob_get_clean();
}

add_filter('woocommerce_form_field', 'vnm_wc_form_field_actions', 10, 4);