¿Cómo personalizar productos relacionados con woocommerce? [cerrado]

14

Tengo las siguientes líneas de código en mi sitio web que mostrarán los productos relacionados en la parte inferior de mi página de producto único en WooCommerce ...

funciones.php:

// display upsells and related products within dedicated div with different column and number of products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

Como muestra 4 productos que se han categorizado con el mismo nombre, ¿cómo modificaría lo anterior para mostrar las etiquetas relacionadas ?

Por ejemplo, tengo una categoría de producto llamada 'Automotriz' y dentro de esta categoría, hay algunas etiquetas: 'Holden', 'Ford', 'Toyota', 'Nissan', etc.

Me gustaría que mostrara 4 productos en la parte inferior, relacionados con la etiqueta del producto que el usuario está viendo actualmente.

usuario1752759
fuente

Respuestas:

29

En primer lugar , no puede lograr de inmediato el objetivo que describió con el código que muestra en su pregunta. Para entender por qué no hay un enfoque directo con ese código, debe echar un vistazo a lo que está utilizando woocommerce_related_products(), para hacer lo que ha hecho hasta ahora.

En segundo lugar , debe comprenderlo, porque de lo contrario no podrá hacer una pregunta puntual, que debería ser su objetivo, para asegurarse de obtener una respuesta. Además de eso hay que tener en cuenta que el desarrollo de Wordpress tiene su conjunto alcance primaria en cuestiones relacionados con el núcleo de WordPress - Si usted está interesado, esto está bajo discusión sobre Wordpress Desarrollo del Meta , un tema específico siendo Nuestros wooes y futuro de los plugins de plataforma en WPSE . Entonces, si está haciendo preguntas sobre complementos, como woocommerce, debe desglosarlo para que esté lo más relacionado posible con las funciones principales, vea el siguiente punto, ya que no puede esperar que las personas conozcan todos los detalles de cada complemento que Estás usando.

En tercer lugar , ahora profundicemos en lo que está sucediendo. Como dijiste, estás usando woocommerce_related_products()ahora. Si observa la fuente, verá que esta función la utiliza woocommerce_get_template()para obtener la related.phpplantilla. woocommerce_get_template()nuevamente utiliza woocommerce_locate_template()para localizar la plantilla, este último lo hace haciendo uso de la función central de wordpress locate_template().
Ahora hay una conexión de regreso al núcleo, lo que lleva a la comprensión de que las funciones mencionadas anteriormente, y con suerte inspeccionadas, son esencialmente envoltorios para extender la funcionalidad del núcleo. Otra cosa que quedó clara al analizar las dependencias de la funcionalidad es que, lo que dije antes, necesita un enfoque diferente para lograr su objetivo, porque woocommerce_related_products(), ahora innegablemente obvio, no es el correcto.
Si me siguió con mis explicaciones y ha leído detenidamente hasta ahora, se dio cuenta de que related.phpcontiene lo que está buscando. Estoy especialmente hablando de la get_related()función, que incluye el woocommerce_product_related_postsgancho y hace uso de las funciones básicas wp_get_post_terms()y get_posts()- get_related()Se usa para obtener un conjunto de identificadores. Además, existe el woocommerce_related_products_argsgancho, que se puede usar para alterar los argumentos de la consulta de productos relacionados dentro related.php, WP_Queryse usa para esto. La consulta utiliza los identificadores resultantes de la get_related()llamada.
Creo que ahora tienes todo a mano para resolver tu problema. En realidad, mucho más que eso, ofrece una descripción casi completa sobre cómo personalizar los productos relacionados. No mencioné todas las funcionalidades (funciones y / o conexiones) del código fuente inspeccionado, pero definitivamente todas las importantes. Ahora debería estar más claro cómo se puede rastrear la funcionalidad de los productos relacionados de WooCommerce hasta las funciones principales de WordPress.

En cuarto lugar , vengo, donde debes aplicar tus personalizaciones y lo que deberías haber pedido. Por ejemplo así:

Woocommerce tiene el woocommerce_product_related_postsgancho de personalizar la get_posts()llamada para determinar productos relacionados.

Código:

        // Get the posts
        $related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                        'relation' => 'OR',
                        array(
                                'taxonomy' => 'product_cat',
                                'field' => 'id',
                                'terms' => $cats_array
                        ),
                        array(
                                'taxonomy' => 'product_tag',
                                'field' => 'id',
                                'terms' => $tags_array
                        )
                )
        ) ) );

¿Cómo puedo personalizar esto para lograr mi objetivo? Que es mostrar productos relacionados que están en la misma categoría de producto product_cat- y tienen la misma etiqueta (s) product_tag- que el producto individual que se muestra.

