web-dev-qa-db-fra.com

Validation de produit personnalisé WooCommerce

J'essaie de créer un système d'adhésion dans WordPress qui utilise WooCommerce avec Gravity Forms et intègre/ SalesForce .

Quelqu'un peut-il m'indiquer comment utiliser correctement le filtre woocommerce_add_to_cart_validation? Je ne sais tout simplement pas comment utiliser correctement ce crochet.

Peu importe ce que je fais, si j'essaie d'exécuter une validation personnalisée, l'article n'est pas ajouté au panier. Ci-dessous mon code:

add_filter( 'woocommerce_add_to_cart_validation', 'validate_active_subscription', 10, 10 );

function validate_active_subscription( $valid, $product_id, $quantity, $variation_id, $variations ) {
  global $woocommerce;
  $cart_item_data = (array) apply_filters( 'woocommerce_add_cart_item_data', $cart_item_data, $product_id, $variation_id );
  $item_data = $cart_item_data["_gravity_form_lead"];

  //CAPTURE THE ID OF THE MEMBERSHIP CATEGORY
  $idObj = get_term_by('slug','membership','product_cat'); 
  $membership_id = $idObj->term_id;

  $membership_purchased = false;
  $terms = woocommerce_get_product_terms($product_id, 'product_cat' );
  foreach ($terms as $term) {
    if($term->term_id == $membership_id){
      $membership_purchased = true;
    }
  }
  if($membership_purchased){
    //LET'S CHECK THAT, IF THIS EMAIL EXISTS WITHIN SALESFORCE, IT IS ASSOCATED WITH THE SAME INDIVIDUAL
    try {
      $mySforceConnection = SalesForce_Access::Connection();
      $sf_contact = SalesForce_Access::Search_Contacts_Via_Email($mySforceConnection, $item_data[6]);
      if( $sf_contact->FirstName == $item_data[3] && $sf_contact->LastName == $item_data[4]){
        //$valid = true;
      }else{
        //$woocommerce->add_error("The email address you supplied already exists within our system. Please supply a different email");
        //$valid = false;
      }
    }
    catch (Exception $e) 
    {
      //$woocommerce->add_error($e->faultstring);
      //$valid = false;
    }   
  }
} 

Avant que l’utilisateur n’ajoute l’élément d’appartenance au panier, je souhaite vérifier l’adresse e-mail, le prénom et le nom de famille pour vérifier que les informations correspondent bien à un enregistrement existant (par exemple, si l’e-mail existe, les nom et prénom fournis rencontre).

Cependant, comment puis-je transmettre correctement la validation (ou l’invalidation) à WooCommerce afin qu’il puisse revenir au fonctionnement standard. Tout ce que je fais semble revenir à la page du produit unique et supprimer mes champs de formulaire de gravité.

Toute réflexion sera apprécié.

2
Eric K

J'ai pu découvrir le problème.

Il semble que le complémentGravity Forms/ ait sa propre validation qui ne vérifie pas l'état de la validation avant d'effectuer sa propre logique. Par conséquent, toute validation antérieure ayant échoué ne déclencherait pas la validation de Gravity Forms, permettant ainsi à Gravity Forms de les valider et de les supprimer de la page du produit.

La solution à cela est d'ajouter le code suivant à la ligne 414 du fichiergravityforms-product-addons.php:

// If valid is passed in as false, do not complete validation 
if(!$valid) 
  return false;

J'ai soumis ceci comme un bogue, donc j'espère que cela sera résolu dans une future mise à jour.

1
Eric K