WP_REST_Server::CREATABLE, 'callback' => array( $this, 'upload_image' ), 'args' => $this->get_params_upload(), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ); // register_rest_route( $this->namespace, '/media', $media ); // register_rest_route( $this->namespace_v3, '/media', $media ); $product = array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'flutter_create_product' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ); register_rest_route( $this->namespace, '/product', $product ); register_rest_route( $this->namespace_v3, '/product', $product ); register_rest_route( $this->namespace, '/products/owner', array( array( 'methods' => 'POST', 'callback' => array( $this, 'flutter_get_products' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/wcfm-stores', array( array( 'methods' => 'GET', 'callback' => array( $this, 'flutter_get_wcfm_stores' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/wcfm-stores' . '/(?P[\d]+)/', array( 'args' => array( 'id' => array( 'description' => __( 'Unique identifier for the object.', 'wcfm-marketplace-rest-api' ), 'type' => 'integer', ), ), array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'flutter_get_wcfm_stores_by_id' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/shipping-methods', array( array( 'methods' => 'POST', 'callback' => array( $this, 'flutter_get_shipping_methods' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/vendor-orders', array( array( 'methods' => 'GET', 'callback' => array( $this, 'flutter_get_vendor_orders' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/get-nearby-stores', array( array( 'methods' => 'GET', 'callback' => array( $this, 'flutter_get_nearby_stores' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/vendor/dynamic', array( array( 'methods' => 'GET', 'callback' => array( $this, 'get_vendor_from_dynamic_link' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/vendor/vacation', array( array( 'methods' => 'GET', 'callback' => array( $this, 'get_vendor_vacation_option' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); register_rest_route( $this->namespace, '/vendor/vacation', array( array( 'methods' => 'POST', 'callback' => array( $this, 'set_vendor_vacation_option' ), 'permission_callback' => function () { return parent::checkApiPermission(); }, ), ) ); } function get_vendor_vacation_option( $request ) { if ( isset( $request['store_id'] ) ) { if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { global $WCFM, $WCFMmp; $is_marketplace = wcfm_is_marketplace(); $vendor_id = $request['store_id']; $type = get_user_meta( $vendor_id, 'wcfm_vacation_mode_type', true ); $vendor_has_vacation = $WCFM->wcfm_vendor_support->wcfm_vendor_has_capability( $vendor_id, 'vacation' ); if ( $vendor_has_vacation ) { if ( $is_marketplace == 'wcfmmarketplace' ) { $vendor_data = get_user_meta( $vendor_id, 'wcfmmp_profile_settings', true ); $vacation_mode = isset( $vendor_data['wcfm_vacation_mode'] ) ? $vendor_data['wcfm_vacation_mode'] : 'no'; $disable_vacation_purchase = isset( $vendor_data['wcfm_disable_vacation_purchase'] ) ? $vendor_data['wcfm_disable_vacation_purchase'] : 'no'; $wcfm_vacation_mode_type = isset( $vendor_data['wcfm_vacation_mode_type'] ) ? $vendor_data['wcfm_vacation_mode_type'] : 'instant'; $wcfm_vacation_start_date = isset( $vendor_data['wcfm_vacation_start_date'] ) ? $vendor_data['wcfm_vacation_start_date'] : ''; $wcfm_vacation_end_date = isset( $vendor_data['wcfm_vacation_end_date'] ) ? $vendor_data['wcfm_vacation_end_date'] : ''; $vacation_msg = ! empty( $vendor_data['wcfm_vacation_mode_msg'] ) ? $vendor_data['wcfm_vacation_mode_msg'] : ''; } else { $vacation_mode = ( get_user_meta( $vendor_id, 'wcfm_vacation_mode', true ) ) ? get_user_meta( $vendor_id, 'wcfm_vacation_mode', true ) : 'no'; $disable_vacation_purchase = ( get_user_meta( $vendor_id, 'wcfm_disable_vacation_purchase', true ) ) ? get_user_meta( $vendor_id, 'wcfm_disable_vacation_purchase', true ) : 'no'; $wcfm_vacation_mode_type = ( get_user_meta( $vendor_id, 'wcfm_vacation_mode_type', true ) ) ? get_user_meta( $vendor_id, 'wcfm_vacation_mode_type', true ) : 'instant'; $wcfm_vacation_start_date = ( get_user_meta( $vendor_id, 'wcfm_vacation_start_date', true ) ) ? get_user_meta( $vendor_id, 'wcfm_vacation_start_date', true ) : ''; $wcfm_vacation_end_date = ( get_user_meta( $vendor_id, 'wcfm_vacation_end_date', true ) ) ? get_user_meta( $vendor_id, 'wcfm_vacation_end_date', true ) : ''; $vacation_msg = ( $vacation_mode ) ? get_user_meta( $vendor_id, 'wcfm_vacation_mode_msg', true ) : ''; } $data = array( 'wcfm_vacation_mode' => $vacation_mode, 'wcfm_disable_vacation_purchase' => $disable_vacation_purchase, 'wcfm_vacation_mode_type' => $wcfm_vacation_mode_type, 'wcfm_vacation_start_date' => $wcfm_vacation_start_date, 'wcfm_vacation_end_date' => $wcfm_vacation_end_date, 'wcfm_vacation_mode_msg' => $vacation_msg, ); return $data; } return array(); } return parent::sendError( 'invalid_platform', 'Dokan is not supported', 404 ); } return parent::sendError( 'invalid_id', 'Not Found', 404 ); } function set_vendor_vacation_option( $request ) { $cookie = $request['cookie']; $user_id = validateCookieLogin( $cookie ); if ( is_wp_error( $user_id ) ) { return $user_id; } $user = get_userdata( $user_id ); $is_seller = in_array( 'seller', $user->roles ) || in_array( 'wcfm_vendor', $user->roles ) || in_array( 'administrator', $user->roles ); if ( $is_seller ) { if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { global $WCFM, $WCFMmp; $is_marketplace = wcfm_is_marketplace(); $vendor_id = $user_id; $type = get_user_meta( $vendor_id, 'wcfm_vacation_mode_type', true ); $vendor_has_vacation = $WCFM->wcfm_vendor_support->wcfm_vendor_has_capability( $vendor_id, 'vacation' ); if ( $vendor_has_vacation ) { $vacation_mode = $request['wcfm_vacation_mode']; $disable_vacation_purchase = $request['wcfm_disable_vacation_purchase']; $wcfm_vacation_mode_type = $request['wcfm_vacation_mode_type']; $wcfm_vacation_start_date = ( $vacation_mode ) ? $request['wcfm_vacation_start_date'] : ''; $wcfm_vacation_end_date = ( $vacation_mode ) ? $request['wcfm_vacation_end_date'] : ''; $vacation_msg = ( $vacation_mode ) ? $request['wcfm_vacation_mode_msg'] : ''; if ( $is_marketplace == 'wcfmmarketplace' ) { $vendor_data = get_user_meta( $vendor_id, 'wcfmmp_profile_settings', true ); $vendor_data['wcfm_vacation_mode'] = $vacation_mode; $vendor_data['wcfm_disable_vacation_purchase'] = $disable_vacation_purchase; $vendor_data['wcfm_vacation_mode_type'] = $wcfm_vacation_mode_type; $vendor_data['wcfm_vacation_start_date'] = $wcfm_vacation_start_date; $vendor_data['wcfm_vacation_end_date'] = $wcfm_vacation_end_date; $vendor_data['wcfm_vacation_mode_msg'] = $vacation_msg; update_user_meta( $vendor_id, 'wcfmmp_profile_settings', $vendor_data ); } else { update_user_meta( $vendor_id, 'wcfm_vacation_mode', $vacation_mode ); update_user_meta( $vendor_id, 'wcfm_disable_vacation_purchase', $disable_vacation_purchase ); update_user_meta( $vendor_id, 'wcfm_vacation_mode_type', $wcfm_vacation_mode_type ); update_user_meta( $vendor_id, 'wcfm_vacation_start_date', $wcfm_vacation_start_date ); update_user_meta( $vendor_id, 'wcfm_vacation_end_date', $wcfm_vacation_end_date ); update_user_meta( $vendor_id, 'wcfm_vacation_mode_msg', $vacation_msg ); } return true; } return false; } return parent::sendError( 'invalid_platform', 'Dokan is not supported', 404 ); } return parent::sendError( 'invalid_role', "You can't do this", 401 ); } function get_vendor_from_dynamic_link( $request ) { if ( isset( $request['url'] ) ) { $url = $request['url']; $items = explode( '/', $url ); $slug = null; for ( $i = count( $items ) - 1; $i >= 0; $i-- ) { if ( strlen( $items[ $i ] ) > 0 ) { $slug = $items[ $i ]; break; } } if ( ! is_null( $slug ) ) { if ( is_plugin_active( 'dokan-lite/dokan.php' ) ) { $user = get_user_by( 'slug', $slug ); if ( $user ) { $store = dokan()->vendor->get( $user->ID ); return $store->to_array(); } } if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { global $wpdb; $results = array(); $table_name = $wpdb->prefix . 'users'; $sql = "SELECT {$table_name}.ID"; $sql .= " FROM {$table_name}"; $sql .= " WHERE {$table_name}.user_nicename = '{$slug}' "; $users = $wpdb->get_results( $sql ); if ( count( $users ) != 1 ) { return parent::sendError( 'invalid_url', 'Not Found', 404 ); } $helper = new FlutterWCFMHelper(); return $helper->flutter_get_wcfm_stores_by_id( $users[0]->ID )->get_data(); } } } return parent::sendError( 'invalid_url', 'Not Found', 404 ); } public function get_params_upload() { $params = array( 'media_attachment' => array( 'required' => true, 'description' => __( 'Image encoded as base64.', 'image-from-base64' ), 'type' => 'string', ), 'title' => array( 'required' => true, 'description' => __( 'The title for the object.', 'image-from-base64' ), 'type' => 'json', ), 'media_path' => array( 'description' => __( 'Path to directory where file will be uploaded.', 'image-from-base64' ), 'type' => 'string', ), ); return $params; } public function upload_image( $request ) { $response = array(); try { if ( ! empty( $request['media_path'] ) ) { $this->upload_dir = sanitize_file_name( $request['media_path'] ); $this->upload_dir = '/' . trim( $this->upload_dir, '/' ); add_filter( 'upload_dir', array( $this, 'change_wp_upload_dir' ) ); } if ( ! class_exists( 'WP_REST_Attachments_Controller' ) ) { throw new Exception( 'WP API not installed.' ); } $media_controller = new WP_REST_Attachments_Controller( 'attachment' ); $filename = $request['title']['rendered']; $img = $request['media_attachment']; $decoded = base64_decode( $img ); // disable this check to use woocommerce keys with readonly permission // $permission_check = $media_controller->create_item_permissions_check( $request ); // if( is_wp_error($permission_check) ){ // throw new Exception( $permission_check->get_error_message() ); // } $request->set_body( $decoded ); $request->add_header( 'Content-Disposition', "attachment;filename=\"{$filename}\"" ); $result = $media_controller->create_item( $request ); $response = rest_ensure_response( $result ); } catch ( Exception $e ) { $response['result'] = 'error'; $response['message'] = $e->getMessage(); } if ( ! empty( $request['media_path'] ) ) { remove_filter( 'upload_dir', array( $this, 'change_wp_upload_dir' ) ); } return $response; } function change_wp_upload_dir( $dirs ) { $dirs['baseurl'] = network_site_url( '/wp-content/uploads' ); $dirs['basedir'] = ABSPATH . 'wp-content/uploads'; $dirs['path'] = $dirs['basedir'] . $this->upload_dir . $dirs['subdir']; $dirs['url'] = $dirs['baseurl'] . $this->upload_dir . $dirs['subdir']; return $dirs; } /** * Create product * * @param $_REQUEST $request * @return obj product data */ public function flutter_create_product( $request ) { $cookie = sanitize_text_field( $request['cookie'] ); $user_id = validateCookieLogin( $cookie ); if ( is_wp_error( $user_id ) ) { return $user_id; } $user = get_userdata( $user_id ); $is_seller = in_array( 'seller', $user->roles ) || in_array( 'wcfm_vendor', $user->roles ) || in_array( 'administrator', $user->roles ); $request_status = 'draft'; if ( $request['status'] != null ) { $request_status = $request['status']; // Available status: draft,publish,pending } if ( $is_seller ) { $args = array( 'post_author' => $user_id, 'post_content' => $request['content'], 'post_status' => $request_status, // (Draft | Pending | Publish) 'post_title' => $request['title'], 'post_parent' => '', 'post_type' => 'product', ); // Create a simple WooCommerce product. $post_id = wp_insert_post( $args ); $product = wc_get_product( $post_id ); if ( isset( $request['regular_price'] ) ) { $product->set_regular_price( $request['regular_price'] ); } // Sale Price. if ( isset( $request['sale_price'] ) ) { $product->set_sale_price( $request['sale_price'] ); } if ( isset( $request['date_on_sale_from'] ) ) { $product->set_date_on_sale_from( $request['date_on_sale_from'] ); } if ( isset( $request['date_on_sale_from_gmt'] ) ) { $product->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); } if ( isset( $request['date_on_sale_to'] ) ) { $product->set_date_on_sale_to( $request['date_on_sale_to'] ); } if ( isset( $request['date_on_sale_to_gmt'] ) ) { $product->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); } if ( isset( $request['image_ids'] ) ) { update_post_meta( $post_id, '_product_image_gallery', join( ',', $request['image_ids'] ) ); if ( count( $request['image_ids'] ) > 0 ) { set_post_thumbnail( $post_id, $request['image_ids'][0] ); } } wp_set_object_terms( $post_id, isset( $request['product_type'] ) ? $request['product_type'] : 'simple', 'product_type' ); // Available product type: simple, grouped, product-external, variable. $product->save(); $product = wc_get_product( $post_id ); if ( isset( $request['categories'] ) && count( $request['categories'] ) > 0 ) { $product->set_category_ids( array( $request['categories'][0]['id'] ) ); $product->save(); } return $product->get_data(); } else { return parent::sendError( 'invalid_role', 'You must be seller to create product', 401 ); } } public function flutter_delete_product( $request ) { $cookie = $request['cookie']; $user_id = validateCookieLogin( $cookie ); if ( is_wp_error( $user_id ) ) { return $user_id; } $product_id = $request['id']; global $woocommerce, $wpdb; $table_name = $wpdb->prefix . 'posts'; $sql = "SELECT count(*) as count FROM `$table_name` WHERE `$table_name`.`post_author` = $user_id AND `$table_name`.`post_type` = 'product' AND `$table_name`.`id` = $product_id LIMIT 1"; $results = $wpdb->get_row( $sql ); if ( $results->count == 1 ) { $controller = new CUSTOM_WC_REST_Products_Controller(); $req = new WP_REST_Request( 'GET' ); $params = array( 'id' => $product_id, 'force' => true, ); $req->set_query_params( $params ); return $controller->delete_item( $req ); } else { return parent::sendError( 'invalid_product', 'The product is invalid', 400 ); } } public function flutter_get_products( $request ) { $cookie = $request['cookie']; $id = $request['id']; $user_id = isset( $id ) ? $id : validateCookieLogin( $cookie ); if ( is_wp_error( $user_id ) ) { return $user_id; } $page = isset( $request['page'] ) ? $request['page'] : 1; $page = $page - 1; $limit = isset( $request['limit'] ) ? $request['limit'] : 10; $page = $page * $limit; if ( isset( $id ) ) { $args = array( 'author' => $user_id, 'post_type' => 'product', 'posts_per_page' => $limit, 'offset' => $page, 'post_status' => 'publish', ); if ( isset( $request['on_sale'] ) && $request['on_sale'] == 'true' ) { $args['meta_query'] = array( 'relation' => 'OR', array( // Simple products type 'key' => '_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'numeric', ), array( // Variable products type 'key' => '_min_variation_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'numeric', ), ); } if ( isset( $request['order'] ) && isset( $request['orderby'] ) ) { $args['meta_key'] = 'total_sales'; $args['order'] = $request['order']; if ( $request['orderby'] == 'popularity' ) { $args['orderby'] = 'meta_value_num'; $args['meta_query'] = array( array( 'key' => 'total_sales', 'value' => 0, 'compare' => '>', ), ); } if ( $request['orderby'] == 'date' ) { $args['orderby'] = 'date'; } } if ( isset( $request['search'] ) ) { $args['orderby'] = 'title'; $args['order'] = 'ASC'; $args['s'] = $request['search']; } if ( isset( $request['category'] ) ) { $args['tax_query'] = array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $request['category'], 'operator' => 'IN', ), ); } $products = get_posts( $args ); } else { global $woocommerce, $wpdb; $table_name = $wpdb->prefix . 'posts'; $sql = "SELECT * FROM `$table_name` WHERE `$table_name`.`post_author` = $user_id AND `$table_name`.`post_type` = 'product' LIMIT $limit OFFSET $page"; $products = $wpdb->get_results( $sql ); } $ids = array(); foreach ( $products as $object ) { $ids[] = $object->ID; } if ( count( $ids ) > 0 ) { add_filter( 'woocommerce_rest_check_permissions', '__return_true' ); $controller = new WC_REST_Products_Controller(); $req = new WP_REST_Request( 'GET' ); $params = array( 'status' => isset( $id ) ? 'published' : 'any', 'include' => $ids, 'page' => 1, 'per_page' => $limit, 'orderby' => 'title', 'order' => 'desc', ); if ( isset( $request['lang'] ) ) { $params['lang'] = $request['lang']; } $req->set_query_params( $params ); $response = $controller->get_items( $req ); remove_filter( 'woocommerce_rest_check_permissions', '__return_true' ); return $response->get_data(); } else { return array(); } } public function flutter_get_wcfm_stores( $request ) { $helper = new FlutterWCFMHelper(); return $helper->flutter_get_wcfm_stores( $request ); } public function flutter_get_wcfm_stores_by_id( $request ) { $helper = new FlutterWCFMHelper(); $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; return $helper->flutter_get_wcfm_stores_by_id( $id ); } public function prepeare_product_response( $response, $object, $request ) { $response = customProductResponse( $response, $object, $request ); $data = $response->get_data(); $author_id = get_post_field( 'post_author', $data['id'] ); if ( is_plugin_active( 'dokan-lite/dokan.php' ) ) { $store = dokan()->vendor->get( $author_id ); $dataStore = $store->to_array(); $dataStore = array_merge( $dataStore, apply_filters( 'dokan_rest_store_additional_fields', array(), $store, $request ) ); $data['store'] = $dataStore; } if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { $helper = new FlutterWCFMHelper(); $data['store'] = $helper->flutter_get_wcfm_stores_by_id( $author_id )->get_data(); } $response->set_data( $data ); return $response; } public function flutter_get_shipping_methods( $request ) { $json = file_get_contents( 'php://input' ); $package = json_decode( $json, true ); $results = array(); $controller = new WC_REST_Shipping_Zone_Methods_V2_Controller(); $zone = WC_Shipping_Zones::get_zone_matching_package( $package ); $request['zone_id'] = $zone->get_id(); if ( class_exists( 'WeDevs\DokanPro\Shipping\ShippingZone' ) ) { $seller_id = $package['seller_id']; $shipping_methods = WeDevs\DokanPro\Shipping\ShippingZone::get_shipping_methods( $zone->get_id(), $seller_id ); if ( count( $shipping_methods ) == 0 ) { $shipping_methods = $controller->get_items( $request ); foreach ( $shipping_methods->data as $method ) { if ( $method['method_id'] != 'dokan_vendor_shipping' ) { $results[] = $method; } } } else { foreach ( $shipping_methods as $key => $method ) { $results[] = $method; } } } else { $shipping_methods = $controller->get_items( $request ); return $shipping_methods->data; } return $results; } public function flutter_get_vendor_orders( $request ) { $cookie = $request['cookie']; if ( isset( $request['token'] ) ) { $cookie = sanitize_text_field( $request['token'] ); } $user_id = validateCookieLogin( $cookie ); if ( is_wp_error( $user_id ) ) { return $user_id; } $api = new WC_REST_Orders_V1_Controller(); $papi = new WC_REST_Products_Controller(); $req = new WP_REST_Request( 'GET' ); $page = isset( $request['page'] ) ? $request['page'] : 1; $page = $page - 1; $limit = isset( $request['per_page'] ) ? $request['per_page'] : 10; $page = $page * $limit; $orders = array(); $results = array(); if ( is_plugin_active( 'dokan-lite/dokan.php' ) ) { $orders = dokan_get_seller_orders( $user_id, 'all', null, 10000000, 0 ); } if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { global $wpdb; $table_name = $wpdb->prefix . 'wcfm_marketplace_orders'; $orders = $wpdb->get_results( "SELECT * FROM $table_name WHERE vendor_id = '$user_id' AND is_trashed != 1 ORDER BY order_id DESC LIMIT $page,$limit" ); } foreach ( $orders as $item ) { $order = wc_get_order( $item->order_id ); if ( $order != false ) { $response = $api->prepare_item_for_response( $order, $request ); $line_items = array(); foreach ( $response->data['line_items'] as $item ) { $product_id = $item['product_id']; $product = get_post( $product_id ); $product_author = $product->post_author; if ( absint( $product_author ) != absint( $user_id ) ) { continue; } $req->set_query_params( array( 'id' => $product_id ) ); $res = $papi->get_item( $req ); if ( is_wp_error( $res ) ) { $item['product_data'] = null; } else { $item['product_data'] = $res->get_data(); } if ( is_plugin_active( 'wc-multivendor-marketplace/wc-multivendor-marketplace.php' ) ) { $vendor_id = wcfm_get_vendor_id_by_post( $product_id ); if ( $vendor_id != $user_id ) { continue; } } $line_items[] = $item; $response->data['line_items'] = $line_items; } $results[] = $response->get_data(); } } return $results; } public function flutter_get_nearby_stores( $request ) { if ( is_plugin_active( 'dokan-lite/dokan.php' ) && is_plugin_active( 'dokan-pro/dokan-pro.php' ) ) { $lat = sanitize_text_field( $request['latitude'] ); $lng = sanitize_text_field( $request['longitude'] ); $distance = 10; if ( isset( $request['distance'] ) ) { $distance = sanitize_text_field( $request['distance'] ); } if ( isset( $request['search'] ) ) { $search = sanitize_text_field( $request['search'] ); } if ( isset( $lat ) && isset( $lng ) ) { $distance_unit = dokan_get_option( 'distance_unit', 'dokan_geolocation', 'km' ); $distance_earth_center_to_surface = ( 'km' === $distance_unit ) ? 6371 : 3959; global $wpdb; $table_name2 = $wpdb->prefix . 'usermeta'; if ( isset( $search ) ) { $query = "SELECT $table_name2.user_id FROM $table_name2 WHERE $table_name2.meta_key = 'dokan_store_name' AND $table_name2.meta_value LIKE '%$search%'"; $ids = $wpdb->get_results( $query ); if ( count( $ids ) == 0 ) { return array(); } if ( count( $ids ) > 0 ) { foreach ( $ids as $id ) { $user_ids[] = $id->user_id; } $user_ids = implode( ',', $user_ids ); } } $query = 'SELECT DISTINCT '; $query .= 'store_latitude.user_id, '; $query .= "($distance_earth_center_to_surface * acos(cos( radians($lat) ) * cos( radians(store_latitude.meta_value ) ) * cos( radians(store_longitude.meta_value ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( store_latitude.meta_value)))) AS distance"; $query .= " FROM $table_name2 AS store_latitude "; $query .= "LEFT JOIN $table_name2 as store_longitude ON store_latitude.user_id = store_longitude.user_id "; $query .= "WHERE store_latitude.meta_key = 'dokan_geo_latitude' AND store_longitude.meta_key = 'dokan_geo_longitude' "; if ( isset( $user_ids ) ) { $query .= "AND store_latitude.user_id IN ({$user_ids}) "; } $query .= "HAVING distance < $distance "; $query .= 'Limit 10'; $users = $wpdb->get_results( $query ); $results = array(); if ( count( $users ) > 0 ) { foreach ( $users as $user ) { $vendor = new Dokan_Vendor( $user->user_id ); $vendor_data = $vendor->to_array(); $results[] = $vendor_data; } } return $results; } } return array(); } public function flutter_get_reviews( $request ) { $page = sanitize_text_field( $request['page'] ); $per_page = sanitize_text_field( $request['per_page'] ); $store_id = sanitize_text_field( $request['store_id'] ); $status = 1; $status_type = sanitize_text_field( $request['status_type'] ); if ( ! isset( $store_id ) ) { return array(); } if ( ! isset( $page ) ) { $page = 1; } if ( ! isset( $per_page ) ) { $per_page = 10; } if ( isset( $status_type ) ) { if ( $status_type == 'approved' ) { $status = 1; } else { $status = 0; } } if ( is_plugin_active( 'wcfm-marketplace-rest-api/wcfm-marketplace-rest-api.php' ) ) { global $wpdb, $WCFM; $table_name = $wpdb->prefix . 'wcfm_marketplace_reviews'; $offset = ( $page - 1 ) * $per_page; $sql = "SELECT * FROM $table_name WHERE vendor_id = $store_id AND approved = $status ORDER BY created DESC LIMIT $per_page OFFSET $offset"; $reviews = $wpdb->get_results( $sql ); foreach ( $reviews as $each_review ) { $wp_user_avatar_id = get_user_meta( $each_review->author_id, 'wp_user_avatar', true ); $wp_user_avatar = wp_get_attachment_url( $wp_user_avatar_id ); if ( ! $wp_user_avatar ) { $wp_user_avatar = $WCFM->plugin_url . 'assets/images/avatar.png'; } $each_review->author_image = $wp_user_avatar; } return $reviews; } else { return parent::sendError( 'invalid_plugin', 'Please install WCFM Marketplace Rest API plugin', 400 ); } } } new FlutterVendor();