Продукты на моем сайте клиентов требуют определенных атрибутов, которые я добавил через Продукты -> Атрибуты в администрировании WordPress. В этом сценарии импорта я update_post_meta($post_id, $meta_key, $meta_value)
мне нужно использовать функцию update_post_meta($post_id, $meta_key, $meta_value)
для импорта соответствующих атрибутов и значений.
В настоящее время у меня есть такая функция:
update_post_meta( $post_id, '_product_attributes', array());
Однако я не уверен, как правильно передать атрибуты и их ценности?
Так что мне потребовалось некоторое время, чтобы понять это, но я, наконец, смог это сделать, написав следующую функцию:
// @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!
Я попробовал ответить Даниэлю, и это не сработало для меня. Возможно, код 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 как пользовательский атрибут, и добавить его в формальный мета как _материал. Это, в свою очередь, позволяет мне использовать другой фрагмент кода, поэтому функция поиска WooCommerce распространяется на мета-поля, то есть я могу искать материал в поле поиска WooCommerce и отображать все элементы с этим материалом.
Надеюсь, это полезно кому-то.
Я просто хотел указать, что ответ Ананда работал на меня (см. Комментарий к вопросу, выше). Более подробную информацию можно найти в этом ответе .
Ответ Дэниелса работает, не будет принимать решения о правильном или неправильном, однако, если вы хотите добавить значения в качестве таксономического термина по атрибутам, вам необходимо адаптировать код, как показано ниже (set is_taxonomy = 1). В противном случае Woocommerce видит это как обычное мета-поле (?). Он по-прежнему добавляет значение по атрибутам. Это будет работать только для строк. Для значений, которые являются массивами, код должен быть адаптирован.
Кроме того, он использует wp_set_object_terms, который также предлагает @Anand. Я использовал это, потому что вся документация, которую я мог найти, привела к тому, что это нужно было использовать. Однако, если вы используете только 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 & Anand. Это очень помогло мне.
Не знаю, является ли это «правильным» способом сделать это … Но мне нужна была функция добавления полей ретранслятора ACF с указанием значения даты в качестве атрибута post post, так что это была функция, с которой я столкнулся:
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('dm-Y', strtotime($d['date'])); } else{ $val .= date('dm-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); } } }
Надеюсь, это поможет кому-то.