WordPress: сохранение таксономии на основе значения другой таксономии

#wordpress #taxonomy-terms #add-action

Вопрос:

Мы строим магазин одежды. Продукты, которые будут загружены, могут иметь размеры этикеток из разных стран, и поэтому у нас есть две таксономии размеров: product_size и product_size_uk.

Я пытаюсь установить размер Великобритании на основе международного размера в момент сохранения/обновления продукта и запускаю переключатель, чтобы установить переменную в идентификатор таксономии размера Великобритании и использовать wp_set_object_terms. Но это не работает:

 add_action( 'save_post', 'save_uk_size' );
function save_uk_size( $post_id ) {
   if ( $post->post_type == 'product' ) {

        $post = get_post($post_id);
        $terms = wp_get_post_terms( $post->ID, 'product_size', array( 'fields' => 'all' ) );
            if ( $terms ) {
                $prod_size_int = $terms[0]->slug;
            }

            switch ($prod_size_int) {
                ...
                case "FR-36":
                  $prod_size_uk = 805;
                  break;
                case "FR-38":
                  $prod_size_uk = 806;
                  break;
                ...
                }

     wp_set_object_terms($post_id, $prod_size_uk, 'product_size_uk');
   }

}
 

Кто-нибудь может направить меня в правильном направлении? Спасибо!

Ответ №1:

  1. Сначала вам необходимо установить плагин Advanced Custom Fields
  2. Затем для таксономии productsize мы создаем поле таксономии (productsize_uk).

Теперь на страницах таксономии productsize в панели администратора есть поле, в котором мы можем выбрать, какой productsize_uk соответствует данной таксономии.

3.Затем мы должны выбрать product_size_uk, подходящий для всех размеров.

А затем этот код

 add_action( 'save_post_product', 'product_save_new_term' );
function product_save_new_term($post_id) {
    
        remove_action( 'save_post_product', 'product_save_new_term' );    

        $terms = wp_get_object_terms( $post_id, 'product_size' );
        
        $term_id = $terms[0]->term_id;
        
        if($term_id != "") {        

        $key_for_field = 'product_size_' . $term_id;
        
        $product_size_uk_value = get_field( 'product_size_uk', $key_for_field );
        
        wp_set_object_terms($post_id, $product_size_uk_value, 'product_size_uk');
        
        clean_post_cache( $post_id );
        
        } else {
            
        wp_delete_object_term_relationships( $post_id, 'product_size_uk' );
        
        }
        
        
        add_action( 'save_post_product', 'product_save_new_term' );
}
 

Или, если вы не хотите иметь элементы управления для сопоставления размеров в панели администратора, и вам проще написать все в коде.

 add_action( 'save_post_product', 'product_save_new_term' );
function product_save_new_term($post_id) {

       $data_array = array(
       "product_size_term_id" => "product_size_uk_term_id",
       "product_size_term_id2" => "product_size_uk_term_id2",
       "product_size_term_id3" => "product_size_uk_term_id3",
       );
       
        remove_action( 'save_post_product', 'product_save_new_term' );


        $terms = wp_get_object_terms( $post_id, 'product_size' );
        
        $term_id = $terms[0]->term_id;
        
        if($term_id != "") {    

        
        
        $product_size_uk_value = $data_array[$term_id];
        if($product_size_uk_value !="") {
        wp_set_object_terms($post_id, $product_size_uk_value, 'product_size_uk');
        }
        clean_post_cache( $post_id );
        
        } else {
            
        wp_delete_object_term_relationships( $post_id, 'product_size_uk' );
        
        }
        
        
        add_action( 'save_post_product', 'product_save_new_term' );
}
 

Комментарии:

1. Большое спасибо! Я попробую сделать это сегодня. Очень любезно с вашей стороны.

2. Я попробовал это (второй набор кода), и это не работает для меня. Может ли он работать со слизняками вместо идентификаторов? Кроме того, должно $terms = wp_get_object_terms( $post_id, 'product_size' ); быть для «продукта» вместо «produc_t_size»?

3. wp_get_object_terms нужны 2 переменные, $post_id и имя таксономии. нам здесь не нужно имя post_type. Мы можем использовать slug только в том случае, если ваша таксономия не является иерархической. Я протестировал этот код на своей демо-версии, его работу.