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_name
和 account_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' );
}
}
}
我试图通过两个挂钩覆盖我的帐户(登录用户)部分中的 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_name
和 account_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' );
}
}
}