[英]Update customer password in WooCommerce admin orders dashboard
We have a pretty specific situation and I wonder anyone already make something similar.我们有一个非常具体的情况,我想知道是否有人已经做了类似的事情。 On Woocommerce order we generate user in WP with order mail.
在 Woocommerce 订单上,我们使用订单邮件在 WP 中生成用户。 Then our agents need to change their password manually because this password is like a PIN code to their content.
然后我们的代理需要手动更改他们的密码,因为这个密码就像他们内容的 PIN 码。 We ship these PIN numbers by classic mail in an envelope.
我们通过信封邮寄这些 PIN 码。 The problem is that agents need to manually go from order dashboard to Users - find the right user and change their password.
问题是代理需要手动从订单仪表板到用户 go - 找到正确的用户并更改他们的密码。 Is there any way to make an
input field
on the order dashboard to set a password for the user linked to this order?有没有办法在订单仪表板上创建一个
input field
来为链接到该订单的用户设置密码?
Here is a complete solution that will add in admin orders list a custom column with a button (in each row) allowing editing the user password via Ajax.这是一个完整的解决方案,它将在管理员订单列表中添加一个带有按钮的自定义列(在每一行中),允许通过 Ajax 编辑用户密码。
Then when shop manager will click on the button of the desired order, an input text field will appear where the new password can be updated via Ajax.然后,当店长单击所需订单的按钮时,将出现一个输入文本字段,其中可以通过 Ajax 更新新密码。
A message will be shortly displayed showing if this update has succeeded or not.将很快显示一条消息,显示此更新是否成功。
So here is the complete code:所以这里是完整的代码:
// Add a column to admin orders list
add_filter( 'manage_edit-shop_order_columns', 'add_edit_password_orders_column' );
function add_edit_password_orders_column( $columns ) {
if( current_user_can( 'edit_shop_orders' ) ) {
$sorted_columns = [];
foreach ( $columns as $key => $value ) {
if ( $key === 'order_total') {
$sorted_columns[ 'edit_password' ] = __('Edit password', 'woocommerce');
}
$sorted_columns[$key] = $columns[$key];
}
return $sorted_columns;
}
return $columns;
}
// Column content
add_action( 'manage_shop_order_posts_custom_column', 'edit_password_orders_column_row_content' );
function edit_password_orders_column_row_content( $column ) {
if ( 'edit_password' === $column ) {
global $post, $the_order;
$user = $the_order->get_user();
if( is_a($user, 'WP_User') && $user->ID > 0 ) {
echo '<div class="edit_password userid-' . $user->ID . '" data-user_id="' . $user->ID . '">
<a class="button user-login" style="text-align:center; display:block;">' . __('Edit', 'woocommerce') . '</a>
<div class="hidden-fields" style="display:none;">
<input type="text" name="customer-password" class="customer-password" value="" style="width:auto; max-width:120px; margin-bottom: 6px;">
<input type="hidden" name="customer-id" class="customer-id" value="' . $user->ID . '">
<a class="button submit-password" style="text-align:center;">' . __('Ok', 'woocommerce') . '</a>
</div>
<div class="message-response" style="display:none;">Message</div>
</div>';
} else {
echo __("Guest user", "woocommerce");
}
}
}
// Jquery Ajax
add_action( 'admin_footer', 'edit_password_orders_column_js' );
function edit_password_orders_column_js() {
global $pagenow;
if ( $pagenow === 'edit.php' && isset($_GET['post_type']) && 'shop_order' === $_GET['post_type'] ) :
?>
<script type="text/javascript">
jQuery( function($){
$('div.edit_password > .button.user-login').on('click', function(e){
e.preventDefault();
$(this).hide('fast');
$(this).parent().find('.hidden-fields').show('slow');
});
$(document.body).on('click focus focusin', 'div.edit_password input.customer-password', function(e){
e.stopImmediatePropagation();
});
$('div.edit_password .button.submit-password').on('click', function(e){
e.preventDefault();
e.stopImmediatePropagation();
var $this = $(this),
$parent = $this.parent(),
password = $parent.find('input.customer-password').val(),
user_id = $parent.find('input.customer-id').val(),
text = '',
color = 'red';
$.ajax({
type: 'POST',
url: '<?php echo admin_url('/admin-ajax.php'); ?>',
data: {
'action' : 'updating_customer_password',
'customer-password': password,
'customer-id' : user_id
},
success: function (response) {
if ( response === 'empty' ) {
text = '<?php echo __('Empty input, retry…', 'woocommerce'); ?>';
} else if ( response === 'whitespace' ) {
text = '<?php echo __('No white spaces…', 'woocommerce'); ?>';
} else {
text = '<?php echo __('Updating password!', 'woocommerce'); ?>';
color = 'green';
}
$parent.find('input.customer-password').val('');
$parent.parent().find('.hidden-fields').hide('fast');
$parent.parent().find('div.message-response').css('color',color).html('<small>'+text+'<small>').show();
setTimeout(function(){
$parent.parent().find('div.message-response').css('color','black').html('').hide();
$parent.parent().find('a.user-login').show();
}, 2000);
console.log(response); // For testing (to be removed)
},
error: function (error) {
$this.parent().parent().find('.hidden-fields').hide('fast');
$this.parent().parent().find('div.message-response').html('Error!').css('color',color).show();
setTimeout(function(){
$parent.parent().find('div.message-response').css('color','black').html('').hide();
$parent.parent().find('a.user-login').show();
}, 2000);
console.log(error); // For testing (to be removed)
}
});
});
});
</script>
<?php
endif;
}
// PHP Ajax receiver
add_action('wp_ajax_updating_customer_password', 'action_ajax_updating_customer_password');
function action_ajax_updating_customer_password() {
if ( isset($_POST['customer-password']) && isset($_POST['customer-id']) ) {
$password = sanitize_text_field( $_POST['customer-password'] );
$user_id = intval( esc_attr( $_POST['customer-id'] ) );
if ( ! $password ) {
echo 'empty'; // empty input
} elseif ( strpos($password, ' ') !== false ) {
echo 'whitespace'; // empty input
} else {
wp_set_password( $password, $user_id ); // Set new password
}
wp_die();
}
}
Code goes in functions.php file of the active child theme (or active theme).代码进入活动子主题(或活动主题)的functions.php文件。 Tested and works.
测试和工作。
This will help you to add a new column in the order list table - that contains the link to edit user of the corresponding customer.这将帮助您在订单列表表中添加一个新列 - 其中包含编辑相应客户的用户的链接。
function wc_new_order_column( $columns ) {
$columns[ 'customer' ] = 'Customer';
return $columns;
}
add_filter( 'manage_edit-shop_order_columns', 'wc_new_order_column' );
function add_order_name_column_content( $column ) {
global $post;
if ( 'customer' === $column ) {
$order = wc_get_order( $post->ID );
$link = get_edit_user_link($order->get_customer_id());
$name = $order->get_billing_first_name();
echo "<a target='_blank' href=".$link.">".$name."</a>";
}
}
add_action( 'manage_shop_order_posts_custom_column', 'add_order_name_column_content' );
Here is another similar way but this time on Admin single edit order pages with a custom Metabox on right side, using Ajax to update the customer password.这是另一种类似的方式,但这次是在右侧带有自定义 Metabox 的管理单编辑订单页面上,使用 Ajax 更新客户密码。
A message will be shortly displayed showing if this password update has succeeded or not disallowing empty password submissions or whitespaces in the password.将很快显示一条消息,显示此密码更新是否成功或不允许空密码提交或密码中的空格。
Here is the code:这是代码:
// Adding a custom Metabox on WooCommerce single orders (on right side)
add_action( 'add_meta_boxes', 'add_custom_shop_order_metabox' );
function add_custom_shop_order_metabox(){
global $post;
$customer_id = get_post_meta( $post->ID, '_customer_user', true );
if ( $customer_id > 0 ) {
add_meta_box(
'custom_shop_order_metabox',
__('Change password', 'woocommerce'),
'content_custom_shop_order_metabox',
'shop_order',
'side',
'core'
);
}
}
// Custom Metabox content on WooCommerce single orders
function content_custom_shop_order_metabox() {
global $post;
$customer_id = get_post_meta( $post->ID, '_customer_user', true );
echo '<div class="options_group edit_password" style="min-height:4.5em;margin-top:12px;;">
<input type="text" name="customer-password" class="customer-password" value="">
<a class="button submit-password" style="text-align:center;">' . __('Submit', 'woocommerce') . '</a>
<input type="hidden" name="customer-id" class="customer-id" value="' . $customer_id . '">
<div class="message-response" style="margin-top:6px;"></div>
</div>';
}
// Jquery Ajax
add_action( 'admin_footer', 'edit_password_orders_column_js' );
function edit_password_orders_column_js() {
global $pagenow, $post_type;
if ( 'post.php' === $pagenow && 'shop_order' === $post_type ) :
?>
<script type="text/javascript">
jQuery( function($){
$('div.edit_password > .message-response').fadeOut(0);
$('div.edit_password > .button.submit-password').on('click', function(e){
e.preventDefault();
e.stopImmediatePropagation();
var $this = $(this),
$parent = $this.parent(),
password = $parent.find('.customer-password').val(),
user_id = $parent.find('.customer-id').val(),
text = '',
color = 'red';
$.ajax({
type: 'POST',
url: '<?php echo admin_url('/admin-ajax.php'); ?>',
data: {
'action' : 'updating_customer_password',
'customer-password': password,
'customer-id' : user_id
},
success: function (response) {
if ( response === 'empty' ) {
text = '<?php echo __('Empty input, retry…', 'woocommerce'); ?>';
} else if ( response === 'whitespace' ) {
text = '<?php echo __('No white spaces…', 'woocommerce'); ?>';
} else {
text = '<?php echo __('Password Updated!', 'woocommerce'); ?>';
color = 'green';
}
$parent.find('.customer-password').val('');
$parent.find('.message-response').html('<small>'+text+'<small>').css('color',color).fadeIn();
setTimeout(function(){
$parent.find('.message-response').fadeOut( function(){ $(this).css('color','black').html(''); });
}, 2000)
}
});
});
});
</script>
<?php
endif;
}
// PHP Ajax receiver
add_action('wp_ajax_updating_customer_password', 'action_ajax_updating_customer_password');
function action_ajax_updating_customer_password() {
if ( isset($_POST['customer-password']) && isset($_POST['customer-id']) ) {
$password = sanitize_text_field( $_POST['customer-password'] );
$user_id = intval( esc_attr( $_POST['customer-id'] ) );
if ( ! $password ) {
echo 'empty'; // empty input
} elseif ( strpos($password, ' ') !== false ) {
echo 'whitespace'; // empty input
} else {
wp_set_password( $password, $user_id ); // Set new password
}
wp_die();
}
}
Code goes in functions.php file of the active child theme (or active theme).代码进入活动子主题(或活动主题)的functions.php文件。 Tested and works.
测试和工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.