require_once( get_template_directory() . '/includes/products/elastic-search-api.php' ); require_once( get_template_directory() . '/includes/user/mailchimp.php' ); require_once( get_template_directory() . '/includes/products/manual_products.php' ); function savePimImage($data) { require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); dump('Start to update product: ' . $data); $image = json_decode($data); if (empty($image->image_url) || empty($image->pim_id)) { error_log('Image is wrong:' . $data); } //get product by pim_id $product = getProductByPIMId((int)$image->pim_id); $id_product = $product->get_ID(); if (!$product) { error_log('PIM product not found: ' . $image->pim_id); return false; } /** * Remove old images that was related with current product */ if ((int)$image->position === 0) { removeProductImages($product); } //TODO: on prod is not working $image_id = media_sideload_image( $image->image_url, null, '', 'id'); if (!$image_id) { error_log('Image was not downloaded:' . $image->image_url); return false; } // If the image is first, set it like thumbnail. The rest of images add in gallery if (!(int)$image->position) { dump('Set thumb'); update_post_meta($id_product, '_thumbnail_id', $image_id); } else { $gallery = get_post_meta($id_product, '_product_image_gallery', true); update_post_meta($id_product, '_product_image_gallery', $gallery . (!empty($gallery) ? ',' : '') . $image_id); } dump([ 'im_id' => $image_id, 'post' => $id_product, 'thnb' => $product->get_image_id(), 'galer' => $product->get_gallery_image_ids() ]); if (class_exists('WP_Smush')) { WP_Smush::get_instance()->core()->mod->smush->wp_smush_handle_async( $image_id ); } dump('FINISH: ' . $image->image_url); } function removeProductImages($product) { $images_ids = array_merge([(int)$product->get_image_id()], $product->get_gallery_image_ids()); dump('List of old files:' . json_encode($images_ids) ) ; foreach ( $images_ids as $id_attachment ) { $id_attachment = (int)$id_attachment; if (!$id_attachment) { continue; } $file = get_attached_file( (int)$id_attachment ); //dump("File removing($id_attachment):" . json_encode($file) ) ; if ($file !== '' && file_exists($file)) { wp_delete_file( $file ); } wp_delete_attachment( $id_attachment, true ); } update_post_meta($product->get_ID(), '_thumbnail_id', ''); update_post_meta($product->get_ID(), '_product_image_gallery', ''); } add_filter( 'woocommerce_checkout_fields' , 'trigger_update_checkout_on_change' ); function trigger_update_checkout_on_change( $fields ) { $fields['billing']['billing_phone']['label'] = __t('Phone Number'); $fields['billing']['billing_first_name']['label'] = __t('First Name'); $fields['billing']['billing_last_name']['label'] = __t('Last Name'); $fields['billing']['billing_postcode']['label'] = __t('Post Code / Zip'); $fields['billing']['billing_city']['label'] = __t('City'); $fields['billing']['billing_country']['label'] = __t('Country'); $fields['billing']['billing_address_1']['label'] = __t('Street Address'); $fields['billing']['billing_address_2']['label'] = __t('This field'); $fields['billing']['billing_address_1']['placeholder'] = __t('Street and number, P.O. box, C/O'); $fields['billing']['billing_address_2']['placeholder'] = __t('Flat, Suit, Unit, Building, Floor, etc'); unset($fields['billing']['billing_company']); unset($fields['billing']['billing_state']); unset($fields['billing']['billing_email']); unset($fields['billing']['billing_phone']); $fields['billing']['billing_first_name']['priority'] = '1'; $fields['billing']['billing_last_name']['priority'] = '2'; $fields['billing']['billing_address_1']['priority'] = '3'; $fields['billing']['billing_address_2']['priority'] = '4'; $fields['billing']['billing_postcode']['priority'] = '5'; $fields['billing']['billing_city']['priority'] = '6'; $fields['billing']['billing_country']['priority'] = '7'; $fields['billing']['billing_first_name']['required'] = '1'; $fields['billing']['billing_address_1']['required'] = '1'; $fields['billing']['billing_postcode']['required'] = '1'; $fields['billing']['billing_city']['required'] = '1'; $fields['billing']['billing_country']['required'] = '1'; $fields['shipping']['shipping_first_name']['label'] = __t('First Name'); $fields['shipping']['shipping_last_name']['label'] = __t('Last Name'); $fields['shipping']['shipping_phone']['required'] = '1'; $fields['shipping']['shipping_postcode']['label'] = __t('Post Code / Zip', 'woocommerce'); $fields['shipping']['shipping_city']['label'] = __t('City', 'woocommerce'); $fields['shipping']['shipping_country']['label'] = __t('Country', 'woocommerce'); $fields['shipping']['shipping_address_1']['label'] = __t('Street Address', 'woocommerce'); $fields['shipping']['shipping_address_2']['label'] = __t('This field'); $fields['shipping']['shipping_address_1']['placeholder'] = __t('Street and number, P.O. box, C/O', 'woocommerce'); $fields['shipping']['shipping_address_2']['placeholder'] = __t('Flat, Suit, Unit, Building, Floor, etc'); unset($fields['shipping']['shipping_company']); unset($fields['shipping']['shipping_state']); unset($fields['shipping']['shipping_email']); unset($fields['shipping']['shipping_phone']); $fields['shipping']['shipping_first_name']['priority'] = '1'; $fields['shipping']['shipping_last_name']['priority'] = '2'; $fields['shipping']['shipping_address_1']['priority'] = '3'; $fields['shipping']['shipping_address_2']['priority'] = '4'; $fields['shipping']['shipping_postcode']['priority'] = '5'; $fields['shipping']['shipping_city']['priority'] = '6'; $fields['shipping']['shipping_country']['priority'] = '7'; $fields['shipping']['shipping_first_name']['required'] = '1'; $fields['shipping']['shipping_address_1']['required'] = '1'; $fields['shipping']['shipping_postcode']['required'] = '1'; $fields['shipping']['shipping_city']['required'] = '1'; $fields['shipping']['shipping_country']['required'] = '1'; return $fields; } function length_without_space($string) { $string = str_replace(' ', '', $string); return strlen($string); } add_action('woocommerce_after_checkout_validation', 'add_fake_error'); function add_fake_error($posted) { global $woocommerce; $items = $woocommerce->cart->get_cart(); $user_id = get_current_user_id(); $remove = []; foreach ($items as $item => $values) { $values['product_id'] = (int)$values['product_id']; $req_check = check_req_exists($user_id, $values['product_id']); if ($req_check!='') { continue; } if (!isInStock($values['product_id'])) { $remove[] = $values['product_id']; $cartId = WC()->cart->generate_cart_id( $values['product_id'] ); $cartItemKey = WC()->cart->find_product_in_cart( $cartId ); WC()->cart->remove_cart_item( $cartItemKey ); } } $phone = get_user_meta( $user_id, 'billing_phone', true ); if($phone == ''){ wc_add_notice( __t('orders.empty_phone', ['link' => site_url() . '/my-account' ]), 'error'); } if (count($remove) > 0) { wc_add_notice( __( "quantity_error Sorry but the selcted has been sold. You can contact our team for more options", "quantity_error Sorry but the selected has been sold. You can contact our team for more options" ), 'error'); } if ($_POST['confirm-order-flag'] == "1") { wc_add_notice( __( "custom_notice", 'fake_error' ), 'error'); } if($_POST['billing_postcode'] != "") { $billing_postcode = str_replace(' ', '', $_POST['billing_postcode']); if(strlen($billing_postcode) < 3 || strlen($billing_postcode) > 10) wc_add_notice( __( "billing_postcode", 'billing_postcode' ), 'error'); if(!preg_match('/^[a-zA-Z0-9-]+$/', $billing_postcode)) wc_add_notice( __( "billing_postcode_format", 'billing_postcode_format' ), 'error'); } if($_POST['billing_first_name'] != "") { if(length_without_space($_POST['billing_first_name']) < 3 || length_without_space($_POST['billing_first_name']) > 50) wc_add_notice( __( "billing_first_name", 'billing_first_name' ), 'error'); } if($_POST['billing_last_name'] != "") { if(length_without_space($_POST['billing_last_name']) > 50) wc_add_notice( __( "billing_last_name", 'billing_last_name' ), 'error'); } if($_POST['billing_address_1'] != "") { if(length_without_space($_POST['billing_address_1']) > 150) wc_add_notice( __( "billing_address_1", 'billing_address_1' ), 'error'); } if($_POST['billing_city'] != "") { if(length_without_space($_POST['billing_city']) > 50) wc_add_notice( __( "billing_city", 'billing_city' ), 'error'); } if ($_POST['payment_method'] === 'paypal') { wc_add_notice( __( __t('orders.paypal_not_allowed'), 'payment_method' ), 'error'); } if(isset($_POST['ship_to_different_address']) && $_POST['ship_to_different_address'] = 'on') { if($_POST['shipping_postcode'] != "") { $shipping_postcode = str_replace(' ', '', $_POST['shipping_postcode']); if(strlen($shipping_postcode) < 3 || strlen($shipping_postcode) > 10) wc_add_notice( __( "shipping_postcode", 'billing_postcode' ), 'error'); if(!preg_match('/^[a-zA-Z0-9-]+$/', $shipping_postcode)) wc_add_notice( __( "shipping_postcode_format", 'shipping_postcode_format' ), 'error'); } if($_POST['shipping_first_name'] != "") { if(length_without_space($_POST['shipping_first_name']) < 3 || length_without_space($_POST['shipping_first_name']) > 50) wc_add_notice( __( "shipping_first_name", 'shipping_first_name' ), 'error'); } if($_POST['shipping_last_name'] != "") { if(length_without_space($_POST['shipping_last_name']) > 50) wc_add_notice( __( "shipping_last_name", 'shipping_last_name' ), 'error'); } if($_POST['shipping_address_1'] != "") { if(length_without_space($_POST['shipping_address_1']) > 150) wc_add_notice( __( "shipping_address_1", 'shipping_address_1' ), 'error'); } if($_POST['shipping_city'] != "") { if(length_without_space($_POST['shipping_city']) > 50) wc_add_notice( __( "shipping_city", 'shipping_city' ), 'error'); } } } add_action('woocommerce_after_checkout_validation', 'add_fake_error'); function check_req_exists($user_id=0,$product_id=0) { $args = array( 'posts_per_page' => 1, 'post_type'=> 'order_request', 'author' => $user_id, 'post_status' => 'any', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'request_status', 'value' => 'Confirmed', 'compare' => '=' ), array( 'key' => 'requested_product', 'value' => $product_id, 'compare' => '=' ), ), ); $query = new WP_Query; $order_req = $query->query($args); return isset($order_req[0]) ? $order_req[0]->ID : null; } add_action( 'woocommerce_order_status_changed', 'woocommerce_order_status_changed_action', 10, 3 ); function woocommerce_order_status_changed_action( $order_id, $old_status, $new_status ) { saveLogInFile("Start prepare order for sending: $order_id - $old_status - $new_status"); if ($new_status === 'cancelled' || $new_status === 'failed') { return; } $order = wc_get_order( $order_id ); $user_id = $order->get_user_id(); saveLogInFile("Before sending user: " . $user_id); //Update user's data acoring added data in checkout form post_user_reg_redirect($user_id); $isSent = $order->get_meta('sent_to_erp'); saveLogInFile('Is order sent?: '. (int)$isSent); if ((int)$isSent === 1) { return false; } $data_send = prepareOrderData($order, $user_id); saveLogInFile('Send to ERP order: '. json_encode($data_send)); if (isProduction()) { $erp = new App\Services\ErpService('SYNC.ORDER'); $erp->sendMessage(null, $data_send); update_field('sent_to_erp', 1, $order_id); } //TODO: check the result and if it is an error - make something /** * Remove ordered products from stock and convert the related request to the order * According the documentation, the ERP have to remove the productuc, * But who knows when they will run this action. */ closeOrderItemsStatus($order->get_items(), $user_id, 'Converted as Order'); //Send order to the administrator if it wasn't sent before sendEmailOrderToAdmin($order_id); //Send ordere email to the customer $user_data = get_user_by('id', $user_id); order_email($order, $user_data); } function prepareOrderData($order, $user_id) { global $WOOCS; $order_data = $order->get_data(); $ccRate = getOrderCurrencyRate($order->get_id()); $countries_list = (new WC_Countries())->__get('countries'); $data_send = [ 'order_id' => $order->get_id(), 'shipping' => $order_data['shipping'], 'billing' => $order_data['billing'], 'order_payment_method_title' => $order_data['payment_method_title'], 'customer_id' => $user_id, //Phodu eto im ne nujno, jdu otvet 'invoice_link' => getInvoiceLink($order->get_id()), 'item' => [], ]; $data_send['billing']['email'] = clearUserEmail($data_send['billing']['email']); $data_send['billing']['country_code'] = $order_data['billing']['country']; $data_send['shipping']['country_code'] = $order_data['shipping']['country']; $data_send['billing']['country'] = $countries_list[$order_data['billing']['country']]; $data_send['shipping']['country'] = $countries_list[$order_data['shipping']['country']]; $data_send['shipping_cost'] = $WOOCS->back_convert($order->get_shipping_total(), $ccRate, 2); $data_send['shipping_cost'] = ceil($data_send['shipping_cost']); $user_meta = (object)getPostMeta($user_id, 'user'); $phone = getUserPhoneNumber($user_meta); $data_send['billing']['phone_code'] = $data_send['shipping']['phone_code'] = $phone->code; $data_send['billing']['phone_number'] = $data_send['shipping']['phone_number'] = $phone->number; $data_send['billing']['zip_code'] = $data_send['billing']['postcode']; $data_send['shipping']['zip_code'] = $data_send['shipping']['postcode']; $data_send['billing']['address1'] = $data_send['billing']['address_1']; $data_send['billing']['address2'] = $data_send['billing']['address_2']; $data_send['shipping']['address1'] = $data_send['shipping']['address_1']; $data_send['shipping']['address2'] = $data_send['shipping']['address_2']; unset($data_send['billing']['address_1']); unset($data_send['billing']['address_2']); unset($data_send['shipping']['address_1']); unset($data_send['shipping']['address_2']); unset($data_send['billing']['postcode']); unset($data_send['shipping']['postcode']); unset($data_send['billing']['phone']); unset($data_send['shipping']['phone']); addProductsToOrder($order, $data_send, $ccRate); return $data_send; } function getOrderCurrencyRate(int $order_id) { global $WOOCS; $currentCur = get_post_meta($order_id, '_order_currency', true); $currencies = $WOOCS->get_currencies(); return $currencies[$currentCur]['rate']; } function addProductsToOrder($order, &$data_send, $ccRate) { global $WOOCS; $user_id = $order->get_user_id(); foreach ( $order->get_items() as $item ) { $product = $item->get_product(); $item_price = ceil($WOOCS->back_convert($item->get_total(), $ccRate, 2)); $delivery_period = getProductDelivery($product); if ($item->get_quantity() > 1) { applySameSMPProduct( $data_send['item'], $product, $item_price, $delivery_period, $item->get_quantity() ); } else { $isRequested = isRequestedProduct($user_id, $product->get_id()); $data_send['item'][] = [ 'id' => $product->get_id(), 'quantity' => 1, 'requested_product' => $isRequested, 'list_id' => App\Models\Product\SmpProducts::getListId($product->get_id()), 'delivery_period' => $delivery_period, 'total' => $item_price ]; /** * If product has size, remove this size from the main product */ excludeProductSize($product->get_id()); // TODO: rewrite this function } } } function isRequestedProduct(int $user_id, int $product_id) { $result = check_req_exists($user_id, $product_id); return (int)!empty($result); } /** * Closing access to the product that has been ordered if it was in stock and had the size * * @param [type] $product_id * @return void */ function excludeProductSize($product_id) { $smp_product = new \App\Models\Product\SmpProducts(); $product = $smp_product->where('id_post', $product_id)->first(); $item_size = optional($product)->item_size; if (empty($item_size) || !$product->in_stock) { return false; } return $smp_product->where('id_post', $product_id)->update([ 'visibility' => 0, 'available' => 0, ]); } function getMainERPProduct($product_id) { $args = array( 'fields' => 'ids', 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => ['publish'], 'meta_query' => [ [ 'key' => 'all_prices', 'compare' => 'EXISTS' ], [ 'key' => 'pim_id', 'value' => get_post_meta($product_id, 'pim_id', true), 'compare' => '=' ], ] ); $query = new WP_Query; $product = $query->query($args); return isset($product[0]) ? $product[0] : null; } function applySameSMPProduct(&$products, $parent_product, $item_price, $delivery_period, $limit = -1) { $item_size = $parent_product->get_meta('item_size'); $pim_id = $parent_product->get_meta('pim_id'); if (empty($item_size) || empty($pim_id)) { return false; } $count_products = count($products); $args = array( 'fields' => 'ids', 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => ['publish', 'draft'], 'exclude' => [$parent_product->get_id()], 'meta_query' => [ [ 'key' => 'item_size', 'value' => $item_size, 'compare' => '=' ], [ 'key' => 'pim_id', 'value' => $pim_id, 'compare' => '=' ], ] ); $query = new WP_Query; $items = $query->query($args); foreach ($items as $id_product) { if (!isMainSmpProduct($id_product)) { $products[] = [ 'id' => $id_product, 'name' => $parent_product->get_name(), 'quantity' => 1, 'listid' => (int)get_post_meta($id_product, 'list_id', true), 'delivery_period' => $delivery_period, 'total' => $item_price ]; disableProduct($id_product); } else { deletePostMeta($id_product, 'products_size', $item_size, $limit); } if ($count_products >= $limit) { break; } } $id_product = $parent_product->get_id(); if (count($products) < $limit) { $products[] = [ 'id' => $id_product, 'name' => $parent_product->get_name(), 'quantity' => 1, 'listid' => (int)get_post_meta($id_product, 'list_id', true), 'delivery_period' => $delivery_period, 'total' => $item_price ]; deletePostMeta($id_product, 'products_size', $item_size, 1); } } /** * Remove the product from the stock. * It necessary for preventing double ordering the same SMP product. * * @param integer $id_product * @return void */ function disableProduct(int $id_product) { wp_update_post([ 'ID' => $id_product, 'post_status' => 'trash' ]); } function deletePostMeta($id_product, $meta_key, $meta_value, $limit) { global $wpdb; $query = $wpdb->prepare( "DELETE FROM wp_postmeta WHERE post_id = $id_product AND meta_key='$meta_key' AND meta_value='$meta_value' LIMIT $limit"); $wpdb->query( $query ); } /** * Check if selected product is one who was declared like main smp product * * @param integer $id_product * @return boolean */ function isMainSmpProduct(int $id_product) { $meta = preparePostMeta($id_product); return ( !empty($meta->all_prices) && !empty($meta->min_price) && !empty($meta->max_price) ); } function closeRequestOffer($request_id) { $room_id = get_post_meta($request_id, 'room_id', true); $offer_id = get_post_meta($request_id, 'offer_id', true); $token = generateJWTToken(); if (!$room_id || !$offer_id) { return false; } $url = ERP_API_HOST . '/client/rooms/stocks/' . $room_id . '/messages/request/' . $request_id . '/offer/pay'; $data = [ 'offerId' => $offer_id ]; $restult = wp_remote_post($url, [ 'headers' => [ 'Content-Type' => 'application/json; charset=utf-8', 'Authorization' => "Bearer " . $token, ], 'body' => json_encode($data), 'method' => 'PUT', 'data_format' => 'body', ]); if ((int)$restult['response']['code'] !== 200) { error_log('Cannot close offer: ' . json_encode($restult['body'])); } else { error_log("The offer is closed($request_id)"); } } function closeOrderItemsStatus($order_items, int $user_id, string $request_status) { $product_service = new App\Services\Products\ProductsBuyingService(); foreach ( $order_items as $item ) { $product = $item->get_product(); $product_id = $product->get_id(); $request_id = check_req_exists($user_id, $product_id); if (!empty($request_id)) { update_post_meta($request_id, 'request_status', $request_status); //closeRequestOffer($request_id); } updateProductStatus($product_id, 'draft'); $product_service->closeProduct($product_id); } } function changeRequestStatus(int $order_id, int $user_id, string $request_status) { $order = wc_get_order( $order_id ); foreach ( $order->get_items() as $item ) { $product = $item->get_product(); $requested_product_data_id = check_req_exists($user_id, $product->get_id()); if ($requested_product_data_id) { update_post_meta($requested_product_data_id, 'request_status', $request_status); } } } function updateProductStatus(int $product_id, string $status = 'draft') { global $wpdb; $query = $wpdb->prepare("UPDATE wp_posts SET post_status = '%s' WHERE ID=%s", [ $status, $product_id ]); return $wpdb->query( $query ); } function sendEmailOrderToAdmin($order_id) { //Check if email has been sent before if (isNotificationSent($order_id)) { return false; } add_filter('woocommerce_new_order_email_allows_resend', '__return_true' ); WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id ); add_filter('woocommerce_new_order_email_allows_resend', '__return_false' ); } function isNotificationSent($order_id) { global $wpdb; $admin_email = get_field("admin_email", "theme_settings"); $get_values = $wpdb->get_results( "SELECT id FROM wp_mail_catcher_logs WHERE email_to LIKE '%$admin_email%' AND subject LIKE '%[Watches World]: New order #$order_id%' LIMIT 1"); return count($get_values); } function getProductDelivery($product) { $id_request = getRequestId(get_current_user_id(), $product->get_id()); $status = !$id_request ? (int)$product->get_meta('delivery_period') : (int)get_post_meta($id_request, 'delivery_period', true); switch ($status) { case 1: $status = 1; break; case 2: $status = 4; break; default: $status = 5; } return $status; } function getRequestId(int $id_user, int $id_product) { $args = array( 'post_type' => 'order_request', 'posts_per_page' => 1, 'meta_query' => [ [ 'key' => 'order_requested_user', 'value' => $id_user, 'compare' => '=' ], [ 'key' => 'requested_product', 'value' => $id_product, 'compare' => '=' ] ] ); $query = new WP_Query; $order = $query->query($args); return $order ? $order[0]->ID : false; } /** * Custom logging system. */ function saveLogInFile($content) { $path = WP_CONTENT_DIR . '/rest-api.log'; $file = fopen($path, 'a'); fprintf($file, "%s: %s\n", date('Y-m-d H:i:s'), $content); fclose($file); } add_action( 'woocommerce_update_product', 'addProductInRedis', 10, 1 ); add_action('woocommerce_new_product', 'addProductInRedis', 10, 1); function addProductInRedis( $product_id ) { // return true; // REMOVED: was blocking ERP price sync if ( get_post_type( $product_id ) !== 'product') { error_log("Not a product:" . $product_id ); return false; } if ((int)get_field("run_redis_products", "theme_settings")) { /* if (isset($_GET['post_updating'])) { return false; }*/ $redis = new \App\Services\RedisService(); error_log('Send the product in redis:' . $product_id); $redis->send($redis::PRODUCTS_QUEUE, $product_id); } else { $pim_id = get_post_meta( $product_id, 'pim_id', true); if (!empty($pim_id) && !isset($_GET['pim_edit'])) { error_log("Start to update ERP product: $product_id, $pim_id"); updateSMPProduct($product_id, $pim_id); } else { updateReferenceCategory($product_id); $_GET['pim_edit'] = 1; updateBulkSMPProductsByPIM($product_id); } replaceTrashedLinks(); } return true; } add_action('wp_ajax_create_redis_q', 'createRedisQueue'); add_action('wp_ajax_nopriv_create_redis_q', 'createRedisQueue'); function createRedisQueue() { if (empty($_REQUEST['queue'])) { return false; } $redis = new \App\Services\RedisService(); $result = $redis->createQueue($_REQUEST['queue']); dd($result); return true; } //Take products' images from REDIS and attach them to the product add_action( 'download_products_images', 'downloadProductsImages' ); add_action('wp_ajax_download_products_images', 'downloadProductsImages'); add_action('wp_ajax_nopriv_download_products_images', 'downloadProductsImages'); function downloadProductsImages() { (new \App\Services\ProductImagesService())->run(); } //add_action( 'finish_update_products', 'finishUpdatingProducts' ); //add_action('wp_ajax_finish_update_products', 'finishUpdatingProducts'); //add_action('wp_ajax_nopriv_finish_update_products', 'finishUpdatingProducts'); function finishUpdatingProducts() { //(new \App\Services\ProductsManagementService())->run(); } function mp_sync_on_product_save( $postID ) { error_log('Start to update ERP product: ' . $postID); if (isManualAddedProduct($postID)) { completeManualAddedProduct($postID); return true; } $pim_id = get_post_meta($postID, 'pim_id', true); if (!empty($pim_id) && !isset($_GET['pim_edit'])) { updateSMPProduct($postID, $pim_id); } else { updateReferenceCategory($postID); $_GET['pim_edit'] = 1; updateBulkSMPProductsByPIM($postID); } replaceTrashedLinks(); error_log('Finish updating:' . $postID); } // rest init action hook log on init //add_action( 'rest_api_init', 'restinithook', 99, 1 ); function restinithook($wp_rest_server) { $entityBody = file_get_contents('php://input'); saveLogInFile('Rest init: ' . json_encode($entityBody)); } function sendImagesInRedis($images, $pim_id) { $redis = new \App\Services\RedisService(); foreach ($images as $index => $image) { error_log('Send image(' . $pim_id . '):' . $image->src); $redis->send( $redis::PRODUCTS_IMAGES_QUEUE, json_encode([ 'pim_id' => $pim_id, 'image_url' => $image->src, 'position' => $index ]) ); } } function getPimId($data) { foreach ($data as $meta_item) { if ($meta_item->key === 'pim_id') { return (int)$meta_item->value; } } return null; } add_filter( 'wp_insert_post_data' , 'filter_post_data' , 99, 2 ); function filter_post_data( $data , $postarr ) { //error_log('Pre save the product: ' . json_encode($data)); return $data; } /** * Update the category that is related with reference */ function updateReferenceCategory($id_post) { $reference = get_post_meta($id_post, 'org_reference', true); if (!empty($reference)) { update_post_meta($id_post, '_sku', $reference); } else { $reference = get_post_meta($id_post, '_sku', true); } if (empty($reference)) { $reference = get_post_meta($id_post, 'reference', true); update_post_meta($id_post, '_sku', $reference); //TO DO: remove this section whe issue will be fixed on PIM system $pim_id = get_post_meta($id_post, 'PIM ID', true); update_post_meta($id_post, '_saleslayerid', $pim_id); } $categories = getProductCategories($id_post); if (!isset($categories['reference'])) { return false; } //Do not rename the category if reference is same if ($reference === $categories['reference']->name) { return false; } wp_update_term( $categories['reference']->term_id, 'product_cat', [ 'name' => $reference, 'slug' => sanitize_title($reference) ]); } /** * Copy all attributes from PIM product and add them on SMP product */ function updateBulkSMPProductsByPIM($id_product) { global $wpdb; $pim_product = wc_get_product($id_product); $pim_permalink = sanitize_title($pim_product->get_name()); updatePostSlug($wpdb, $id_product, $pim_permalink . '-' . $id_product); $pim_id = $pim_product->get_meta('_saleslayerid'); if (empty($pim_id)) { return false; } //Collect all related posts $tbl = $wpdb->prefix . 'postmeta'; $products_list = getSMPProductsByPIM($wpdb, $tbl, $pim_id); $key_attributes = getPIMAttributes(); $pim_terms = wp_get_post_terms($id_product, 'product_cat', [ 'fields' => 'ids' ]); $id_main_product = null; $product_sizes = []; foreach ($products_list as $id_smp_product) { updatePostSlug($wpdb, $id_smp_product, $pim_permalink . '-' . $id_smp_product); //Hide SWATCH products if (in_array(SWATCH_CATEGORY, $pim_terms)) { update_post_meta($id_smp_product, 'visibility', 0); } $status = updateSPMProductAttributes($id_smp_product, $pim_product, $key_attributes); $item_size = get_post_meta($id_smp_product, 'item_size', true); if ($status !== 'draft' && $item_size !== '') { $product_sizes[] = $item_size; } //Update data on elastic if product is main if ( get_post_meta($id_smp_product, 'all_prices', true) !== '' && $status !== 'draft' && (int)get_post_meta($id_smp_product, 'visibility', true) == 1 && (int)get_post_meta($id_smp_product, 'is_delete', true) === 0 ) { $id_main_product = $id_smp_product; addProductInElastic((object)[ 'ID' => $id_smp_product, 'price' => get_post_meta($id_smp_product, '_price', true), 'price_on_request' => get_post_meta($id_smp_product, 'price_on_request', true), 'name' => $pim_product->get_name(), 'reference' => get_post_meta($id_smp_product, 'pim_reference', true), 'list_id' => get_post_meta($id_smp_product, 'list_id', true), 'nickname' => get_post_meta($id_smp_product, 'Nickname', true) ]); } else { deleteProductFromElastic($id_smp_product); } //Update categories wp_set_object_terms($id_smp_product, $pim_terms, 'product_cat'); } if ( count($product_sizes)) { attachAllSizes($id_main_product, $product_sizes ); } } function attachAllSizes($id_main_product, $product_sizes ) { delete_post_meta($id_main_product, 'product_sizes'); foreach ($product_sizes as $size) { add_post_meta($id_main_product, 'product_sizes', $size); } } function updatePostSlug($wpdb, $id_post, $slug) { $wpdb->query("UPDATE wp_posts SET post_name='$slug' WHERE ID = $id_post"); } function getSMPProductsByPIM($wpdb, $tbl, $pim_id) { $prepare_query = $wpdb->prepare( "SELECT post_id FROM $tbl FORCE INDEX(meta_key) where meta_key ='pim_id' and meta_value = '%s'", $pim_id); return $wpdb->get_col( $prepare_query ); } function deleteSMPOldAttributes($wpdb, $tbl, $id_smp_product, $key_attributes) { $query = $wpdb->prepare( "DELETE FROM $tbl WHERE post_id = $id_smp_product AND meta_key IN (" . implode(', ', array_fill(0, count($key_attributes), "'%s'")) . ")", $key_attributes ); $wpdb->query( $query ); } function updateSPMProductAttributes($id_smp_product, $pim_product, $key_attributes) { global $wpdb; $smp_product = wc_get_product($id_smp_product); $home_hide = get_post_meta($id_smp_product, 'home_hide', true); if (empty($home_hide)) { update_post_meta($id_smp_product, 'home_hide', 0); } update_post_meta($id_smp_product, 'pim_reference', $pim_product->get_sku()); update_post_meta($id_smp_product, 'show_list', 1); $key_attributes = array_merge($key_attributes, [ 'gender', 'Nickname' ]); foreach ($key_attributes as $name_attribute) { update_post_meta($id_smp_product, $name_attribute, $pim_product->get_meta($name_attribute)); } $status = isProductAvailable($smp_product) ? 'publish' : 'draft'; saveLogInFile("Update product($id_smp_product): $status"); $query = $wpdb->prepare("UPDATE wp_posts SET post_status = '%s', post_title='%s' WHERE ID=%s", [ $status, $pim_product->get_name(), $id_smp_product ]); $wpdb->query( $query ); return $status; } // used in ProductTranslationService class. function getPIMAttributes() { return [ 'bracelet_color', 'case_material', 'limited_edition', 'bracelet_material', 'case_diameter', 'bezel_material', 'dial_numerals', 'movement', // 'caliber', 'power_reserve', 'water_resistance', 'functions', 'glass', 'clasp_material', 'clasp_type', 'dial', 'Nickname', 'collection', 'set', 'occasion', 'style', 'metal', 'stones', 'carats', 'jewelleryType', // bags 'brand', 'model', // 'price', 'condition', 'color', 'material', 'hardware' ]; } function updateSMPProduct($postID, $pim_id) { global $wpdb; $id_parent_product = getParentProductId((int)$pim_id); if (!$id_parent_product) { error_log("The PIM $pim_id is not exists."); return false; } //Update product categories $term_list = wp_get_post_terms($id_parent_product, 'product_cat', [ 'fields' => 'ids' ]); //Hide SWATCH products if (in_array(SWATCH_CATEGORY, $term_list)) { update_post_meta($postID, 'visibility', 0); } wp_set_object_terms( $postID, $term_list, 'product_cat' ); wp_set_object_terms( $postID, $pim_id, 'product_taxonomy' ); $pim_product = wc_get_product($id_parent_product); //Update product attributes that included in parent product(PIM) updateSPMProductAttributes($postID, $pim_product, getPIMAttributes()); //TODO: make refactoring of this function. It still an old version. taxonomy_management($postID, $pim_id, $pim_product); syncCustomProductTables($postID, $id_parent_product); $permalink = get_post_field( 'post_name', $postID ); if (strpos($permalink, 'product-') !== false) { $pim_permalink = sanitize_title($pim_product->get_name()); updatePostSlug($wpdb, $postID, $pim_permalink . '-' . $postID); } } function getParentProductId(int $pim_id) { global $wpdb; $table = $wpdb->prefix . 'postmeta'; $query = $wpdb->prepare( "SELECT post_id FROM $table FORCE INDEX(meta_key) WHERE meta_key='_saleslayerid' AND meta_value='$pim_id' ORDER by post_id LIMIT 1"); $get_values = $wpdb->get_col( $query ); return isset($get_values[0]) ? $get_values[0] : null; } function getProductByPIMId(int $pim_id) { $product_id = getParentProductId($pim_id); return wc_get_product($product_id); } function isERPProductAvailable($product_id) { return ( (int)get_post_meta($product_id, 'is_delete', true) && (int)get_post_meta($product_id, 'visibility', true) === 1 ); } function taxonomy_management($id_product, $pim_id, $pim_product) { $args = array( 'posts_per_page' => -1, 'post_status' => ['publish', 'draft'], 'post_type' => 'product', 'orderby' => 'ID', 'order' => 'DESC', 'meta_query' => [ [ 'key' => 'pim_id', 'compare' => '=', 'value' => $pim_id, ] ] ); $query = new WP_Query; $posts_array = $query->query($args); $taxarrays = json_decode(json_encode($posts_array), true); saveLogInFile("Taxarrays" . json_encode($taxarrays) ); if (!count($taxarrays)) { error_log("PIM(" . $pim_id . ")No child products"); return false; } $product_prices = $product_sizes = []; $last_product = $stock_product = $requestable_product = $product_without_price = null; $requestable_min_price = $stockable_min_price = 0; foreach ($taxarrays as $taxarray) { $productid = $taxarray['ID']; $product = wc_get_product( $productid ); $deleted = (int)$product->get_meta('is_delete'); $visibility = (int)$product->get_meta('visibility'); $price_on_request = (int)$product->get_meta('price_on_request'); delete_post_meta($productid, 'min_price'); delete_post_meta($productid, 'max_price'); delete_post_meta($productid, 'all_prices'); deleteProductFromElastic($productid); wp_remove_object_terms($productid, 'enable-search', 'product_tag'); $last_product = $product; if ($deleted === 0 && $visibility === 1) { /** * Detecting the stockable & non stockable products for making one of them with priority */ if((int)$product->get_meta('in_stock') === 1) { if (!$stockable_min_price || ($product->get_price() < $stockable_min_price) ) { $stock_product = $product; $stockable_min_price = $product->get_price(); } } else if($price_on_request === 0) { if (!$requestable_min_price || ($product->get_price() < $requestable_min_price) ) { $requestable_product = $product; $requestable_min_price = $product->get_price(); } } if ($price_on_request === 0) { $product_prices[] = $product->get_price(); } else { $product_without_price = $product; } wp_set_post_terms($productid, 'enable-search', 'product_tag', true); $item_size = get_post_meta($productid, 'item_size', true); if ($item_size !== '') { $product_sizes[] = $item_size; } } } $product_prices = array_unique($product_prices); if (!count($product_prices)) { $product_prices = [0]; } $first_product = null; if (!empty($stock_product)) { $first_product = $stock_product; } else if (!empty($requestable_product)) { $first_product = $requestable_product; } else if(!empty($product_without_price)) { $first_product = $product_without_price; } else { $first_product = $last_product; } if (empty($first_product)) { return false; } $id_first_product = $first_product->get_id(); saveLogInFile("All prices: $id_first_product - (" . count($taxarrays) . ")" . json_encode($product_prices) ); if (count($product_prices)) { $min_price = min($product_prices); $max_price = max($product_prices); } else { $max_price = $min_price = $first_product->get_price(); } update_post_meta($id_first_product, 'min_price', $min_price); update_post_meta($id_first_product, 'max_price', $max_price); update_post_meta($id_first_product, 'all_prices', $min_price); updateProductStatus($id_first_product, 'publish'); if (isAvailableProduct($id_first_product)) { if (count($product_sizes)) { attachAllSizes($id_first_product, $product_sizes); } saveLogInFile("Add product in elastic: $id_first_product"); addProductInElastic((object)[ 'ID' => $id_first_product, 'price' => $first_product->get_price(), 'price_on_request' => (int)$first_product->get_meta('price_on_request'), 'name' => $pim_product->get_name(), 'reference' => $first_product->get_meta('pim_reference'), 'list_id' => $first_product->get_meta('list_id'), 'nickname' => $first_product->get_meta('Nickname') ]); if (!isProductWasAvailable($pim_product->get_ID())) { createProductNotifications($id_first_product, $pim_product->get_ID()); } } } function isProductWasAvailable($product_id) { return (int)get_post_meta($product_id, 'was_available', true); } /** * Delete pim product and related SMP products */ add_action('woocommerce_trash_product','deletePimProduct', 10, 1 ); function deletePimProduct($id_product) { $pim_id = get_post_meta($id_product ,'_saleslayerid', true); //Check if the product is PIM product if ( get_post_type($id_product) !== 'product' || empty($pim_id)) { wp_send_json([ 'status' => 'error', 'message' => "You can't delete this product." ]); die(); } global $wpdb; $tbl = $wpdb->prefix . 'postmeta'; $products_list = getSMPProductsByPIM($wpdb, $tbl, $pim_id); if (count($products_list)) { foreach ($products_list as $id_smp_product) { update_post_meta($id_smp_product, 'is_delete', 1); deleteProductFromElastic($id_smp_product); } } /** * Remove PIM product from trash and add it on draft */ $query = $wpdb->prepare("UPDATE wp_posts SET post_status = '%s' WHERE ID=%s", ['draft', $id_product]); $wpdb->query( $query ); wp_send_json([ 'status' => 'success', 'pim_id' => $pim_id, 'message' => 'The product has been deleted!' ]); die(); } add_action('user_register', 'post_user_reg_redirect', 10, 1); function post_user_reg_redirect( $userId ) { $user_meta = (object)getPostMeta($userId, 'user'); // create user object $user = get_userdata($userId); $phone = getUserPhoneNumber($user_meta); $countries_obj = new WC_Countries(); $countries = $countries_obj->__get('countries'); if (isset($_POST['billing_phone_code'])) { update_user_meta($userId, 'billing_phone_code', $phone->code); } if (isset($_POST['billing_country'])) { $user_meta->billing_country = $_POST['billing_country']; } $post_data = [ 'woo_customer_id' => $userId, 'email' => clearUserEmail($user->user_email), 'first_name' => prepareUserName($userId, $user_meta->first_name, 'billing_first_name'), 'last_name' => prepareUserName($userId, $user_meta->last_name, 'billing_last_name'), 'phone_code' => $phone->code, 'phone_number' => preparePhoneNumber($phone->number), 'address1' => $user_meta->billing_address_1 ?? '', 'address2' => $user_meta->billing_address_2 ?? '', 'zip_code' => $user_meta->billing_postcode ?? '', 'city' => $user_meta->billing_city ?? '', // 'country' => ( isset( $user_meta->billing_country ) && isset( $countries[$user_meta->billing_country] ) ) // ? $countries[$user_meta->billing_country] : '', 'country' => $user_meta->billing_country ?? '', 'created_on' => $user->user_registered, 'country_code' => $user_meta->billing_country ?? '', 'locale' => \App\Services\TranslationService::getLang() ]; if ($post_data['first_name'] !== '') { saveLogInFile('Create/Update user:' . json_encode($post_data)); // Send the user to the erp if (isProduction()) { $erp = new \App\Services\ErpService('SYNC.CLIENT'); $erp->sendMessage('insert_customer_details', $post_data); saveLogInFile("Insert new user request details:" . json_encode($post_data)); } } // sendUserToERPTrueEndpoint( true, $post_data ); subscribeUnscribeToMailchimp($userId); } function subscribeUnscribeToMailchimp($userId) { if ( isset($_REQUEST['mailchimp_woocommerce_newsletter']) && (int)$_REQUEST['mailchimp_woocommerce_newsletter'] ) { update_user_meta($userId, 'email_subscribe', 1); changeSubscriberStatus('subscribed'); } else { delete_user_meta($userId, 'email_subscribe'); changeSubscriberStatus(); } } /** * Remove country code duplications */ function preparePhoneNumber($phone) { while (substr_count($phone, '+') > 1) { $country_code = substr($phone, 0, strpos($phone, '+', 1)); $phone = str_replace($country_code.$country_code, $country_code, $phone); } return $phone; } /** * Work with PIM helper functions */ function get_pim_product_title($id) { if (!isset($id)) { return ''; } return get_the_title(get_pim_product_id($id)); } function get_pim_product_id($post_id) { if (!isset($post_id)) { return ''; } $pim_id = get_post_meta($post_id, 'pim_reference', true); if (isset($pim_id)) { global $wpdb; $tbl = $wpdb->prefix.'postmeta'; $prepare_query = $wpdb->prepare( "SELECT post_id FROM $tbl FORCE INDEX(meta_key) where meta_key ='_sku' and meta_value = '%s'", $pim_id ); $get_values = $wpdb->get_col( $prepare_query ); return isset($get_values[0]) ? $get_values[0] : null; } return $post_id; } function prepareUserName($user_id, $first_name, $key) { if (empty($first_name) && isset($_POST[$key])) { $first_name = $_POST[$key]; update_user_meta($user_id, str_replace('account_', 'billing_', $key), $first_name); } return $first_name; } function getUserPhoneNumber(object $user) { $phone_code = !empty($_REQUEST['billing_phone_code']) ? $_REQUEST['billing_phone_code'] : $user->billing_phone_code; return (object)[ 'code' => $phone_code, 'number' => !empty($user->billing_phone) ? $user->billing_phone : $_REQUEST['billing_phone'], ]; } function check_product($postID) { if ( get_post_type( $postID ) == 'product' ) { if(get_post_meta($postID,'list_id',true)!='' && get_post_meta($postID,'pim_id',true)!='') { $deleted = get_post_meta($postID,'is_delete',true); $status = get_post_meta($postID,'status',true); $visibility = get_post_meta($postID,'visibility',true); if( ($visibility == 1) && ($deleted == 0 ) && ( $status == 1 || $status == 3)) { return true; } else { return false; } } } return false; } add_action('wp', 'call_ws_for_as400'); function call_ws_for_as400() { if (is_checkout()) { global $woocommerce; global $wpdb; $user_id = get_current_user_id(); $customer_requests = $wpdb->get_results("SELECT * FROM `wp_posts` WHERE `post_author` = $user_id AND `post_type` = 'order_request' ORDER BY `wp_posts`.`post_date` DESC "); $request_approved_products = array(); foreach ($customer_requests as $key => $customer_request) { if(get_field("requested_product",$customer_request->ID)) { $requested_product_id = get_field("requested_product",$customer_request->ID); $request_status = get_field("request_status",$customer_request->ID); if($request_status == "Confirmed") { array_push($request_approved_products,$requested_product_id); } } } $items = $woocommerce->cart->get_cart(); $remove = array(); foreach($items as $item => $values) { if(!in_array($values['data']->get_id(), $request_approved_products)) if( get_post_meta($values['product_id'],'pim_id',true)!='') { if(get_post_meta($values['product_id'],'pim_id',true)!='') { if(check_product($values['product_id']) != true) { $remove[] = $values['product_id']; } } else { $remove[] = $values['product_id']; } } } if(count($remove)!=0) { foreach($remove as $item) { $product_id = $item; $product_cart_id = WC()->cart->generate_cart_id( $product_id ); $cart_item_key = WC()->cart->find_product_in_cart( $product_cart_id ); if ( $cart_item_key ) WC()->cart->remove_cart_item( $cart_item_key ); } } } } // add_action( 'woocommerce_before_checkout_form', 'check_product_before_checkout', 10, 0 ); add_action('after_setup_theme', 'remove_admin_bar'); function remove_admin_bar() { global $show_admin_bar; $show_admin_bar = false; } add_action('admin_init', 'disable_dashboard'); function disable_dashboard() { if (!is_user_logged_in()) { return null; } } function check_cats_in_cart( $product_id ) { $has_term = true; foreach( WC()->cart->get_cart() as $item ){ if ( $item['product_id'] == $product_id ) $has_term = false; if( !$has_term ) break; } return $has_term; } add_filter( 'woocommerce_add_to_cart_validation', 'sold_individually_by_cats_valid', 10, 3 ); function sold_individually_by_cats_valid( $passed, $product_id, $quantity) { $passed = check_cats_in_cart( $product_id ); if ( !$passed ) { $message = __t("This product is already in cart. Try another product"); wc_add_notice( $message, 'error' ); } return $passed; } /** * Add to cart validation. * This filter is checking if product have valid price. * If the price is ZERO - system will check if it's requested product. */ add_filter( 'woocommerce_is_purchasable', 'wpa_109409_is_purchasable', 10, 2 ); function wpa_109409_is_purchasable( $purchasable, $product ) { if ( !$product->get_price() ) { $request_data = getOrderRequest( $product->get_ID(), get_current_user_id() ); if ($request_data['request_status'][0] !== 'Confirmed' || !(int)$request_data['offer_price'][0] ) { $purchasable = false; } } return $purchasable; } add_filter( 'woocommerce_gateway_icon', 'setPaymentIcon', 10, 2); function setPaymenticon($icon, $type_payment) { $icons = getGatewaysIcons($type_payment); if (count($icons)) { $icon = ''; foreach ($icons as $icon_name) { $icon .= ""; } } return $icon; } function getGatewaysIcons($type_payment) { $icons = []; switch ($type_payment) { case 'wc_checkout_com_cards': $icons = ['visa', 'mastercard', 'amex']; break; case 'utrust_gateway': $icons = ['bitcoin']; break; case 'bacs': $icons = ['wire']; break; case 'paypal': $icons = ['paypal']; break; } return $icons; } // custom order text, custom order btn text, todo: was //add_filter( 'woocommerce_order_button_text', 'woo_custom_order_button_text' ); //function woo_custom_order_button_text() { // return __t( 'Confirm payment'); //} function get_gallery_images($product_id) { $product = new WC_product($product_id); if (!$product) { return [ wc_placeholder_img_src() ]; } $attachment_ids = $product->get_gallery_image_ids(); $image_url = []; foreach( $attachment_ids as $attachment_id ) { $image = wp_get_attachment_metadata( $attachment_id ); $image_src = getImageStorage() . $image['file']; $webp_img = getWebPImage( $image['file']); if ($webp_img) { $image_src = $webp_img; } if (!in_array($image_src, $image_url)) { $image_url[] = $image_src; } } $thumbnail = wp_get_attachment_metadata(get_post_thumbnail_id($product_id)); $thumb_url = getImageStorage() . $thumbnail['file']; if ($thumbnail && !in_array($thumb_url, $image_url)) { $webp_img = getWebPImage( $thumbnail['file'] ); if ($webp_img) { $thumb_url = $webp_img; } $image_url = array_merge([$thumb_url], $image_url); } if (!count($image_url)) { $image_url = [ wc_placeholder_img_src() ]; } return $image_url; } function get_cat_product_count($term_id) { if(!isset($term_id)) return '0'; $args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $term_id, 'operator' => 'IN' ) ), 'meta_query' => array( 'query_one' => array( 'key' => 'custom_order', ), 'query_two' => array( 'key' => 'visibility', 'value' => '1', 'compare' => '=' ), ) ); $products = new WP_Query($args); return $products->post_count; } function all_product_managment() { $args = array( 'posts_per_page' => -1, 'post_type' => 'product', 'post_status' => 'any', 'meta_query' => array( 'relation' => 'AND', array( 'key' => '_saleslayerid', 'compare' => 'EXISTS', ), ), ); $query = new WP_Query; $posts = $query->query($args); $result = []; foreach ($posts as $pim) { update_post_meta($pim->ID, '_price', 0); $result[] = array($pim->ID, 0); } return $result; } add_action("wp_ajax_check_quantity", "check_quantity"); add_action("wp_ajax_nopriv_check_quantity", "check_quantity"); function check_quantity() { $list_id = get_post_meta($_POST['product_id'],'list_id',true); if ($list_id!='') { $quantity = quantity_curl($list_id); die($quantity); } else { die(false); } } function quantity_curl($list_id=0) { if ($list_id==0) { return('false'); } $result = wp_remote_post( get_field("smp_quantity_check_url", "theme_settings"), array( 'method' => 'POST', 'timeout' => 45, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'body' => ['list_id' => $list_id ], 'headers' => array('Content-Type' => 'application/x-www-form-urlencoded'), ) ); //return ('true'); $data = json_decode($result['body']); if($data->success=='true') { if($data->data->quantity!=0) { return('true'); } return('false'); } return('false'); } function update_names() { $users = get_users(); $list = array(); $i = 0; foreach($users as $user) { $first_name = get_user_meta($user->ID,'first_name',true); if($first_name!='') { $n_array = explode(' ', $first_name, 2); $list[$i]['first_name'] = $n_array[0]; $list[$i]['last_name'] = $n_array[1]; } $billing_first_name = get_user_meta($user->ID,'billing_first_name',true); if($billing_first_name!='') { $b_array = explode(' ', $billing_first_name, 2); $list[$i]['billing_first_name'] = $b_array[0]; $list[$i]['billing_last_name'] = $b_array[1]; } else { if($first_name!='') { $n_array = explode(' ', $first_name, 2); $list[$i]['billing_first_name'] = $n_array[0]; $list[$i]['billing_last_name'] = $n_array[1]; } } $shipping_first_name = get_user_meta($user->ID,'shipping_first_name',true); if($shipping_first_name!='') { $s_array = explode(' ', $shipping_first_name, 2); $list[$i]['shipping_first_name'] = $s_array[0]; $list[$i]['shipping_last_name'] = $s_array[1]; } $i++; } return $list; } function getMainSMPUrl($pim_id) { $args = array( 'fields' => 'ids', 'post_type' => 'product', 'posts_per_page' => 1, 'post_status' => ['publish', 'draft'], 'meta_query' => [ [ 'key' => 'pim_id', 'value' => $pim_id, 'compare' => '=' ], [ 'key' => 'all_prices', 'compare' => 'EXISTS' ] ] ); $query = new WP_Query; $posts = $query->query($args); return count($posts) ? getSMPProductUrlById((int)$posts[0]) : null; } /** * Return the product url not depending on post status. The link will be generated using post_name * * @param [type] $id_product * @return string */ function getSMPProductUrlById(int $id_product): string { global $wpdb; $products = $wpdb->get_results("SELECT * FROM wp_posts WHERE ID=$id_product LIMIT 1 "); if (!isset($products[0])) { return ''; } $url = site_url() . '/shop/' . $products[0]->post_name . '/'; return _langUrl($url); } add_action( 'woocommerce_email_order_details', 'actionEmailOrderMeta', 1, 4 ); // Remove item shipping cost attribute from order function actionEmailOrderMeta( $order, $sent_to_admin, $plain_text, $email ) { foreach ( $order->get_items() as &$product ) { $product->delete_meta_data('shipping_cost'); } }; https://watchesworld.com/post-sitemap.xml 2025-11-06T08:23:25+00:00 https://watchesworld.com/page-sitemap.xml 2024-10-11T16:00:46+00:00 https://watchesworld.com/product-sitemap.xml 2026-03-17T16:16:20+00:00 https://watchesworld.com/product-sitemap2.xml 2021-01-06T17:58:51+00:00 https://watchesworld.com/product-sitemap3.xml 2021-11-11T18:42:36+00:00 https://watchesworld.com/product-sitemap4.xml 2022-05-08T15:18:59+00:00 https://watchesworld.com/product-sitemap5.xml 2022-05-17T08:56:04+00:00 https://watchesworld.com/product-sitemap6.xml 2022-05-18T12:31:59+00:00 https://watchesworld.com/product-sitemap7.xml 2022-10-09T20:01:16+00:00 https://watchesworld.com/product-sitemap8.xml 2023-01-25T22:46:18+00:00 https://watchesworld.com/product-sitemap9.xml 2023-01-25T23:31:27+00:00 https://watchesworld.com/product-sitemap10.xml 2023-02-15T17:53:26+00:00 https://watchesworld.com/product-sitemap11.xml 2023-02-19T06:36:40+00:00 https://watchesworld.com/product-sitemap12.xml 2023-02-24T19:55:59+00:00 https://watchesworld.com/product-sitemap13.xml 2023-05-04T08:41:25+00:00 https://watchesworld.com/product-sitemap14.xml 2023-06-16T08:01:04+00:00 https://watchesworld.com/product-sitemap15.xml 2023-08-11T15:10:52+00:00 https://watchesworld.com/product-sitemap16.xml 2023-11-21T11:40:28+00:00 https://watchesworld.com/product-sitemap17.xml 2024-03-04T09:32:15+00:00 https://watchesworld.com/product-sitemap18.xml 2024-04-30T06:54:59+00:00 https://watchesworld.com/product-sitemap19.xml 2024-07-12T10:49:43+00:00 https://watchesworld.com/product-sitemap20.xml 2024-10-25T14:56:42+00:00 https://watchesworld.com/product-sitemap21.xml 2024-12-19T12:56:24+00:00 https://watchesworld.com/product-sitemap22.xml 2025-01-02T11:07:15+00:00 https://watchesworld.com/product-sitemap23.xml 2025-01-03T11:22:03+00:00 https://watchesworld.com/product-sitemap24.xml 2025-01-04T14:29:59+00:00 https://watchesworld.com/product-sitemap25.xml 2025-01-10T21:51:08+00:00 https://watchesworld.com/product-sitemap26.xml 2025-01-16T18:47:14+00:00 https://watchesworld.com/product-sitemap27.xml 2025-03-18T08:43:04+00:00 https://watchesworld.com/product-sitemap28.xml 2025-05-02T11:59:13+00:00 https://watchesworld.com/product-sitemap29.xml 2025-06-19T09:51:36+00:00 https://watchesworld.com/product-sitemap30.xml 2025-08-12T09:07:45+00:00 https://watchesworld.com/product-sitemap31.xml 2026-03-17T16:16:20+00:00 https://watchesworld.com/product_cat-sitemap.xml 2026-03-17T16:16:20+00:00 https://watchesworld.com/product_cat-sitemap2.xml 2025-10-29T02:59:03+00:00 https://watchesworld.com/author-sitemap.xml 2025-05-01T09:53:09+00:00