WooCommerce 在我的帐户表单提交上循环

WooCommerce Looping on My Account Form Submission

我试图通过两个挂钩覆盖我的帐户(登录用户)部分中的 account_display_name 字段。第一个删除 required 属性,第二个根据名字和姓氏的输入更新 display_name 字段。

此过滤器允许我从 display_name 字段中删除 required="required" 属性并按预期工作:

add_filter('woocommerce_save_account_details_required_fields', 'audp_myaccount_required_fields');
function audp_myaccount_required_fields( $required_fields ) {
    
    unset( $required_fields['account_display_name'] );
    
    return $required_fields;
    
}

下一步的目的是让我将提交的 account_first_nameaccount_last_name 保存为 display_name:

add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 );
function audp_myaccount_display_name( $display_name ) {
    
    global $current_user;
    
    if ( isset( $_POST['account_first_name'] ) && isset( $_POST['account_last_name'] ) ) {
        
        if ( ! empty( $_POST['account_first_name'] ) && ! empty( $_POST['account_last_name'] ) ) {
            
            wp_update_user( 
                array (
                    'ID' => $current_user->ID, 
                    'display_name' => sanitize_text_field( $_POST['account_first_name'] ) . ' ' . sanitize_text_field( $_POST['account_last_name'] ),
                )
            );
            
        }
    
    }
    
}

我在使用这段代码时遇到的问题是提交数据后的循环。页面 'eventually' returns 内部 500 错误。如果我停止进程(转义)并重新加载页面,则数据已更新。我只是不知道如何摆脱这个循环?

我研究了一些选项,包括 wp_update_user() 之前的 remove_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 )wp_update_user() 之后的 add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 ) 但这似乎也没有用。

如有任何帮助,我们将不胜感激!

您应该能够通过添加一个额外的过滤器来停止无限循环,该过滤器具有默认的 false 值,您可以在函数顶部检查该过滤器。当此过滤器 return 为真时停止执行您的代码。

然后在更新用户元并使其成为 return true 之前调用该过滤器。并在更新用户元后将其删除。这样,顶部的检查将 return true 第二次调用函数并停止无限循环,导致您的函数仅 运行 一次。

add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 );
function audp_myaccount_display_name( $display_name ) {
    
    if ( apply_filters( 'prevent_endless_loop_updating_user_meta', false ) )  return; // prevent endless loops
    
    global $current_user;
    
    if ( isset( $_POST['account_first_name'] ) && isset( $_POST['account_last_name'] ) ) {
        
        if ( ! empty( $_POST['account_first_name'] ) && ! empty( $_POST['account_last_name'] ) ) {
            
            add_filter( 'prevent_endless_loop_updating_user_meta', '__return_true' );
            wp_update_user( 
                array (
                    'ID' => $current_user->ID, 
                    'display_name' => sanitize_text_field( $_POST['account_first_name'] ) . ' ' . sanitize_text_field( $_POST['account_last_name'] ),
                )
            );
            remove_filter( 'prevent_endless_loop_updating_user_meta', '__return_true' );
            
        }
    
    }
    
}