为了账号安全,请及时绑定邮箱和手机立即绑定

将过滤后的计费电话保存到 WooCommerce 中的管理员用户配置文件

将过滤后的计费电话保存到 WooCommerce 中的管理员用户配置文件

PHP
呼唤远方 2023-07-21 15:50:41
我在过去几天读到的所有内容都表明,如果我想在 user-edit.php (用户管理后端)中保存字段,我应该使用 & 钩子(并且我在这个问题中不包括验证钩子edit_user_profile_update...... personal_options_update)在法典中,他们指出:考虑一个例子:update_user_meta($user_id, 'custom_meta_key', $_POST['custom_meta_key']);$_POST请务必确保为数据密钥和实际用户元密钥指定不同的密钥名称。如果您对两者使用相同的键,Wordpress 出于某种原因会清空该键下发布的值。因此,您总是会得到一个空值,$_POST['custom_meta_key']因此请在 html 输入元素的 name 属性中更改它并附加后缀。将其更改为$_POST['custom_meta_key_data'],它将正确传递数据。但是,考虑到我想向现有billing_phone字段添加验证,我不知道如何创建所述“ custom_meta_key_data”(例如:'_billing_phone'、 或'prefix_billing_phone'),然后将值输入到所述 prefix_billing_phone 中,然后转换为'billing_phone'via update_user_meta()。我在下面提供了我的基本代码,我已经在互联网上搜索了两天的解决方案,但我找不到解决方法。此外,str_replace()不执行操作,这让我查看内部,user-edit.php并且注释支持上面引用的注释,在点击更新和配置文件重新加载之间,它将每个变量保存为_billing_(前缀“_”)并记录原始值(前面的 if 语句/下面的代码)并保存该值 - 不是我条件/尝试验证的内容。我不知道如何复制它,以便我可以简单地验证我的字段......add_action( 'personal_options_update', 'audp_save_user_account_fields' );add_action( 'edit_user_profile_update', 'audp_save_user_account_fields' ); function audp_save_user_account_fields( $user_id ) {        /* Input Value: "0412 345 678"     * SHOULD Become: "0412345678"     */    $billing_phone = str_replace( array( ' ', '(', ')' ), '', $_POST['billing_phone'] );        if ( !empty( $_POST['billing_phone'] ) && preg_match( '/^04[0-9]{8}$/D', $billing_phone ) ) {                $billing_phone_query = get_users( array(             'meta_key' => 'billing_phone',            'meta_value' => $billing_phone,         ) );                foreach ( $billing_phone_query as $query ) {                        if ( $user_id == $query->ID ) {                                /* This value ($billing_phone) should be eg: "0412345678"                 * but remains "0412 345 678"                  */                update_user_meta( $user_id, 'billing_phone', $billing_phone );                        }                }        }}
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

更新

现在要过滤仅保留数字的电话号码字符串,您可以更好地preg_replace()使用str_replace().

下面,帐单电话号码在保存之前将被过滤:

  • WordPress 管理员用户仪表板

  • 我的帐户地址 编辑帐单地址

  • 下订单后(保存数据之前)

代码:

// In Wordpress user profile (increased hook priority)

add_action( 'personal_options_update', 'save_user_billing_phone_fields', 999999 );

add_action( 'edit_user_profile_update', 'save_user_billing_phone_fields', 999999 );

function save_user_billing_phone_fields( $user_id ) {

    $field_key = 'billing_phone';


    if( isset($_POST[$field_key]) && ! empty($_POST[$field_key]) ) {

        // Filtering billing phone (removing everything else than numbers)

        $billing_phone = preg_replace( '/[^0-9]/', '', sanitize_text_field($_POST[$field_key]) );


        // Update the billing phone

        update_user_meta( $user_id, 'billing_phone', $billing_phone );

    }

}


// On My account > edit addresses > Billing

add_action( 'woocommerce_process_myaccount_field_billing_phone', 'filter_my_account_billing_phone_fields' );

function filter_my_account_billing_phone_fields( $value ) {

    return preg_replace( '/[^0-9]/', '', $value );

}


// On order submission

add_action( 'woocommerce_checkout_posted_data', 'wc_checkout_posted_data_filter_callback' );

function  wc_checkout_posted_data_filter_callback( $data ) {

    $field_key = 'billing_phone';


    if( isset($data[$field_key]) ) {

        // Filtering billing phone (removing everything else than numbers)

        $data[$field_key] = preg_replace( '/[^0-9]/', '', $data[$field_key] );

    }

    return $data;

}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。


查看完整回答
反对 回复 2023-07-21
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信