__( 'Permission denied.', 'aisp-order-tools-for-woocommerce' ), ], 403 ); } $term = isset( $_GET['term'] ) ? sanitize_text_field( wp_unslash( $_GET['term'] ) ) : ''; if ( strlen( $term ) < 2 ) { wp_send_json( [] ); } global $wpdb; $like = '%' . $wpdb->esc_like( $term ) . '%'; $digits = preg_replace( '/\D+/', '', $term ); $phone_like = $digits ? '%' . $wpdb->esc_like( $digits ) . '%' : ''; $cache_key = 'aisp_user_search_' . md5( $like . $phone_like ); $results = wp_cache_get( $cache_key, 'aisp_otools' ); if ( false === $results ) { if ( $phone_like ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $results = $wpdb->get_results( $wpdb->prepare( "SELECT DISTINCT u.ID, u.display_name, u.user_email FROM {$wpdb->users} u LEFT JOIN {$wpdb->usermeta} um_company ON (u.ID = um_company.user_id AND um_company.meta_key = 'billing_company') LEFT JOIN {$wpdb->usermeta} um_phone ON (u.ID = um_phone.user_id AND um_phone.meta_key = 'billing_phone') WHERE u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_email LIKE %s OR um_company.meta_value LIKE %s OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(um_phone.meta_value,' ',''),'-',''),'(',''),')',''),'.','') LIKE %s ORDER BY u.display_name ASC LIMIT 10", $like, $like, $like, $like, $phone_like ) ); } else { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $results = $wpdb->get_results( $wpdb->prepare( "SELECT DISTINCT u.ID, u.display_name, u.user_email FROM {$wpdb->users} u LEFT JOIN {$wpdb->usermeta} um_company ON (u.ID = um_company.user_id AND um_company.meta_key = 'billing_company') WHERE u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_email LIKE %s OR um_company.meta_value LIKE %s ORDER BY u.display_name ASC LIMIT 10", $like, $like, $like, $like ) ); } wp_cache_set( $cache_key, $results, 'aisp_otools', 60 ); } $output = []; foreach ( $results as $user ) { $company = get_user_meta( $user->ID, 'billing_company', true ); $phone = get_user_meta( $user->ID, 'billing_phone', true ); $label = esc_html( $user->display_name ); if ( $company ) { $label .= ' — ' . esc_html( $company ); } if ( $phone ) { $label .= ' (' . esc_html( $phone ) . ')'; } else { $label .= ' (' . esc_html( $user->user_email ) . ')'; } $output[] = [ 'id' => (int) $user->ID, 'text' => $label, ]; } wp_send_json( $output ); } public function get_user_billing() { check_ajax_referer( 'aisp_assign_user_nonce', 'security' ); if ( ! current_user_can( 'manage_woocommerce' ) ) { wp_send_json_error( [ 'message' => esc_html__( 'Permission denied.', 'aisp-order-tools-for-woocommerce' ), ], 403 ); } $user_id = isset( $_GET['user_id'] ) ? absint( $_GET['user_id'] ) : 0; if ( ! $user_id || ! get_user_by( 'id', $user_id ) ) { wp_send_json_error( [ 'message' => esc_html__( 'User not found.', 'aisp-order-tools-for-woocommerce' ), ] ); } $user = get_userdata( $user_id ); $billing = [ 'billing_first_name' => get_user_meta( $user_id, 'billing_first_name', true ), 'billing_last_name' => get_user_meta( $user_id, 'billing_last_name', true ), 'billing_company' => get_user_meta( $user_id, 'billing_company', true ), 'billing_email' => $user->user_email, 'billing_phone' => get_user_meta( $user_id, 'billing_phone', true ), 'billing_address_1' => get_user_meta( $user_id, 'billing_address_1', true ), 'billing_address_2' => get_user_meta( $user_id, 'billing_address_2', true ), 'billing_city' => get_user_meta( $user_id, 'billing_city', true ), 'billing_postcode' => get_user_meta( $user_id, 'billing_postcode', true ), 'billing_country' => get_user_meta( $user_id, 'billing_country', true ), 'billing_state' => get_user_meta( $user_id, 'billing_state', true ), ]; wp_send_json_success( [ 'user_id' => $user_id, 'display_name' => $user->display_name, 'email' => $user->user_email, 'billing' => $billing, ] ); } public function assign_user_to_order() { check_ajax_referer( 'aisp_assign_user_nonce', 'security' ); if ( ! current_user_can( 'manage_woocommerce' ) ) { wp_send_json_error( [ 'message' => esc_html__( 'Permission denied.', 'aisp-order-tools-for-woocommerce' ), ], 403 ); } $order_id = isset( $_POST['order_id'] ) ? absint( $_POST['order_id'] ) : 0; $user_id = isset( $_POST['user_id'] ) ? absint( $_POST['user_id'] ) : 0; if ( ! $order_id || ! $user_id ) { wp_send_json_error( [ 'message' => esc_html__( 'Invalid data.', 'aisp-order-tools-for-woocommerce' ), ] ); } $order = wc_get_order( $order_id ); if ( ! $order ) { wp_send_json_error( [ 'message' => esc_html__( 'Order not found.', 'aisp-order-tools-for-woocommerce' ), ] ); } $order->set_customer_id( $user_id ); $order->save(); if ( 'pending' === $order->get_status() && $order->get_billing_email() ) { $mailer = WC()->mailer(); $email_classes = $mailer->get_emails(); if ( isset( $email_classes['WC_Email_Customer_On_Hold_Order'] ) ) { $email_classes['WC_Email_Customer_On_Hold_Order']->trigger( $order_id ); } elseif ( isset( $email_classes['WC_Email_Customer_Processing_Order'] ) ) { $email_classes['WC_Email_Customer_Processing_Order']->trigger( $order_id ); } } wp_send_json_success( [ 'message' => esc_html__( 'Order assigned successfully and customer notified.', 'aisp-order-tools-for-woocommerce' ), ] ); } }