简体   繁体   English

在 WooCommerce 管理员订单仪表板中更新客户密码

[英]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.

相关问题 在 Woocommerce Admin Edit Orders 页面中显示客户取消的订单数 - Display customer cancelled orders count in Woocommerce Admin Edit Orders pages 将客户email和“订单”栏中的电话添加到Woocommerce的管理订单列表中 - Add customer email and phone in "Order" column to admin orders list on Woocommerce WooCommerce 管理订单列表中发送客户发票的操作按钮 - Action button in WooCommerce admin orders list that send the customer invoice 将新列中的客户电子邮件添加到 Woocommerce 上的管理订单列表 - Add customer email in a new column to admin orders list on Woocommerce WooCommerce 管理员订单列表自定义列,其中包含发送给客户的订单备注 - WooCommerce admin orders list custom column with order notes sent to customer 删除“主页”并直接转到 WordPress 管理仪表板上的 WooCommerce“订单” - Remove "Home" and go direct to WooCommerce "Orders" on WordPress Admin dashboard 获取Woocommerce客户订单 - Get Woocommerce customer orders 在 WooCommerce 管理员订单列表的自定义列中显示私人和客户管理员注释 - Display private and customer admin notes in a custom column on WooCommerce admin orders list 通过 WooCommerce 中的管理员编辑订单自动添加或更新自定义费用 - Auto add or update a custom fee via admin edit orders in WooCommerce 在 WooCommerce 我的帐户订单列表中添加发送给客户的管理员订单备注 - Add Admin order notes sent to customer in WooCommerce My Account Orders list
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM