Bonjour,
Je galère depuis toute une soirée.
Pour résumer, j'ai créé un script jquery/ajax qui retourne une réponse.
L'objectif de mon code est de retourner un résultat HTML en fonctionne d'une date que je sélectionne en input.
La fonction testée de manière simple marche bien, sauf que quand je la finalise, j'obtiens une réponse en erreur 500.
Après plusieurs tests, je me rends compte que l'erreur démarre toujours au même endroit.
Je place à 2 position différentes un test sur la valeur de ma variable, le premier cas affiche bien la variable, le second tout plante !
Je vous montre une portion de mon code (pour ne pas vous embêter) :
$.ajax({
type: 'POST',
url: ajaxurl,
data: {
'action':'check_availability',
'date' : laDate,
},
success:function(data){
//console.log(data);
$('#response').html(data);
},
error: function(error){
console.log(error);
},
});
add_action( 'wp_ajax_check_availability', 'check_availability' );
add_action( 'wp_ajax_nopriv_check_availability', 'check_availability' );
if (!function_exists('check_availability')) {
function check_availability(){
$date = $_POST['date'];
if(!empty($date)){
echo $date;
die();
//LA CA MARCHE, LA VARIABLE DATE FONCTIONNE !
global $wpdb;
global $woocommerce;
global $product;
if( !empty($product->get_id()) && $product->managing_stock() ){
echo $date;
die();
//LA CA PLANTE, AUCUNE REPONSE RETOURNEE A PART ERREUR 500 !
ETC
ETC...
POST http://192.168.1.11/monsite/wp-admin/admin-ajax.php 500 (Internal Server Error)
Ma conclusion : à peine j'utilise la variable $product de Woocommerce, tout plante !
En retirant toutes les références à catte variable, la fonction Ajax marche bien sans souci.
Quelle erreur ai je fait ?
Il y a une incompatibilité entre la variable globale $product et Ajax ?
Global quand tu charge ta page ...
quand tu charge ta page ajaxurl , celle si n'a jamais été initialisé avec un ID ... logique elle n'a pas d'ID par default.
donc ta page est en attente d'un ID.
Quand tu fait de l'ajax c'est comme si tu communiquai avec un autre site qui n'a aucune information (sauf les info de sessions)
si tu as erreur 500, tes logs disent quoi?
sur wordpress : https://codex.wordpress.org/fr:D%C3%A9bogage_dans_WordPress
pense au mode debug...
fort possible que ton probleme soit au niveau de :
if( !empty($product->get_id()) && $product->managing_stock() ){
Hello et merci de ta réponse,
Alors en effet, après plusieurs tests, je me rends compte que c'est apparemment la variable $product qui pose problème.
Quand je fais un var_dump de $product, il me retourne "bool false" (on dirait qu'il ne reconnait pas l'objet $product, est-ce parce que on est en dehors du loop ?)
Quand je rentre un id manuel avec la fonction $product = wc_get product(id) (exemple wc get product(28)), alors la tout va bien.
Mon gros souci etait donc de recupérer l'ID.
J'ai donc trouvé une solution alternative à mon problème, même si ce n'est pas ce que je veux : passer la variable id dans l'appel js/jquery/ajax à l'avance.
Mais j'aurai préféré que tout se passe dans cette fonction PHP (car j'aimerais utiliser cette fonction php de manière indépendante ailleurs)
Tu as une idée ?
Je dirai que tu ne peu pas.
ta page "ajaxurl" est independante de ta page qui l'apelle ... ta page qui l'apelle a l'ID 5 par exemple comment ta page ajax fait pour le savoir si tu ne lui dit pas? tu aurai a la limite une possibilité de faire ça en session genre un $_SESSION["current_id"] ... mais si une personne ouvre 2/3 page en meme temps ça serrai tout pourri.
@woozy :
Oui tu as raison dans l'absolu, d'ailleurs c'est la solution que j'ai utilisé finalement (passer une variable dans l'appel Jquery Ajax).
J'ai du utiliser un $('.monchamp').val() pour passer la variable.
Pour ce que je souhaite faire (c'est à dire réutiliser cette fonction avec une valeur par défaut $valeur = $product->id), c'est pas le top.
Je trouve bizarre cet erreur sur la variable $product.
$product est une variable globale de Wordpress.
Je cherche à savoir pourquoi il me déclare false et ne connaît pas cet objet $product.
Si j'affecte $product->id manuellement, tout fonctionne à merveille.
Je sais parfaitement que l'ajax doit avoir un id. Et c'est pour ca que j'ai voulu la déclarer dans la fonction avec $product->id (car quand on clique sur cet appel fonction, on se situe sur la page produit justement)
Ahhhh d'accord !
Mais alors, aurais-tu une solution pour moi ?
Je souhaite mémoriser la date préselectionnée (date qui est sélectionné avec datepicker) et l'afficher sur toutes les pages fiches produit (via cookie ou session).
je souhaite lancer la fonction check_availability par défaut avec la date préremplie.
Mais si je n'arrive pas à récupérer l'id ? (à a moins de lancer le datepicker via js au chargement de la page ?)
T'as une idée ?
Maintenant pour la date selectioné la logique voudrai que tu utilise les session genre $_SESSION["date"] ... apres je ne connais pas ton projet, mais via date+product c'est quoi? reservation de concert/spectacle? voyage?
si c'est voyage il y a une date de debut et de fin, donc il te faut un range de date si c'est un spectacle ou concert une date peu suffir.
En gros , la fonction check availability sert à checker une disponibilité produits sur une date précise (site de reservation de produits pour une date de mariage). Elle a besoin de 2 paramètres pour retourner un résultat.
En gros si c'est dispo, ca affiche le bouton "ajout panier" en fiche produit, ou ca ne l'affiche pas le cas échéant.
Ce qui peut etre gardé en session ou cookie, c'est la date.Le champ est un datepicker sur la fiche produit.
Voila pourqioi je peux le stocker au clic sur le date picker.
Par contre, les produits sont divers et variés. Et ils se distinguent par l'ID
Ma fonction check availabity doit donc pouvoir se lancer automatiquement juste avec la date récupérée en session/cookie, et l'id produit.
Le but est que la personne n'ai pas à cliquer à chaque fois sur la même date pour affiche le résultat.
Problème compris et résolu !
J'ai pu finalement faire marcher ma fonction grâce à l'ajout de paramètres facultatifs, et la détection d'une requête Ajax ou pas.
Merci à vous et en particulier woozy !