Пользовательские атрибуты продукта пустые, хотя я добавляю его [дубликат]

Чтобы отредактировать код и исправить ошибку:

while True:
    try:
       age = int(input("Please enter your age: "))
       if age >= 18: 
           print("You are able to vote in the United States!")
           break
       else:
           print("You are not able to vote in the United States.")
           break
    except ValueError:
       print("Please enter a valid response")
8
задан Daniel 3 May 2014 в 13:20
поделиться

5 ответов

Правильно, поэтому мне потребовалось некоторое время, чтобы понять это, но я, наконец, смог это сделать, написав следующую функцию:

// @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!

14
ответ дан Daniel 21 August 2018 в 00:58
поделиться

Я просто хотел указать, что ответ Ананда работал для меня (см. комментарий к вопросу, выше). Более подробно можно найти в этот ответ .

0
ответ дан Community 21 August 2018 в 00:58
поделиться

Не знаю, является ли это «правильным» способом сделать это ... Но мне нужна была функция добавления полей ретранслятора ACF с указанием значения даты в качестве атрибута в post save, так что это была функция, которую я придумал с:

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);
       }
    }
}

Надеюсь, это поможет кому-то.

0
ответ дан john 21 August 2018 в 00:58
поделиться

Я попробовал ответить Даниэлю, и это не сработало для меня. Возможно, код 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 и отображать все элементы с этим материалом.

Надеюсь, это полезно кому-то.

6
ответ дан Tizzy 21 August 2018 в 00:58
поделиться

Ответ Дэниелса работает, не будет решать, правильно или неправильно, однако, если вы хотите добавить значения как термин таксономии по атрибутам, вам необходимо адаптировать код, как показано ниже (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 & amp; Ананд. Это очень помогло мне.

1
ответ дан user 21 August 2018 в 00:58
поделиться
  • 1
    Привет, это сработало для меня, но, к сожалению, оно удаляет любые существующие атрибуты. Как мне получить его только для обновления атрибута, который мне нужен? – TemiGiwa 28 January 2018 в 08:17
Другие вопросы по тегам:

Похожие вопросы: