2016-10-03 6 views
2

У меня есть довольно большая база данных продуктов на веб-странице. Эта веб-страница была написана на PHP, и теперь мне нужно перенести ее базу данных на сайт Wordpress (WooCommerce). Я уже понял, как добавить продукты. Я сделал PHP-файл (за пределами Wordpress) с этим заголовком, так что я могу использовать все функции WordPress:Как добавить новый пользовательский атрибут продукта в WooCommerce программно?

include('../wp/wp-load.php'); 
require_once('../wp/wp-admin/includes/media.php'); 
require_once('../wp/wp-admin/includes/file.php'); 
require_once('../wp/wp-admin/includes/image.php'); 

Во-первых, я получаю все продукты из старой базы данных в PHP массив $ элементов, а затем цикл через этот массив, используя цикл foreach. Внутри цикла у меня есть этот код:

$user_id = get_current_user(); 
$post_id = wp_insert_post(array(
    'post_author' => $user_id, 
    'post_title' => $item['termek'], 
    'post_content' => $item['reszletes_leiras'], 
    'post_status' => 'publish', 
    'post_type' => "product", 
)); 
wp_set_object_terms($post_id, 'simple', 'product_type'); 
update_post_meta($post_id, '_visibility', 'visible'); 
update_post_meta($post_id, '_stock_status', 'instock'); 
update_post_meta($post_id, 'total_sales', '0'); 
update_post_meta($post_id, '_downloadable', 'no'); 
update_post_meta($post_id, '_virtual', 'no'); 
update_post_meta($post_id, '_regular_price', $item['brutto_ar']); 
update_post_meta($post_id, '_sale_price', $item['brutto_ar']); 
update_post_meta($post_id, '_purchase_note', ''); 
update_post_meta($post_id, '_featured', 'no'); 
update_post_meta($post_id, '_weight', ''); 
update_post_meta($post_id, '_length', ''); 
update_post_meta($post_id, '_width', ''); 
update_post_meta($post_id, '_height', ''); 
update_post_meta($post_id, '_sku', $item['id']); 
update_post_meta($post_id, '_product_attributes', array()); 
update_post_meta($post_id, '_sale_price_dates_from', ''); 
update_post_meta($post_id, '_sale_price_dates_to', ''); 
update_post_meta($post_id, '_price', ''); 
update_post_meta($post_id, '_sold_individually', ''); 
update_post_meta($post_id, '_manage_stock', 'no'); 
update_post_meta($post_id, '_backorders', 'no'); 
update_post_meta($post_id, '_stock', ''); 

Моя проблема заключается в том, что у меня есть массив в $ пункт [ «parameterek»], который выглядит Kile это:

["Some custom attribute"] => (string)"Something" 
["Another custom attribute"] => (string)"Something else" 

Теперь мне нужно добавить эти поля для продуктов как пользовательские атрибуты. Ключ массива - это имя, а значение - это ... значение, конечно. Я пытался сделать это таким образом, но этот код кажется не делать ничего:

foreach(array_keys($item['parameterek']) as $key) { 
    register_attribute($key); 
} 
wproduct_set_attributes($post_id, $item['parameterek']); 

