Ответы пользователя по тегу WooСommerce
  • Как в Woocommerce вывести вариации отдельными товарами с помощью php?

    @NickToot
    web developer
    Можно изменить стандартный запрос получения товаров WooCommerсe (добавьте код в functions.php или в отдельный файл который подключается в него):
    add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' );
    function custom_woocommerce_product_query ($q) {
      $q->set( 'post_type', array( 'product', 'product_variation' ) );
      return $q;
    }

    У вас выведутся все товары и все их вариации, я думаю это будет избыточно, тогда нужно изменить этот запрос под себя, условиями или как-нибудь еще если вы умеете. Я добавил галочку для вариаций отображать в каталоге или нет и получаю только отмеченные товары, простые товары при этом запросе пропадают, мне этого было достаточно:
    /**
     *  Добавление своего поля для вариаций
     */
    add_action( 'woocommerce_variation_options', 'add_custom_field_to_variations', 10, 3 );
    function add_custom_field_to_variations( $loop, $variation_data, $variation ) {
    $checked = get_post_meta( $variation->ID, 'catalog_visibility', true ) ) ? 'checked="checked"' : '';
    ?>
      <label>
        Показать в каталоге?
        <input type="checkbox" class="checkbox" name="catalog_visibility[<?= $loop ?>]" <?= $checked; ?>/>
      </label>
    <?php
    }
    
    /**
     *  Сохранение в админке своего поля для вариаций
     */
    add_action( 'woocommerce_save_product_variation', 'save_custom_field_variations', 10, 2 );
    function save_custom_field_variations( $variation_id, $i ) {
      $catalog_visibility = $_POST['catalog_visibility'][$i];
      if ( $catalog_visibility ) {
        update_post_meta( $variation_id, 'catalog_visibility', true );
      } else {
        delete_post_meta( $variation_id, 'catalog_visibility' );
      }
    }
    
    /**
     *  Добавление вариативных товаров в каталог
     */
    add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' );
    function custom_woocommerce_product_query ($q) {
      // Добавление вариаций в каталог
      $q->set( 'post_type', array( 'product', 'product_variation' ) );
      // Оставляем только вариации в каталоге
      $meta_query = (array) $q->get( 'meta_query' );
      $meta_query[] = array(
        'key'      => 'catalog_visibility',
        'value'    => '1',
      );
      $q->set( 'meta_query', $meta_query );
      return $q;
    }
    Ответ написан