Я создал плагин WooCommerce, который, помимо прочего, позволяет покупателю заказать образец продукта, который он просматривает в данный момент. Иногда эта функция работает, иногда нет. Я вижу, как данные поступают в файл function.php, но не могу понять, почему некоторые продукты добавляют образец в корзину, а другие — нет. Прежде чем я поделюсь соответствующим кодом, имейте в виду, что образец — это реальный продукт в области администрирования WooCommerce. Артикул образца основан на артикуле продукта.
add_action('wp_ajax_order_sample', 'order_sample');
add_action('wp_ajax_nopriv_order_sample', 'order_sample');
function order_sample() {
$cart_item_key = null;
if ((isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'nonce_custom_atc'))
&& (isset($_POST['product_id']) && $_POST['product_id'] > 0)
&& (isset($_POST['quantity']) && $_POST['quantity'] > 0)
&& (isset($_POST['cost']) && $_POST['cost'] > 0)) {
$cart_item_key = wc()->cart->add_to_cart(
intval($_POST['product_id']),
intval($_POST['quantity']),
0,
array(),
array(
'cost'=>isset($_POST['cost']) ? floatval($_POST['cost']) : '',
'thumbnail_url'=>isset($_POST['thumbnail_url']) ? esc_attr($_POST['thumbnail_url']) : '',
'sku'=>isset($_POST['product_sku']) ? sanitize_text_field($_POST['product_sku']) : '', // we do this to specifically set the sku on the order to the sample sku and NOT the product sku
)
);
}
write_log(create_message('sku: ' . $_POST['sku'])); // lets us confirm that the info came through from the AJAX call
wp_die(isset($cart_item_key) && $cart_item_key ? "Added to cart!" : "Error: not added!");
}
function write_log($message) {
$logger = wc_get_logger();
$logger->debug($message, array('source' => 'visualizer'));
}
function create_message($item) {
return boolval(!empty($item)) ? print_r($item, true) : 'nothing to see here!';
}
global $product;
$id = trim($product->get_id());
$sku = trim($product->get_sku());
$sample_sku = "";
$product_sku = "";
if (str_starts_with($sku, "S-")) {
$sample_sku = $sku;
$product_sku = str_replace("S-", "", $sku);
} else {
$product_sku = $sku;
$sample_sku = "S-" . $sku;
}
// this lets us make sure that we get the sample sku and the product sku into the right places
$sample_id = trim($GLOBALS['wpdb']->get_results("SELECT `product_id` FROM `wp_wc_product_meta_lookup` WHERE `sku` = '" . $sample_sku . "'")[0]->product_id);
Я также проверил и перепроверил образцы продуктов в области администрирования WooCommerce и не вижу никакой разницы в том, как настроены нерабочие образцы по сравнению с рабочими образцами. Заполнены одни и те же поля, нажаты одни и те же переключатели и т. д. Однако что-то явно не так, потому что один и тот же код добавит в корзину одни образцы, а другие нет.
Есть ли у кого-нибудь идеи, что здесь не совсем так? Спасибо за ваше время!
Я создал плагин WooCommerce, который, помимо прочего, позволяет покупателю заказать образец продукта, который он просматривает в данный момент. Иногда эта функция работает, иногда нет. Я вижу, как данные поступают в файл function.php, но не могу понять, почему некоторые продукты добавляют образец в корзину, а другие — нет. Прежде чем я поделюсь соответствующим кодом, имейте в виду, что образец — это реальный продукт в области администрирования WooCommerce. Артикул образца основан на артикуле продукта. [code]functions.php[/code] [code]add_action('wp_ajax_order_sample', 'order_sample'); add_action('wp_ajax_nopriv_order_sample', 'order_sample');
function order_sample() { $cart_item_key = null;
if ((isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'nonce_custom_atc')) && (isset($_POST['product_id']) && $_POST['product_id'] > 0) && (isset($_POST['quantity']) && $_POST['quantity'] > 0) && (isset($_POST['cost']) && $_POST['cost'] > 0)) { $cart_item_key = wc()->cart->add_to_cart( intval($_POST['product_id']), intval($_POST['quantity']), 0, array(), array( 'cost'=>isset($_POST['cost']) ? floatval($_POST['cost']) : '', 'thumbnail_url'=>isset($_POST['thumbnail_url']) ? esc_attr($_POST['thumbnail_url']) : '', 'sku'=>isset($_POST['product_sku']) ? sanitize_text_field($_POST['product_sku']) : '', // we do this to specifically set the sku on the order to the sample sku and NOT the product sku ) ); } write_log(create_message('sku: ' . $_POST['sku'])); // lets us confirm that the info came through from the AJAX call wp_die(isset($cart_item_key) && $cart_item_key ? "Added to cart!" : "Error: not added!"); }
if (str_starts_with($sku, "S-")) { $sample_sku = $sku; $product_sku = str_replace("S-", "", $sku); } else { $product_sku = $sku; $sample_sku = "S-" . $sku; } // this lets us make sure that we get the sample sku and the product sku into the right places
$sample_id = trim($GLOBALS['wpdb']->get_results("SELECT `product_id` FROM `wp_wc_product_meta_lookup` WHERE `sku` = '" . $sample_sku . "'")[0]->product_id);
$.ajax({ type: 'POST', url: wc_params_custom.ajax_url, data: ORDER, success: (response) => { console.log('response: ', response); ORDER_SAMPLE_BUTTON.innerHTML = 'Added to Cart!'; ORDER_SAMPLE_BUTTON.style.backgroundColor = GOLD_COLOR; setTimeout(() => { location.reload(); }, 1000); }, error: (error) => { console.error('error: ', error); }, }); }); }); [/code] Я также проверил и перепроверил образцы продуктов в области администрирования WooCommerce и не вижу никакой разницы в том, как настроены нерабочие образцы по сравнению с рабочими образцами. Заполнены одни и те же поля, нажаты одни и те же переключатели и т. д. Однако что-то явно не так, потому что один и тот же код добавит в корзину одни образцы, а другие нет. Есть ли у кого-нибудь идеи, что здесь не совсем так? Спасибо за ваше время!