function register_attribute($name){ 
    $paname = 'pa_' . htmlspecialchars(stripslashes($name)); 
    $permalinks = get_option('woocommerce_permalinks'); 
    $taxonomy_data = array(
         'hierarchical'   => false, 
         'update_count_callback' => '_update_post_term_count', 
         'labels'    => array(
           'name'    => $name, 
           'singular_name'  => $name, 
           'search_items'  => sprintf(__('Search %s', 'woocommerce'), $label), 
           'all_items'   => sprintf(__('All %s', 'woocommerce'), $label), 
           'parent_item'  => sprintf(__('Parent %s', 'woocommerce'), $label), 
           'parent_item_colon' => sprintf(__('Parent %s:', 'woocommerce'), $label), 
           'edit_item'   => sprintf(__('Edit %s', 'woocommerce'), $label), 
           'update_item'  => sprintf(__('Update %s', 'woocommerce'), $label), 
           'add_new_item'  => sprintf(__('Add New %s', 'woocommerce'), $label), 
           'new_item_name'  => sprintf(__('New %s', 'woocommerce'), $label) 
          ), 
         'show_ui'   => false, 
         'query_var'   => true, 
         'rewrite'   => array(
          'slug'   => empty($permalinks['attribute_base']) ? '' : trailingslashit($permalinks['attribute_base']) . sanitize_title($name), 
          'with_front' => false, 
          'hierarchical' => true 
         ), 
         'sort'    => false, 
         'public'   => true, 
         'show_in_nav_menus' => false, 
         'capabilities'  => array(
          'manage_terms' => 'manage_product_terms', 
          'edit_terms' => 'edit_product_terms', 
          'delete_terms' => 'delete_product_terms', 
          'assign_terms' => 'assign_product_terms', 
         ) 
        ); 
    register_taxonomy($paname, array('product'), $taxonomy_data); 
} 

function wcproduct_set_attributes($post_id, $attributes) { 
    $i = 0; 
    // Loop through the attributes array 
    foreach ($attributes as $name => $value) { 
     $product_attributes[$i] = array (
      'name' => 'pa_' . htmlspecialchars(stripslashes($name)), // set attribute name 
      'value' => $value, // set attribute value 
      'position' => 1, 
      'is_visible' => 1, 
      'is_variation' => 0, 
      'is_taxonomy' => 1 
     ); 

     $i++; 
    } 
    update_post_meta($post_id, '_product_attributes', $product_attributes); 
} 

Так что мой вопрос: Что это самый простой способ добавить пользовательские атрибуты продукта из массива с помощью PHP?

ответ

5

Я недавно пришел с той же проблемой, что и вы. Сначала вам нужно подумать о параметрах каждого атрибута.

is_visible сделает атрибут видимым на странице продукта, если установлено в 1, и видны только на странице продукта редактирования, если установлено в 0.

is_variation используется для создания вариаций одного и того же продукта для указанных пользовательского атрибута. Если установлено значение 1, указывает на WooCommerce, что существуют вариации, так что она будет выглядеть на должности с 'post_type' => "product_variation", которые связаны с исходной записи продукта через атрибут «post_parent» установить в качестве исходного продукта POST_ID как 'post_parent' => $original_post_id

is_taxonomy используется для категоризации продукта, основанного на указанном пользовательском атрибуте. Например, подумайте, что в одежде, являющейся продуктом для продажи, вы создаете пользовательский атрибут, называемый gender, для категоризации продуктов в зависимости от пола.

Как кажется, читая ваш вопрос, вам просто нужно просто пользовательские атрибуты со значениями строк, видимых на странице продукта:

["Some custom attribute"] => (string)"Something" 
["Another custom attribute"] => (string)"Something else" 

поэтому способ реализации вашего цикла будет что-то вроде этого:

[loop] 

$user_id = get_current_user(); 
$post_id = wp_insert_post(array(
    'post_author' => $user_id, 
    'post_title' => $item['termek'], 
    'post_content' => $item['reszletes_leiras'], 
    'post_status' => 'publish', 
    'post_type' => "product", 
)); 
wp_set_object_terms($post_id, 'simple', 'product_type'); 
update_post_meta($post_id, '_visibility', 'visible'); 
update_post_meta($post_id, '_stock_status', 'instock'); 
update_post_meta($post_id, 'total_sales', '0'); 
update_post_meta($post_id, '_downloadable', 'no'); 
update_post_meta($post_id, '_virtual', 'no'); 
update_post_meta($post_id, '_regular_price', $item['brutto_ar']); 
update_post_meta($post_id, '_sale_price', $item['brutto_ar']); 
update_post_meta($post_id, '_purchase_note', ''); 
update_post_meta($post_id, '_featured', 'no'); 
update_post_meta($post_id, '_weight', ''); 
update_post_meta($post_id, '_length', ''); 
update_post_meta($post_id, '_width', ''); 
update_post_meta($post_id, '_height', ''); 
update_post_meta($post_id, '_sku', $item['id']); 
update_post_meta($post_id, '_product_attributes', array()); 
update_post_meta($post_id, '_sale_price_dates_from', ''); 
update_post_meta($post_id, '_sale_price_dates_to', ''); 
update_post_meta($post_id, '_price', ''); 
update_post_meta($post_id, '_sold_individually', ''); 
update_post_meta($post_id, '_manage_stock', 'no'); 
update_post_meta($post_id, '_backorders', 'no'); 
update_post_meta($post_id, '_stock', ''); 
$i = 0; 
$product_attributes = array(); 
foreach($item['parameterek'] as $key => $value){ 
    $product_attributes[sanitize_title($key)] = array (
      'name' => wc_clean($key), // set attribute name 
      'value' => $value, // set attribute value 
      'position' => $i, 
      'is_visible' => 1, 
      'is_variation' => 0, 
      'is_taxonomy' => 0 
     ); 
    $i++; 
} 
update_post_meta($post_id, '_product_attributes', $product_attributes); 
[/loop] 

