【问题标题】:WooCommerce: issue setting attributes with wp_set_object_termsWooCommerce:使用 wp_set_object_terms 问题设置属性
【发布时间】:2015-10-05 20:38:08
【问题描述】:

我需要通过 PHP 代码设置产品的属性。 根据 StackOverflow 上的其他线程,有方法 wp_set_object_terms。不幸的是,在我的情况下它不能正常工作:

例如,有一个名为“Hersteller”的属性,slug“hersteller”。 还有一个产品,ID 593,没有设置“hersteller”属性。

我尝试了以下代码来填充属性:

wp_set_object_terms(593, 'Alpina', 'pa_hersteller' , false);

当我试图在产品页面上显示属性时,没有输出,因此 wp_set_object_terms 过程似乎没有成功。 以下代码产生一个空输出:

$product->get_attribute('hersteller');

此外,属性“hersteller”甚至没有在后台管理菜单的属性列表中列出。

为了调试问题,我还尝试了以下代码:

$attributes = get_post_meta( 593,  '_product_attributes' ); 
print_r($attributes);

产生以下输出:

Array ( [0] => Array ( [pa_marken] => Array ( [name] => pa_marken [value] => [position] => 0 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_kategorien] => Array ( [name] => pa_kategorien [value] => [position] => 1 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_referenznummer] => Array ( [name] => pa_referenznummer [value] => [position] => 2 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_herstellergarantie] => Array ( [name] => pa_herstellergarantie [value] => [position] => 3 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_schlagwoerter] => Array ( [name] => pa_schlagwoerter [value] => [position] => 4 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_lieferzeit] => Array ( [name] => pa_lieferzeit [value] => [position] => 5 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) ) )

我使用 wp_set_object_terms 方法本质上是错误的吗? 我现在不知道该怎么办了。这里有人可以帮助我吗?谢谢!

【问题讨论】:

    标签: php wordpress woocommerce webshop


    【解决方案1】:

    尝试像这样设置你的代码:

    wp_set_object_terms(593, 'Alpina', 'pa_hersteller' , true);
    

    然后再试一次。

    根据WordPress Codex中的功能

    <?php wp_set_object_terms( $object_id, $terms, $taxonomy, $append ); ?>
    

    $append (bool) (可选) 如果为真,标签将附加到 目的。如果为 false,标签将替换现有标签(默认:False)

    因此,如果您将 $append 更改为 true,它可能会起作用 =)

    【讨论】:

    • 到目前为止,我也试过了!这也不起作用,因为 append-boolean 只是为了启用多个值设置为一个属性。如果 append 为 false,则覆盖现有属性值,如果 append 为 true,则现有属性仍然存在并添加新属性。
    【解决方案2】:

    根据您提供的属性输出,您的目标分类似乎是错误的,我可以在以下输出中看到pa_herstellergarantie

    Array ( ..... 
        [pa_herstellergarantie] => Array ( 
                     [name] => pa_herstellergarantie 
                     [value] => 
                     [position] => 3 
                     [is_visible] => 1 
                     [is_variation] => 0 
                     [is_taxonomy] => 1 )......
    

    将您的代码更改为:

    wp_set_object_terms(593, 'Alpina', 'pa_herstellergarantie' , false);
    

    还要说明wp_set_object_terms 不会创建分类。 如果分类不存在,它将抛出 Invalid taxonomy 错误消息。

    如果pa_herstellergarantiepa_hersteller 是2 个不同的分类法,那么在使用wp_set_object_terms 之前确保pa_hersteller 存在

    【讨论】:

    • 两个属性,pa_herstellerpa_herstellergarantie 是不同的分类法。两者也都存在——数据库截图,表wp_woocommerce_attribute_taxonomies:linkpa_herstellergarantie(存储产品生产商提供的保修)和pa_hersteller(存储生产商)之间的唯一区别是,pa_herstellergarantie 已为每个管理员后端菜单设置,而 pa_hersteller 未针对此特定产品设置!
    • 有趣的是,当我尝试代码 wp_set_object_terms( 593, 'Alpina', 'pa_herstellergarantie' , false); 时,它可以工作!属性“herstellergarantie”成功设置为“Alpina” - 但属性 hersteller 应该是“Alpina”,而不是 herstellergarantie!唯一的区别是,pa_herstellergarantie 之前已在此特定产品的管理菜单中设置,pa_hersteller 尚未为此产品设置(但它存在于数据库中,上面的截图!)。
    • 尝试清除瞬变,看看是否有区别。
    • 现在我已经尝试了以下代码:wc_delete_product_transients( 593 ); wp_set_object_terms( 593, 'TestForStackoverflow', 'pa_hersteller' , false); get_post_meta 的输出仍然相同,pa_hersteller 仍然没有列出产品 593 的属性数组。
    • 我在上面的评论中给出的代码应该将产品 593 的 pa_hersteller 设置为 TestForStackoverflow。有趣的是,当我尝试调试和显示 pa_hersteller 的所有值时,以某种方式列出了术语“TestForStackoverflow”。 $terms = get_terms("pa_hersteller"); foreach ($terms as $term) echo $term-&gt;name."|".$term-&gt;term_id; 但是,产品 593 仍然没有设置属性 pa_hersteller get_terms 的输出是:TestForStackoverflow|116
    【解决方案3】:

    要以编程方式设置属性,您必须在设置术语后使用分类数据更新帖子元,如下所示

    wp_set_object_terms(593, 'Alpina', 'pa_hersteller' , false);
    $thedata = array('pa_hersteller' => array(
        name' => 'pa_hersteller',
        'value' => '',
        'is_visible' => '0',
        'is_taxonomy' => '1'
    ));
    
    update_post_meta(get_the_ID(), '_product_attributes', $thedata);
    

    希望对你有帮助:)

    【讨论】:

    • 你知道这是否递归工作。就像我务实地设置了很多属性一样。我可以使用 2 行及以下的内容来本质上说:“嘿,顺便说一下,我不久前更新了这个”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多