Hacer un bucle personalizado de WooCommerce

5 minutos de lectura

Estoy usando un tema ya diseñado para wordpress, y ahora, en lugar de publicaciones de blog regulares, me gustaría mostrar productos de WooCommerce (que son tipos de publicaciones personalizadas, supongo).

Esta es la consulta actual con bucle de visualización:

<?php 
                $args = array(
                    //'posts_per_page' => '2',
                    'paged' => get_query_var('paged')
                );
                $homepage_query = new WP_Query($args);
            ?>
            <?php //query_posts('posts_per_page=4&paged='.get_query_var('paged')); ?>
            <?php if ( have_posts() ) : ?>  
                <?php while ( $homepage_query->have_posts() ) : $homepage_query->the_post(); ?>
                    <?php if($style == 'blog_style') { ?>
                    <div id="blog-style" class="post-box">
                        <?php get_template_part('content', 'blog'); ?>
                    </div>
                    <?php } else { ?>
                    <div class="post-box grid_4 <?php aero_post_box_class(); ?>">
                        <?php get_template_part('content', ''); ?>
                    </div>
                    <?php } ?>
                <?php endwhile; ?>

¿Hay alguna manera de agregar opciones a $args Entonces, ¿el bucle muestra los productos de WooCommerce? También estoy usando la paginación con este bucle, que se requiere en este proyecto, por eso es importante usar este bucle.

Debería poder acceder a los productos a través del bucle, configurando el post_type argumento a product:

<?php

// Setup your custom query
$args = array( 'post_type' => 'product', ... );
$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <a href="https://stackoverflow.com/questions/13267124/<?php echo get_permalink( $loop->post->ID ) ?>">
        <?php the_title(); ?>
    </a>

<?php endwhile; wp_reset_query(); // Remember to reset ?>

  • Sí, ahora está en bucle, ¡genial!

    – jOpacic

    8 de noviembre de 2012 a las 7:43

  • Si desea obtener el precio, etc., es posible que desee hacer: $product = get_product($loop->post); y luego usarlo como WC_Product se utiliza: echo $product->get_price_html(); etc.

    – Ciántico

    11 de diciembre de 2013 a las 16:33


  • get_product() está obsoleto ahora, Use $producto = new WC_Product($loop->post->ID);

    – Maidul

    21 de julio de 2020 a las 11:57

  • No debería usar WP_Query para un bucle WC, debería usar WC_product_Query

    – Desarrollador

    22 de mayo a las 16:44

avatar de usuario
cfx

Esta es la forma correcta de volver a crear y personalizar el ciclo del producto WooCommerce:

  if(!function_exists('wc_get_products')) {
    return;
  }

  $paged                   = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1; // if your custom loop is on a static front page then check for the query var 'page' instead of 'paged', see https://developer.wordpress.org/reference/classes/wp_query/#pagination-parameters
  $ordering                = WC()->query->get_catalog_ordering_args();
  $ordering['orderby']     = array_shift(explode(' ', $ordering['orderby']));
  $ordering['orderby']     = stristr($ordering['orderby'], 'price') ? 'meta_value_num' : $ordering['orderby'];
  $products_per_page       = apply_filters('loop_shop_per_page', wc_get_default_products_per_row() * wc_get_default_product_rows_per_page());

  $products_ids            = wc_get_products(array(
    'status'               => 'publish',
    'limit'                => $products_per_page,
    'page'                 => $paged,
    'paginate'             => true,
    'return'               => 'ids',
    'orderby'              => $ordering['orderby'],
    'order'                => $ordering['order'],
  ));

  wc_set_loop_prop('current_page', $paged);
  wc_set_loop_prop('is_paginated', wc_string_to_bool(true));
  wc_set_loop_prop('page_template', get_page_template_slug());
  wc_set_loop_prop('per_page', $products_per_page);
  wc_set_loop_prop('total', $products_ids->total);
  wc_set_loop_prop('total_pages', $products_ids->max_num_pages);

  if($products_ids) {
    do_action('woocommerce_before_shop_loop');
    woocommerce_product_loop_start();
      foreach($products_ids->products as $featured_product) {
        $post_object = get_post($featured_product);
        setup_postdata($GLOBALS['post'] =& $post_object);
        wc_get_template_part('content', 'product');
      }
      wp_reset_postdata();
    woocommerce_product_loop_end();
    do_action('woocommerce_after_shop_loop');
  } else {
    do_action('woocommerce_no_products_found');
  }

Usando el código anterior, personalizaría el wc_get_products() argumentos para obtener los ID de los productos que desea (si tiene criterios específicos). Una vez que ese código esté en su lugar, todas las funciones de un bucle nativo de WooCommerce estarán disponibles para usted: paginación, pedidos, etc. Este método es superior a WP_Query y get_posts() porque esos dos métodos pueden romper.

He escrito una publicación de blog más detallada sobre los bucles personalizados de WooCommerce aquí: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

  • ¿Qué pasa si el bucle es para infinite scrolling y no por pagination? Habrá productos duplicados para mostrar.

    –Zian Tap Chan

    3 de junio de 2020 a las 7:59

  • Si entiende lo que está pasando aquí, entonces no debería ser una exageración adaptar esto al desplazamiento infinito. Sin embargo, solo porque Ud. pueden hacer algo, no significa que debas!

    – CFX

    3 de junio de 2020 a las 13:16

  • Si wc_get_products() se llama con 'return' => 'ids' el ciclo debe comenzar como foreach($products_ids as $featured_product) { en vez de foreach($products_ids->products as $featured_product) {.

    – sbnc.eu

    21 abr a las 13:18

avatar de usuario
descifrador

También puede obtener Categoría usando este código

       $terms = get_terms('product_cat');

       foreach ($terms as $term) {
         $term_link =  get_term_link( $term, 'product_cat' );
         echo '<li><a href="' . $term_link . '">' . $term->name . '</a></li>';
       }

Si desea solo la categoría principal, entonces

wp_list_categories('taxonomy=product_cat&orderby=order&title_li=&depth=1'); 

¿Ha sido útil esta solución?