Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用未正确链接的方法添加的属性_Php_Wordpress_Woocommerce_Product_Taxonomy Terms - Fatal编程技术网

Php 使用未正确链接的方法添加的属性

Php 使用未正确链接的方法添加的属性,php,wordpress,woocommerce,product,taxonomy-terms,Php,Wordpress,Woocommerce,Product,Taxonomy Terms,这不是重复的线程问题,例如: 这里的问题是没有添加每个属性。问题是将添加的属性选项与正确的术语关联起来。如下图所示,属性选项设置正确,但它们不与其术语相关联(如图1所示[文本,而非图3所示的灰色背景属性选项]),即使我手动为每个产品运行set_object_terms,并且在数据库中正确设置了关系 foreach($terms as $term_id) { $term = get_term( $term_id ); $term_name = $term->name;

这不是重复的线程问题,例如:

这里的问题是没有添加每个属性。问题是将添加的属性选项与正确的术语关联起来。如下图所示,属性选项设置正确,但它们不与其术语相关联(如图1所示[文本,而非图3所示的灰色背景属性选项]),即使我手动为每个产品运行set_object_terms,并且在数据库中正确设置了关系

foreach($terms as $term_id) {
    $term = get_term( $term_id );
    $term_name = $term->name;
    $term_taxonomy = $term->taxonomy;
    $term_slug = $term->slug;
                            
    if( ! has_term( $term_name, $term_taxonomy, $parent_id ) ) {
        $set_terms = wp_set_object_terms($parent_id, $term_slug, $term_taxonomy, true );
    }
                            
}
在将一些属性从一个数据库传输到另一个数据库时,我面临一个问题,即属性被正确传输,但它们以文本形式保存

我需要手动点击wordpress管理>产品编辑中的“保存属性”

使其在系统中正确注册,如图所示

主要的问题是,虽然如第一个屏幕截图所示的文本形式,但属性在面向用户的商店中实际上不可见,并且在产品的变体中也不可用

我正在使用woocommerce方法更新产品。下面是一个代码示例:

$attribute_object = new WC_Product_Attribute();
$attribute_object->set_name( $attribute_name );
$attribute_object->set_options( $value );
$attribute_object->set_visible(1);
$attribute_object->set_variation(1);
$attribute_object->set_position(0);
$attribute_object->set_id( 0 );
$new_product_attributes[$attribute_name] = $attribute_object;
$new_product->set_attributes($new_product_attributes);
                        
$new_product->save();
如何让WP将产品与新添加的产品同步 属性/属性值

如中所示,属性选项之间的区别是什么 图片一和图片三中的那个些(灰色背景)

复制问题的简单代码

<?php
require_once(rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/wp-load.php');

global $wpdb;
wp_cache_flush();


$objProduct = new WC_Product_Variable();

$objProduct->set_name("Product Title");
$objProduct->set_status("publish");  // can be publish,draft or any wordpress post status
$objProduct->set_catalog_visibility('visible'); // add the product visibility status
$objProduct->set_description("Product Description");
$objProduct->set_sku("product-sku"); //can be blank in case you don't have sku, but You can't add duplicate sku's
$objProduct->set_price(10.55); // set product price
$objProduct->set_regular_price(10.55); // set product regular price
$objProduct->set_manage_stock(true); // true or false
$objProduct->set_stock_quantity(10);
$objProduct->set_stock_status('instock'); // in stock or out of stock value
$objProduct->set_backorders('no');
$objProduct->set_sold_individually(false);

$product_attributes = [];
$attribute_list = array('pa_marime' => array('l','m')); // -- choose any existing taxonomy and two existing attribute options belonging to that taxonomy (terms)

foreach($attribute_list as $attribute_name => $value) {
    $attribute_object = new WC_Product_Attribute();
    $attribute_object->set_name( $attribute_name );
    $attribute_object->set_options( $value );
    $attribute_object->set_visible( 1 );
    $attribute_object->set_variation( 1 );
    $attribute_object->set_id( 0 );
    $product_attributes[$attribute_name] = $attribute_object;
}

$objProduct->set_attributes($product_attributes);

$product_id = $objProduct->save();

$terms_list = [];

foreach($attribute_list as $attribute_name => $value) {
    foreach($value as $val) {
        $term = term_exists($val, $attribute_name);
        if($term) {
            array_push($terms_list, $term['term_id']);
        }
    }
}

foreach($terms_list as $term_id) {
    $term = get_term( $term_id );
    $term_name = $term->name;
    $term_taxonomy = $term->taxonomy;
    $term_slug = $term->slug;
    
    if( ! has_term( $term_name, $term_taxonomy, $product_id ) ) {
        $set_terms = wp_set_object_terms($product_id, $term_slug, $term_taxonomy, true );   
    }
    
}
所以现在的问题是:

WC_Product_Attribute()->set_options()中为set_attributes方法提供的正确格式是什么,以便将值识别为分类法

我试过:

$values = array(term_1_id, term_2_id); // array of existing term ids
$values = array('term_1_id' => 'term_1_name', 'term_2_id' => 'term_2_name'); // array of existing term_id and term_name pairs
$values = array('term_1_name', 'term_2_name); // array of existing term names
$values = array('term_1_slug', 'term_2_slug); // array of existing term slugs

上述所有情况都会导致wc_product->set_属性无法将其识别为分类法,即使它们是有效的术语/分类法。

问题可能只存在于set_选项($value);其中$value需要是一个术语id的数组……嘿,谢谢你们的回复。根据woocommerce文档,$value数组可以用术语ID或术语名称填充。我现在使用的术语名称可以从图片中看到。如果我用术语ID填充它,除了这次在wp admin中单击save attributes(保存属性)时,会发生相同的情况,现在术语ID被创建为术语。(它将它们视为术语名称,并创建新的术语、分类法等)“应更新问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。”请参阅@LoicTheAztec Fair enough。添加代码以完全重现问题。如果有机会的话,看看。任何反馈都将不胜感激。感谢这个问题可能只存在于set_选项中($value);其中$value需要是一个术语id的数组……嘿,谢谢你们的回复。根据woocommerce文档,$value数组可以用术语ID或术语名称填充。我现在使用的术语名称可以从图片中看到。如果我用术语ID填充它,除了这次在wp admin中单击save attributes(保存属性)时,会发生相同的情况,现在术语ID被创建为术语。(它将它们视为术语名称,并创建新的术语、分类法等)“应更新问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。”请参阅@LoicTheAztec Fair enough。添加代码以完全重现问题。如果有机会的话,看看。任何反馈都将不胜感激。谢谢
Array
(
    [pa_marime] => Array
        (
            [name] => pa_marime
            [value] => 1444 | 1445
            [position] => 0
            [is_visible] => 1
            [is_variation] => 1
            [is_taxonomy] => 0
        )

)