Ajouter plusieurs attributs de produit à Woocommerce
P粉124890778
P粉124890778 2024-03-26 17:12:46
0
2
473

J'ai un formulaire pour soumettre de nouveaux livres sur mon site WooCommerce. J'avais l'habitude de sauvegarder simplement l'état du livre en tant qu'attribut du produit. <​​/p>

// Set the book's condition

$condition = $_POST['condition'];
wp_set_object_terms( $product_id, $condition, 'pa_condition', true );

$att_condition = Array('pa_condition' =>Array(
       'name'=>'pa_condition',
       'value'=>$condition,
       'is_visible' => '1',
       'is_taxonomy' => '1'
     ));

update_post_meta( $product_id, '_product_attributes', $att_condition);

C'est facile. Maintenant, j'essaie d'ajouter le nom et le genre de l'auteur du livre, mais lorsque je copie le code, cela ne définit que le dernier attribut du produit. Je sais que je devrais probablement le mettre en boucle, mais je suis stupide ou je n'arrive pas à comprendre ce qui me manque.

$condition = $_POST['condition'];
$genre = $_POST['genre'];
$author = $_POST['author'];
    
wp_set_object_terms( $product_id, $condition, 'pa_condition', true );

$att_condition = Array('pa_condition' =>Array(
       'name'=>'pa_condition',
       'value'=>$condition,
       'is_visible' => '1',
       'is_taxonomy' => '1'
     ));

update_post_meta( $product_id, '_product_attributes', $att_condition);

wp_set_object_terms( $product_id, $genre, 'pa_genre', true );

$att_condition = Array('pa_genre' =>Array(
       'name'=>'pa_genre',
       'value'=>$genre,
       'is_visible' => '1',
       'is_taxonomy' => '1'
     ));

update_post_meta( $product_id, '_product_attributes', $att_genre);

wp_set_object_terms( $product_id, $author, 'pa_author', true );

$att_author = Array('pa_author' =>Array(
       'name'=>'pa_author',
       'value'=>$author,
       'is_visible' => '1',
       'is_taxonomy' => '1'
     ));

update_post_meta( $product_id, '_product_attributes', $att_author);

P粉124890778
P粉124890778

répondre à tous(2)
P粉087074897

Heureux que vous ayez trouvé une solution. Cependant, la question d'origine n'a pas reçu de réponse et il y a un simple bug dans votre solution qui devrait être amélioré.

Retour à la question initiale.

Il y a plusieurs problèmes avec votre code d'origine.

  1. Le nom et l'utilisation des variables dans votre code contiennent des erreurs. La deuxième fois que vous appelez update_post_meta ; vous attribuez la variable $att_condition mais utilisez att-genre. Corrigez ceci si vous souhaitez utiliser 3 variables. Cependant, le code ne fonctionne toujours pas.

  2. Vous appelez update_post_meta 3 fois (en supposant un correctif pour le premier problème) sur la même clé méta _product_attributes pour 3 variables différentes ($att_condition, $att_genre, $att_author). update_post_meta écrasera la valeur de meta_key si elle est trouvée et différente de la valeur transmise. Bien que vous ayez attribué des valeurs de tableau aux variables, elles sont toutes distinctes et un seul enregistrement de tableau est enregistré. Par conséquent, le dernier appel à update_post_meta écrasera l'écriture précédente. Au lieu de cela, vous souhaitez attribuer toutes les données du tableau d'attributs à une seule variable de tableau, puis effectuer un seul appel à update_post_meta. Il sera ensuite mis à jour correctement avec toutes les propriétés que vous avez ajoutées.

Cela vous mènera à une solution de style foreach plus robuste et plus supportable.

Le simple problème que vous rencontrez avec votre solution est un problème de performances. Vous avez inclus

update_post_meta($product_id, '_product_attributes', $thedata);

Dans la boucle foreach pas en dehors. Donc, pour l'instant, il écrit toujours dans la base de données 3 fois via update_post_meta et augmente progressivement la charge au fur et à mesure qu'il parcourt le tableau d'entrée et construit $thedata.

Solution : Déplacez l'appel update_post_meta après le foreach afin qu'il n'effectue qu'un seul appel par exécution.

Enfin, terminez cet appel et incluez éventuellement également votre affectation initiale à $my_product_attributes ou utilisez $value concernant l'initialisation et la gestion des valeurs nulles dans toute logique conditionnelle pertinente qui, selon vous, correspond à vos besoins.

P粉327903045

J'ai trouvé la solution sur https://stackoverflow.com/a/45475863/12092133.

J'ai mis les variables du formulaire dans un tableau, puis j'ai exécuté ceci foreach et cela a fonctionné.

$my_product_attributes['condition'] = $_POST['condition'];
$my_product_attributes['genre'] = $_POST['genre'];
$my_product_attributes['authors'] = $_POST['author'];

foreach ($my_product_attributes as $key => $value) {
    $key = 'pa_' . $key;
    $attribute_values = explode(",", $value);

    wp_set_object_terms($product_id, $attribute_values, $key, false);
    $thedata[sanitize_title($key)] = Array(
        'name' => wc_clean($key),
        'value' => $attribute_values,
        'postion' => '0',
        'is_visible' => '1',
        'is_variation' => '0',
        'is_taxonomy' => '1'
    );
    update_post_meta($product_id, '_product_attributes', $thedata);
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal