Php Woocommerce newProduct()分类法不起作用

Php Woocommerce newProduct()分类法不起作用,php,attributes,woocommerce,product,taxonomy,Php,Attributes,Woocommerce,Product,Taxonomy,你能告诉我我做错了什么吗 我现在向Woocommerce添加新产品的代码如下所示: function newProduct( $idERP, $titulo, $conteudo, $preco, $precoDesconto, $sku, $peso, $comprimento, $largura, $altura, $estoque, $variacoes, $categorias ){ global $woocommerce; $titulo = utf

你能告诉我我做错了什么吗

我现在向Woocommerce添加新产品的代码如下所示:

function newProduct( $idERP, $titulo, $conteudo, $preco, $precoDesconto, $sku, $peso, $comprimento, $largura, $altura, $estoque, $variacoes, $categorias ){

        global $woocommerce;

        $titulo = utf8_encode($titulo);
        $conteudo = utf8_encode($conteudo);

        $my_post = array(
          'post_title'    => $titulo,
          'post_content'  => $conteudo,
          'post_status'   => 'pending',
          'post_author'   => 6,
          'post_type'     =>'product'
        );
        $product_ID = wp_insert_post( $my_post );

        if ( $product_ID ){

          if( $preco == $precoDesconto){
              add_post_meta($product_ID, '_price',         $precoDesconto );
          }else{
              add_post_meta($product_ID, '_regular_price', $preco );
              add_post_meta($product_ID, '_price',         $precoDesconto );
              add_post_meta($product_ID, '_sale_price',    $precoDesconto );
          }


          add_post_meta($product_ID, '_sku',           $sku );
          add_post_meta($product_ID, '_weight',        $peso );
          add_post_meta($product_ID, '_length',        $comprimento );
          add_post_meta($product_ID, '_width',         $largura );
          add_post_meta($product_ID, '_height',        $altura );
          add_post_meta($product_ID, '_stock',         $this->estoque($estoque) );
          add_post_meta($product_ID, '_idERP',         $idERP ); //ID from erp
          wp_set_object_terms( $product_ID,  'variable', 'product_type' );
          //wp_set_object_terms( $product_ID, $categorias, 'product_cat');

          $guardaVariacoes = array();$i = 1;
          foreach($variacoes as $v){
            $vid = wp_insert_post(
                array(
                  'post_title'    => 'Variacao #' . $i,
                  'post_name'     => 'product-' . $product_ID . '-variation-' . $i,
                  'post_status'   => 'publish',
                  'post_parent'   => $product_ID,
                  'post_type'     => 'product_variation',
                  'guid'          =>  home_url() . '/?product_variation=product-' . $product_ID . '-variation-' . $i
                )
            );

            if( $v[1] == $v[2] ){
                update_post_meta( $vid, '_regular_price', $v[1]);
            }else{
                update_post_meta( $vid, '_price', $v[2] );
                update_post_meta( $vid, '_regular_price', $v[1]);
                update_post_meta( $vid, '_sale_price',  $v[2] );
            }

            update_post_meta( $vid, '_stock', $this->estoque($v[0]) );
            update_post_meta( $vid, '_weight', $v[3]);
            update_post_meta( $vid, '_width', $v[4]);
            update_post_meta( $vid, '_height', $v[5]);
            update_post_meta( $vid, '_length', $v[6]);
            update_post_meta( $vid, '_sku', $v[8]);
            update_post_meta( $vid, '_idERP', $v[9]);

            foreach($v[7] as $nAtr=>$vAtr){
                $nomeAtributo = strtolower(trim($nAtr));


                 $tt = $nomeAtributo;
                 if(strtolower($tt) == 'tamanho')$tt = 'pa_tamanho';
                 if(strtolower($tt) == 'cor')$tt = 'pa_cor';


                update_post_meta( $vid, 'attribute_'.$tt, trim($vAtr));
                $temp = $tt.'|'.$nAtr;
                if( !array_key_exists($temp,$guardaVariacoes) ) $guardaVariacoes[$temp] = array();
                $guardaVariacoes[$temp][] = $vAtr;  
            }
            $i++;
          }

          $product_attributes = array();
          foreach($guardaVariacoes as $r=>$s){

              $r = explode('|',$r);

              $temp = array();
              foreach($s as $w){

                  $w = trim($w);

                  if( strtoupper($w) == 'UNICA'  ){
                      $w = 'Única';
                  }
                  if( strtoupper($w) == 'UNICO'  ){
                      $w = 'Único';
                  }


                  if( array_search( $w,$temp)===false){
                     if( strtoupper(trim($r[1])) == 'COR'){
                         $temp[] = ucfirst(strtolower($w)); 
                      }else{
                          $temp[] = $w; 
                    } 
                  }
              }
              $s = array_unique($temp);



             $tt = $r[1];
             if(strtolower($tt) == 'tamanho')$tt = 'pa_tamanho';
             if(strtolower($tt) == 'cor')$tt = 'pa_cor';


              $product_attributes[$r[0]] = array(
                'name' => $tt, 
                'value' => implode(' | ', $s ),
                'position' => 1,
                'is_visible' => 1,
                'is_variation' => 1,
                'is_taxonomy' => 1  //MY PROBLEM IS HERE
              );
          }
          update_post_meta($product_ID, '_product_attributes', $product_attributes);
        }
        return $product_ID;
    }
当我像这样更改代码时

    'is_taxonomy' => 1
…它可以工作,但对“搜索分层过滤器”不起作用,这意味着我必须使用分类法


如何在不丢失产品内部的“属性”的情况下做到这一点?

听起来您好像在尝试为产品设置类别,如果我错了,请纠正我。如果是这种情况,您就不想使用分类法。首先,您丢失了该产品及其所有变体的大量meta_键。我建议你在Wordpress的新版本上安装WooCommerce插件的新版本。在后端手动创建一个包含2个变体的产品,并查看
wp_posts
wp_postmeta
post_id
meta_key
meta_值
)。对于变体,与变体相比,
wp_postemta
表中的实际产品id值更多
\u max\u variation\u sale\u price\u id
\u max\u variation\u sale\u price\u id
\u min\u variation\u sale\u price\u price
,等等。还有另一个序列化数组,
\u default\u attributes
,您可以创建一个空数组并序列化它,为产品设置默认值

