programing

WooCommerce 관리자 주문 대시보드에서 고객 암호 업데이트

powerit 2023. 4. 3. 21:47
반응형

WooCommerce 관리자 주문 대시보드에서 고객 암호 업데이트

우리는 꽤 구체적인 상황을 가지고 있는데 나는 이미 비슷한 것을 만들고 있는 사람이 있는지 궁금하다.Woocommerce 주문 시 주문 메일과 함께 WP에서 사용자를 생성합니다.이 비밀번호는 콘텐츠의 PIN 코드와 같기 때문에 담당자는 수동으로 비밀번호를 변경해야 합니다.이 PIN 번호는 클래식 우편으로 봉투에 넣어 발송합니다.문제는 에이전트가 수동으로 주문 대시보드에서 사용자로 이동하여 적절한 사용자를 찾고 암호를 변경해야 한다는 것입니다.다른 방법이 없을까?input field주문 대시보드에서 이 주문에 연결된 사용자의 암호를 설정할 수 있습니까?

다음은 관리자 주문 목록에 사용자 지정 열(각 행에 버튼 포함)을 추가하여 Ajax를 통해 사용자 암호를 편집할 수 있는 전체 솔루션입니다.

여기에 이미지 설명 입력

그런 다음 점장이 원하는 주문의 버튼을 클릭하면 입력 텍스트 필드가 나타나며 Ajax를 통해 새 비밀번호를 업데이트할 수 있습니다.

여기에 이미지 설명 입력

이 업데이트의 성공 여부를 나타내는 메시지가 잠시 표시됩니다.

완전한 코드는 다음과 같습니다.

// 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();
    }
}

코드는 기능합니다.php 파일(또는 활성 테마)입니다(또는 활성 테마)을 입력합니다.테스트 및 동작.

또 다른 비슷한 방법이 있는데, 이번에는 관리 페이지에서 오른쪽에 커스텀 메타박스를 사용하여 주문 페이지를 편집하고 Ajax를 사용하여 고객 비밀번호를 업데이트합니다.

여기에 이미지 설명 입력

이 패스워드 갱신이 성공했는지, 빈 패스워드 송신이나 패스워드의 공백 스페이스를 허가하지 않는지를 나타내는 메세지가 표시됩니다.

코드는 다음과 같습니다.

// 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();
    }
}

코드는 기능합니다.php 파일(또는 활성 테마)입니다(또는 활성 테마)을 입력합니다.테스트 및 동작.

그러면 해당 고객의 사용자를 편집하기 위한 링크가 포함된 새 열을 주문 목록 테이블에 추가할 수 있습니다.

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' );

언급URL : https://stackoverflow.com/questions/65751587/update-customer-password-in-woocommerce-admin-orders-dashboard

반응형