Tenho lutado ultimamente ao passar um array de dados no WordPress para ser processado via admin-ajax.php. Adicionei um botão no hook do WooCommerce 'woocommerce_after_shop_loop_item' que contém um data-product_id com uma classe de compare-button. Meu problema é que estou recebendo uma espécie de array stringificado 'muitas vezes' (com aspas de escape, imagens mostradas). Meu objetivo é passar um array de IDs de produtos clicados para admin-ajax.php e lá processar esse array. Não consigo fazer isso provavelmente devido ao formato do array como string. Se eu usar json_decode, também recebo um erro (embora dessa forma funcione se testado em localhost, não em ambiente WordPress). Se eu decodificar JSON primeiro e verificar se um ID está no array novamente, não está funcionando. O que estou fazendo errado?
function ps_compare_products_add_enqueue(){
wp_enqueue_script('ps_script1', plugin_dir_url(__FILE__).'../script/script.js');
wp_localize_script('ps_script1','ps_object', array(
"ajax_url" => admin_url("admin-ajax.php")
));
}
function process_array_ids(){
if(isset($_POST['my_string_array']) && !empty($_POST['my_string_array'])){
$array = $_POST['my_string_array'];
//$array = json_decode($array); // if I add this I get null in my console which in not wordpress environment works
echo json_encode($array); // the only way I found to send back the array but in string format again
}
wp_die();
}
add_action('wp_enqueue_scripts','ps_compare_products_add_enqueue');
add_action('wp_ajax_my_array_ids_action', 'process_array_ids');
add_action('wp_ajax_nopriv_my_array_ids_action', 'process_array_ids');
Javascript
document.addEventListener('DOMContentLoaded', function() {
let compareProducts = []
var compareButtons = document.querySelectorAll('.compare-button');
document.addEventListener('click', (e) => {
if(e.target.matches('.compare-button')){
var productId = e.target.dataset.product_id;
if (!compareProducts.includes(productId)) {
compareProducts.push(productId);
}
fetch_my_array(ps_object.ajax_url, 'POST', compareProducts)
}
});
})
async function fetch_my_array(url, post, myArray){
let myForm = new FormData()
let my_string_array = JSON.stringify(myArray)
myForm.append('action', 'my_array_ids_action')
myForm.append('my_string_array', my_string_array)
const options={
method: post,
body: myForm
}
const response = await fetch(url, options)
let result = await response.json()
console.log(response)
console.log(result)
// console.log(JSON.parse(result.replaceAll('\\"','')))
}