Sin darle una conclusión, al menos no si esperaba obtener un código completo y listo, la respuesta, lo primero que probablemente debería hacer es cambiar el tax_queryparámetro relationde ORa AND.





Notas:

  • Hice de esta una respuesta descriptiva más larga con la discusión en curso vinculada anteriormente en mente
  • Espero que no te importe, que no solo es una respuesta a tu pregunta, sino que además busca cumplir un propósito educativo general
  • esto no se ha probado , porque no existe un código real
  • Por último, pero no menos importante, es previsible que con el lanzamiento de Woocoomerce 2.1 se implementarán algunos cambios significativos en el código, teniendo esto en cuenta, pero por ahora a partir de 2.0.19, el código anterior es válido



Editar:

Realmente no deberías editar las clases principales (plugin) directamente. Es problemático, porque debe mantener sus cambios en las actualizaciones nuevamente, ya que los archivos principales se actualizan y se sobrescriben si realiza uno. Especialmente si es fácilmente evitable como en este caso, el siguiente código hace lo que pretendía hacer de todos modos, es decir, implementar este cambio a través de su functions.php.

Código:

    add_filter( 'woocommerce_product_related_posts', 
                'wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
            $get_related_products_args = array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'id',
                        'terms' => $cats_array
                    ),
                    array(
                        'taxonomy' => 'product_tag',
                        'field' => 'id',
                        'terms' => $tags_array
                    )
                )
            );
            return $get_related_products_args;
    }



Para WooCommerce versión 2.1.0 y superiores, el gancho anterior no funcionará, ya que ya no existe, por lo que la respuesta se puede usar hasta la versión 2.0.20. Pero @NathanPowell descubrió una buena respuesta en StackOverflow con respecto a la versión v2.1.0 disponible y para la personalización del conjunto de ganchos utilizables de los productos relacionados .

Nicolai
fuente
Muchas gracias @ialocin por la respuesta rápida y detallada. Como medida temporal, simplemente cambié ORa ANDen mi wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phparchivo y pronto cambiaré esto para que se haga desde dentro del functions.phparchivo. Gracias de nuevo.
user1752759
@ user1752759 Vea mi edición para hacer esto a través defunctions.php
Nicolai
¡Respuesta perfecta! Debe usarse en cualquier guía sobre cómo entender los complementos y cómo extenderlos a sus necesidades. No estoy seguro si estos libros existe aunque .. Pero aún así :)
ThdK
@ThdK Gracias, no sé si es tan bueno, pero después de leerlo la primera vez desde que lo escribí, todavía estoy contento con la respuesta, además de que seguramente aprecio el cumplido, siempre es bueno escuchar :) intentaste esto con WC 2.1.x?
Nicolai
Hola, @ialocin. A la versión editada en la parte inferior le faltan algunos corchetes de cierre, y desafortunadamente, ya no funciona como una solución en la versión 2.1.8. Si no es demasiado para molestar, ¿podría actualizar esto por mí?
user1752759
2

No nos engañemos aquí chicos. La respuesta aceptada solo llevó al usuario a su objetivo.

El primer problema yace aquí:

<?php
// display upsells and related products within dedicated div with different column and number of    products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

Se elimina una acción y luego se coloca en la posición EXACTA de la que se eliminó. El objetivo no está completamente claro.

Encontré esto con una búsqueda en los productos relacionados porque no entendía que TAGS y CATEGORIES son lo que impulsa la woocommerce_output_related_productsfunción en este complemento.

La mejor respuesta a ESTA pregunta es el siguiente enlace, y tiene todo que ver con el woocommerce_output_related_products_args()filtro: /programming/23554993/output-posts-relating-to-the-tags

Nathan Powell
fuente
Esto es realmente bastante divertido. Por qué podrías preguntar, porque si has leído mi respuesta cuidadosamente, entonces habrías visto que solo usa un filtro. Para ser exactos, el único filtro disponible en ese momento, pero lo habrías sabido si hubieras leído lo que escribí y te hubieras tomado el tiempo de mirar los archivos fuente de las diferentes versiones. Solo digo. Aparte de eso, la respuesta que vinculó explica muy bien los nuevos ganchos disponibles sine v2.1.
Nicolai
Perdón por eso, era tarde en la noche. Esperaba explicar un poco sobre la falla obvia en el código por parte del OP.
Nathan Powell
No se preocupe, pero sentí que tenía que decir algo.
Nicolai
Su enlace de referencia funcionó para mí Nathan, gracias, he estado tratando de hacerlo por mí mismo 2 horas ahora. Ahora sé aplicar los filtros correctamente :)
marcovega