Поддержка Проблемы и решения Как связать простые товары по цветам в WooCommerce?

  • Здравствуйте. Долгое время товары в интернет-магазине (WordPress и WooCommerce) были вариативными, что не мешало с помощью плагина сделать симпатичный выбор цвета с меняющимися изображениями.

    Появилась необходимость разделить вариативный товар на несколько простых, где каждая новая страница будет иметь свои описание, цвет, изображение и метаданные. При этом хотелось бы одну модель, которая раньше была вариативной, связать по цветам, чтобы при выборе цвета пользователь переходил на другую страницу. Допустим, по общему атрибуту на одной и той же модели будут выводиться общие цвета. Может как-то еще, с помощью плагина или хуков.

    Как быть? Спасибо.

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Здравствуйте! Вопрос решен?

    Здравствуйте. Вопрос не решен. На одном из форумов посоветовали обратиться к специалистам на платной основе.

    что-то вроде этого хотели? Пример

    • Ответ изменён 1 год, 11 месяцев назад пользователем alashgrand.

    Хотели вывести цвета, но чтобы каждый из них вел на страницу «связанного» товара (другой URL). А вот как связать все это автоматически — вопрос.

    Попробуйте вставить в function дочерней темы

    
    <?php
    /**
    * @version 1.0
    */
    /*
    Plugin Name: Hummel Color Upsells
    Description: Плагин для отображения товаров других расцветок товара.
    Author: Alashgrand
    Version: 1.0
    Author URI:
    */
    
    class Hummel_Color_Upsells_Plugin {
    
        private static $notices = array();
        
      public static function init() {
    
        register_activation_hook( __FILE__, array( __CLASS__, 'activate' ) );
        register_deactivation_hook( __FILE__, array( __CLASS__, 'deactivate' ) );
        register_uninstall_hook( __FILE__, array( __CLASS__, 'uninstall' ) );
    
        add_action( 'init', array( __CLASS__, 'wp_init' ) );
        add_action( 'admin_notices', array( __CLASS__, 'admin_notices' ) );
      }
    
      public static function wp_init() {
        $active_plugins = get_option( 'active_plugins', array() );
        $woocommerce_is_active = in_array( 'woocommerce/woocommerce.php', $active_plugins );
        if ( !$woocommerce_is_active )  {
          self::$notices[] = '<div class="error"><p><strong>Hummel Orders Exporter Plugin</strong>  требуется наличие активнокго плагина Woocommerce.</p></div>';
        } else {
    
          // добавляем обработчик 
                add_action( 'woocommerce_before_add_to_cart_form', array( __CLASS__, 'display_color_upsells' ), 10 );
     
            }
        }  
    
        /**
         * Выводит на фронт миниатюру этого же товар в другой расцветке
         */
        public static function display_color_upsells() {
            global $woocommere, $product;
    
            //error_log(__METHOD__ . PHP_EOL , 3, WP_PLUGIN_DIR . '/hummel-color-upsells/log.log');
    
            $sku = trim($product->get_sku());
            
            // исключаем наборы и товары без артикулов
            if ( !$sku || 'bndl' == substr( $sku, 0, 4 ) ) { return; }
    
            $article = substr( $sku, 0, 7 );
    
            $args = array(
                'post_type' => 'product',
                'post_status' => 'publish',
                'numberposts' => -1,
                'meta_query' => array( 
                    array(
                        'key' => '_sku',
                        'value' => $article,
                        'compare' => 'LIKE'
                    ))
            ) ;
            $clrposts = get_posts($args);
    
            if ( $clrposts ){
    
                echo '<p style="margin: 0px;"><strong>Цветовая палитра</strong></p>';
                echo '<div class="color-upsells" style="display:flex; display:-ms-flexbox;">';
    
          foreach( $clrposts as $clrpost ){ 
                    $prd = wc_get_product( $clrpost );
                    $color = substr($prd->get_sku(), 8, 4);
                    $imgcss = 'border: 0px solid black;';
                    if ( $sku == $prd->get_sku() ) { $imgcss = 'border: 1px solid black;'; }
                    $imgcss = $imgcss . ' margin: 2px; padding: 2px;';
                    
                    $html = '<a href="' . get_permalink( $clrpost ) . 
                            '" title="' . $color .
                            '" alt="' . esc_attr( get_the_title( $clrpost ) ) . 
                            '">' .  get_the_post_thumbnail($clrpost, array(45,45), array('style' => $imgcss)  )  .
                            '</a>';
                    echo $html;
                }
    
          echo '</div>';
        }
    
        }
        
        /**
       * Plugin display notices.
       * 
       */
      public static function admin_notices() { 
        if ( !empty( self::$notices ) ) {
          foreach ( self::$notices as $notice ) {
            echo $notice;
          }
        }
      }
    
        /**
       * Plugin activation work.
       * 
       */
      public static function activate() {
      }
    
      /**
       * Plugin deactivation.
       *
       */
      public static function deactivate() {
      }
    
      /**
       * Plugin uninstall. 
       *
       */
      public static function uninstall() {
      }    
    }
    Hummel_Color_Upsells_Plugin::init();
    

    К сожалению, попробую этот код только вечером. Спасибо большое за помощь!
    Скажите, а как у вас определяются товары одной модели?
    По моей схеме сравнивается одинаковые значения в атрибуте (название), потом выводятся разные значения цветов из другого атрибута.

    Попробовал. Я так понял, он выводит список товаров, имеющий схожий артикул (SKU). Так как дублировать их нельзя, то не совсем корректно работает плагин. Может я не так его использую.

    Назначаем одному товару артикул «Bu-66», второму «Bu-66-2». Первый в цветовой палитре выводит 2 значения, другой одно (свое же).

    Подскажите, что можно сделать в данном случае?

    Попробуй

    1. вставь в function дочерней темы:
    remove_action(‘woocommerce_after_single_product_summary’, ‘woocommerce_upsell_display’, 15);
    add_action(‘woocommerce_single_product_summary’, ‘woocommerce_upsell_display’, 15);

    2. в пользовательский CSS:

    .upsells .products .item-image img {
    border: 1px solid #e8e8e8;
    }
    .upsells .products .product .item-info {
    position: relative;
    display: none;
    }

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Тема «Как связать простые товары по цветам в WooCommerce?» закрыта для новых ответов.