所以,如果你是指类别,并希望分配产品的类别,以便您可以点击一个类别,并看到该产品在那里。。。然后执行以下操作:

Keep
是否设置为0
是否可见
没有关系,如果您想在“附加信息”下查看它,而不是设置为1,否则,它仍应显示所有不同的变体,但我想这取决于主题的处理方式。
位置
需要从1开始,每次递增,因此为此使用一个变量,例如:

$position = 1;
foreach($guardaVariacoes as $r=>$s) {

    // your top code... down to where the _product_attributes array begins...

    $product_attributes[$r[0]] = array(
        'name' => $tt, 
        'value' => implode(' | ', $s),
        'position' => $position,
        'is_visible' => count($s) > 1 ? 0 : 1,
        'is_variation' => count($s) > 1 ? 1 : 0,
        'is_taxonomy' => 0
    );

    $position++;
}
要为您使用的产品动态创建和分配类别:(如果术语不存在,将返回0或NULL,您可以使用
empty()
),(如果术语不存在),请插入它以便将类别分配给产品。下面的示例如果您想将子品牌类别插入父品牌类别,仅举一个我如何向产品添加类别的示例(
wp\u term\u relationships
table通过products/posts ID值将类别分配给每个产品):


因此,希望这能帮助您为产品建立类别,同时在搜索过滤器中保持产品属性的灵活性。祝你好运。

仅供参考:你应该使用带有破折号的
清理标题。什么是
搜索分层过滤器
?您指的是在
wp\u terms
表中设置的类别吗?您好,所罗门!我的意思是,图层过滤器就是我们放在边栏中的小部件。所以当有人搜索“T恤”时。它显示颜色或大小,您可以过滤搜索。我不知道这个的真名,这是我在Woocommerce的第一天。看起来这个搜索使用了分类法,当我设置为1时,我在编辑它时看不到产品属性。所以我做错了什么。
// Check if Brand exists or not...
$brand = term_exists('brand', 'product_cat', 0);
$category = 'new category';
$cat_name = addslashes(ucwords(strtolower($category)));
$cats['brand'] = array(
    'name' => $cat_name,
    'slug' => sanitize_title_with_dashes($category)
);

if (!empty($brand))
{
    $subbrand = term_exists($cats['brand']['slug'], 'product_cat', $brand['term_id']);

    if (empty($subbrand))
    {
        $subbrand = wp_insert_term(
            $cats['brand']['name'],
            'product_cat',
            array(
                'slug' => $cats['brand']['slug'],
                'parent'=> $brand['term_id']
            )
        );
    }
} else {

    $brand = wp_insert_term(
        'Brand',
        'product_cat',
        array(
            'slug' => 'brand',
            'parent'=> 0 // This means it will be at the first level!
        )
    );

    $subbrand = term_exists($cats['brand']['slug'], 'product_cat', $brand['term_id']);

    if (empty($subbrand))
    {
        $subbrand = wp_insert_term(
            $cats['brand']['name'],
            'product_cat',
            array(
                'slug' => $cats['brand']['slug'],
                'parent'=> $brand['term_id']
            )
        );
    }
}

$categories = array(
    'product_id' => // put the product id value in here!
    'terms' => array()
);

if (!empty($subbrand))
{
    $categories['terms']['subbrands'] = $subbrand;
}

// Now insert into term_relationships table for that product and that's all folks...
foreach($categories['terms'] as $type => $nfo)
{
    $wpdb->insert(
        $wpdb->prefix . "term_relationships", 
        array(
            'object_id' => $categories['product_id'], 
            'term_taxonomy_id' => intval($nfo['term_taxonomy_id']),
            'term_order' => 0
        ),
        array('%d', '%d', '%d')
    );
}