2017-10-15 4 views
1

J'ai actuellement une fonction qui ajoute des produits à Woocommerce en utilisant wp_insert_post().Attribuer automatiquement des produits à des catégories en fonction de leurs étiquettes de produit dans Woocommerce

J'essaye maintenant d'assigner des produits aux catégories appropriées basées sur leurs étiquettes de produit. Par exemple, si le produit est ajouté avec les étiquettes de produit «anneau» ou «collier», il est automatiquement affecté à la catégorie «Bijoux». En utilisant la fonction suivante, je suis en mesure d'obtenir la fonctionnalité correcte sur les publications, mais je n'ai pas eu de chance en essayant de faire ce travail pour le type de publication de produits utilisé dans woocommerce.

Works pour les postes:

function auto_add_category ($post_id = 0) { 
if (!$post_id) return; 
$tag_categories = array (
    'ring' => 'Jewellery', 
    'necklace' => 'Jewellery', 
    'dress' => 'Clothing', 
); 
$post_tags = get_the_tags($post_id); 
foreach ($post_tags as $tag) { 
    if ($tag_categories[$tag->name]) { 
    $cat_id = get_cat_ID($tag_categories[$tag->name]); 
    if ($cat_id) { 
     $result = wp_set_post_terms($post_id, $tags = $cat_id, $taxonomy = 'category', $append = true); 
    } 
    } 
    } 
} 
add_action('publish_post','auto_add_category'); 


J'ai essayé de reformater le code de travail pour les produits comme suit:

function auto_add_category ($product_id = 0) { 
    if (!$product_id) return; 
$tag_categories = array (
    'ring' => 'Jewellery' 
    'necklace' => 'Jewellery', 
    'dress' => 'Clothing', 
); 
$product_tags = get_terms(array('taxonomy' => 'product_tag')); 
foreach ($product_tags as $tag) { 
    if ($tag_categories[$tag->name]) { 
     $cat = get_term_by('name', $tag_categories[$tag->name], 'product_cat'); 
     $cat_id = $cat->term_id; 
     if ($cat_id) { 
      $result = wp_set_post_terms($product_id, $tags = $cat_id, $taxonomy = 'product_cat', $append = true); 
     } 
    } 
} 
} 
add_action('publish_product','auto_add_category'); 


Cependant, il n'attribue pas les catégories pertinentes sur création de produit Toute aide serait grandement appréciée par ce codeur novice se frayant un chemin à travers wordpress!

Répondre

0

Essayez ce code:

function auto_add_category ($product_id = 0) { 

    if (!$product_id) return; 

    // because we use save_post action, let's check post type here 
    $post_type = get_post_type($post_id); 
    if ("product" != $post_type) return; 

    $tag_categories = array (
     'ring' => 'Jewellery' 
     'necklace' => 'Jewellery', 
     'dress' => 'Clothing', 
    ); 

    // get_terms returns ALL terms, so we have to add object_ids param to get terms to a specific product 
    $product_tags = get_terms(array('taxonomy' => 'product_tag', 'object_ids' => $product_id)); 
    foreach ($product_tags as $term) { 
     if ($tag_categories[$term->slug]) { 
      $cat = get_term_by('name', $tag_categories[$term->slug], 'product_cat'); 
      $cat_id = $cat->term_id; 
      if ($cat_id) { 
       $result = wp_set_post_terms($product_id, $cat_id, 'product_cat', true); 
      } 
     } 
    } 
} 
add_action('save_post','auto_add_category'); 
+0

Merci! Cela fonctionne parfaitement lors de l'ajout de produits via le backend admin, mais il ne semble pas déclencher lors de l'ajout de produits par programme, comme je le fais. Je suppose que c'est parce que les termes de l'objet (étiquettes de produits) sont ajoutés après l'enregistrement de la publication? J'ai essayé d'utiliser l'action 'set_object_terms' au lieu de 'save_post' et cela semble fonctionner, mais ajoute seulement la catégorie correspondant à la première balise. Des idées? –

+0

Attendez, vous avez dit que vous le faites par programme. Dans ce cas, il n'est pas nécessaire d'utiliser des filtres du tout. Ajoutez simplement le code quelque part après l'utilisation de wp_insert_post(). –

+0

Bien sûr, c'est tout à fait logique maintenant que vous l'avez dit. Je ne sais pas pourquoi je n'avais pas envisagé de le faire en premier lieu! Oh bien - merci beaucoup pour votre aide! –