2016-05-18 4 views
2

Я пытаюсь добавить заказ Свойства товара программно под полем URL, как показано на рисунке: enter image description hereWooCommerce программно настраивает поля пользовательских атрибутов?

я был в состоянии сделать это, используя следующий код, используя transition_post_status действие:

add_action('transition_post_status', 'wpa_120062_new_product', 10, 3); 

function wpa_120062_new_product($new_status, $old_status, $post){ 

    if(function_exists('wc_get_attribute_taxonomies') && ($attribute_taxonomies = wc_get_attribute_taxonomies())) { 

     $defaults = array(); 

     foreach ($attribute_taxonomies as $key=>$tax) { 


       $name = wc_attribute_taxonomy_name($tax->attribute_name); 

       $value= get_post_meta($post->ID , '_product_attributes'); 

       $defaults[ $name ] = array (
        'name' => $name, 

        'position' => $key+1, 
        'is_visible' => 1, 
        'is_variation' => 1, 
        'is_taxonomy' => 1, 
       ); 

      update_post_meta($post->ID , '_product_attributes', $defaults); 

     } 
    } 
} 

Но проблема в том, что крючок transition_post_status не работает отлично, поскольку он иногда не полностью заполняет поля.

Я также пытался использовать wp действие, но не успех.

Может кто-нибудь предложить, как я могу заставить этот код работать, но используя другой Крюк?

ответ

1

Там ISN "т другого крюка для этой цели, которые вы могли бы использовать. Но я добавил к вашей функции недостающих переменных global $post и условные, который фильтрует только новые созданные опубликованные продукты.

add_action('transition_post_status', 'wpa_120062_new_product', 10, 3); 
function wpa_120062_new_product($new_status, $old_status, $post){ 

    global $post; 
    if($old_status != 'publish' && $new_status == 'publish' && !empty($post->ID) 
    && in_array($post->post_type, array('product'))) { 

     if(function_exists('wc_get_attribute_taxonomies') && ($attribute_taxonomies = wc_get_attribute_taxonomies())) { 

      $defaults = array(); 
      foreach ($attribute_taxonomies as $key=>$tax) { 
       $name = wc_attribute_taxonomy_name($tax->attribute_name); 
       $value= get_post_meta($post->ID , '_product_attributes'); 
       $defaults[ $name ] = array (
        'name' => $name, 
        'position' => $key+1, 
        'is_visible' => 1, 
        'is_variation' => 1, 
        'is_taxonomy' => 1, 
       ); 
       update_post_meta($post->ID , '_product_attributes', $defaults); 
      } 
     } 
    } 
} 

Кроме того (если это необходимо, но я не уверен), вы можете попытаться использовать крючок wp_loaded, чтобы вызвать transition_post_status один раз, потому что этот крючок запускается после того, как WordPress, все плагины и тема полностью загружены и созданы. Это можно сделать так:

if(function_exists('wpa_120062_new_product') { 
    add_action('wp_loaded', 'my_wp_is_loaded'); 
    function my_wp_is_loaded(){ 
     do_action ('transition_post_status'); 
    } 
} 
Смежные вопросы