Wordpress Woocommerce - 使用update_post_meta添加产品属性

时间:2014-05-03 12:20:46

标签: php wordpress woocommerce

我客户网站上的产品需要我通过产品 - >添加的某些属性。 Wordpress管理中的属性。在我编写的导入脚本中,我需要使用函数update_post_meta($post_id, $meta_key, $meta_value)来导入适当的属性和值。

目前我的功能如下:

update_post_meta( $post_id, '_product_attributes', array());

但是我不确定如何正确传递属性及其值?

5 个答案:

答案 0 :(得分:14)

是的,所以我花了一段时间才弄清楚自己,但我终于设法通过编写以下功能来实现这一目标:

// @param int $post_id - The id of the post that you are setting the attributes for
// @param array[] $attributes - This needs to be an array containing ALL your attributes so it can insert them in one go
function wcproduct_set_attributes($post_id, $attributes) {
    $i = 0;
    // Loop through the attributes array
    foreach ($attributes as $name => $value) {
        $product_attributes[$i] = array (
            'name' => htmlspecialchars( stripslashes( $name ) ), // set attribute name
            'value' => $value, // set attribute value
            'position' => 1,
            'is_visible' => 1,
            'is_variation' => 1,
            'is_taxonomy' => 0
        );

        $i++;
    }

    // Now update the post with its new attributes
    update_post_meta($post_id, '_product_attributes', $product_attributes);
}

// Example on using this function
// The attribute parameter that you pass along must contain all attributes for your product in one go
// so that the wcproduct_set_attributes function can insert them into the correct meta field.
$my_product_attributes = array('hdd_size' => $product->hdd_size, 'ram_size' => $product->ram_size);

// After inserting post
wcproduct_set_attributes($post_id, $my_product_attributes);

// Woohay done!

我希望这个功能可以帮助其他人,如果他们需要在WooCommerce中以编程方式导入多个属性!

答案 1 :(得分:6)

我试过丹尼尔的答案,但这对我没用。可能是Wordpress / Woocommerce代码已经发生变化,或者我可能不太明白该怎么做,但无论哪种方式代码都没有为我做任何事情。然而,在使用它作为基础的大量工作之后,我想出了这段代码并将其放在我的主题functions.php上:

function wcproduct_set_attributes($id) {

    $material = get_the_terms( $id, 'pa_material');

    $material = $material[0]->name;

    // Now update the post with its new attributes
    update_post_meta($id, '_material', $material);

}

// After inserting post
add_action( 'save_post_product', 'wcproduct_set_attributes', 10);

有了这个,我可以将我在WooCommerce安装中设置为“材料”的内容作为自定义属性,并将其添加到正式元作为_material。这反过来允许我使用另一段代码,因此WooCommerce搜索功能扩展到元字段,这意味着我可以在WooCommerce搜索字段中搜索材料,并显示包含该材料的所有项目。

我希望这对某人有用。

答案 2 :(得分:1)

@ Daniels的回答是有效的,不会决定对错,但是如果你想在属性下添加值作为分类术语,你必须调整代码如下(set is_taxonomy = 1)。否则Woocommerce将其视为自定义元字段(?)。它仍然在属性下添加值。这只适用于字符串。对于数组值,必须调整代码。

此外,它还使用@Anand建议的wp_set_object_terms。我正在使用它,因为我能找到的所有文档都相信必须使用它。但是,如果只使用wp_set_object_terms,则无法在编辑产品屏幕中看到属性。使用来自两个答案的信息和阅读主题得到了解决方案。

您需要调整产品变体等代码。

/*
 * Save Woocommerce custom attributes
 */

function save_wc_custom_attributes($post_id, $custom_attributes) {
    $i = 0;
    // Loop through the attributes array
    foreach ($custom_attributes as $name => $value) {
        // Relate post to a custom attribute, add term if it does not exist
        wp_set_object_terms($post_id, $value, $name, true);
        // Create product attributes array
        $product_attributes[$i] = array(
            'name' => $name, // set attribute name
            'value' => $value, // set attribute value
            'is_visible' => 1,
            'is_variation' => 0,
            'is_taxonomy' => 1
        );
        $i++;
    }
    // Now update the post with its new attributes
    update_post_meta($post_id, '_product_attributes', $product_attributes);
}

然后调用函数:

   $custom_attributes = array('pa_name_1' => $value_1, 'pa_name_2' => $value_2, 'pa_name_3' => $value_3);
   save_wc_custom_attributes($post_id, $custom_attributes);

感谢您发布代码Daniel&阿南德。它给了我很多帮助。

答案 3 :(得分:0)

我只是想指出@Anand的回答对我有用(见上面的问题评论)。更多细节可以在this answer中找到。

答案 4 :(得分:0)

不知道这是否是“正确”的方法...但是我需要一个函数来添加带有日期值的ACF转发器字段作为保存后的属性,所以这就是我提出的功能用:

add_action( 'save_post', 'ed_save_post_function', 10, 3 );

function ed_save_post_function( $post_ID, $post, $update ) {
  //print_r($post);
  if($post->post_type == 'product')
    {
     $dates = get_field('course_dates', $post->ID);
     //print_r($dates);
     if($dates)
       {
        $date_arr = array();
        $val = '';
        $i = 0;
        foreach($dates as $d)
               {
                 if($i > 0)
                   {
                    $val .= ' | '.date('d-m-Y', strtotime($d['date']));   
                   }
               else{
                    $val .= date('d-m-Y', strtotime($d['date']));
                   } 
                 $i++;  
               }
            $entry = array(
                           'course-dates' => array(
                                                   'name' => 'Course Dates',
                                                   'value' => $val,
                                                   'position' => '0',
                                                   'is_visible' => 1,
                                                   'is_variation' => 1,
                                                   'is_taxonomy' => 0
                                                  )
                          );
                update_post_meta($post->ID, '_product_attributes', $entry);
       }
    }
}

希望这有助于某人。