В случае, если один из ваших продуктов имеет варианты реализации, сначала создайте базовый продукт, как вы уже делаете. Затем сохранение указанного пользовательского атрибута в качестве варианта.

$attr[sanitize_title($custom_attribute_name)] = array(
    'name'=> wc_clean($custom_attribute_name), 
    'value'=> $string_custom_attr_values, 
    'position' => $position, 
    'is_visible' => 1, 
    'is_variation' => 1, 
    'is_taxonomy' => 0 
); 

Где $ string_custom_attr_values ​​является строка значений вариаций, разделенных | ,Например, пользовательский атрибут размеров для вариантов затем $string_custom_attr_values = 'S|M|L|XL';

И тогда вам будет нужен новый цикл внутри одного у вас уже есть для $items создавать варианты этого продукта, то, как это после предыдущего примера изменения размеров:

$string_custom_attr_values = 'S|M|L|XL'; 
$arr_custom_attr_values = explode("|", $string_custom_attr_values); 
$total_variations = count($arr_custom_attr_values); 
$variation_post_id = $post_id; 
for($i = 1; $i <= $total_variations; $i++) { 
    $variation_post_id += $i; 
    $variation_post = array(
     'post_title' => 'Variation #' . $variation_post_id . ' of ' . $item['termek'], 
     'post_name'  => 'product-' . $variation_post_id . '-variation', 
     'post_status' => 'publish', 
     'post_parent' => $post_id, 
     'post_type'  => 'product_variation', 
     'guid'   => home_url() . '/product_variation/product-' . $variation_post_id . '-variation', 
     'menu_order' => $i 
); 

    // Insert the variation post into the database 
    $variation_post_id = wp_insert_post($variation_post); 
    update_post_meta($variation_post_id, 'attribute_'.$custom_attribute_name, $arr_custom_attr_values[$i-1]); 

    /*Rest of the post_meta like in the base product*/ 

}//end for 

Надежда у меня есть было достаточно ясно.

+0

Спасибо за ваш ответ, это работает, но у меня есть небольшая проблема с этим. wc_clean, кажется, возвращает пустую строку, если в названии есть акцентированный chararcter. Если я удалю wc_clean из кода, он не включит ничего. Какие-либо предложения? (Теперь это выглядит на странице продукта: https://s21.postimg.org/akc7vsllz/image.png) –

+0

wc_clean использует sanitize_text_field. Вы можете проверить здесь функцию: http://woocommerce.wp-a2z.org/oik_api/sanitize_text/ Отладка, чтобы проверить, не применяете ли вы функцию stripslash или символьного кодирования, которая предотвращает работу wc_clean. – Dez

+1

Наконец, я могу заставить его работать с помощью wc_clean (htmlentities ($ key, 0, «ISO8859-1»)); Теперь он отлично работает, еще раз спасибо за ваш быстрый ответ! :) (Результаты: https://s10.postimg.org/v9ft0g14p/image.png) –

 Смежные вопросы

  • Нет связанных вопросов^_^