Como personalizar produtos relacionados ao woocommerce? [fechadas]

14

Tenho as seguintes linhas de código no meu site que exibem os produtos relacionados na parte inferior da minha página de produto único no WooCommerce ...

functions.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 ele exibe 4 produtos que foram classificados com o mesmo nome, como eu modificaria o acima, para exibir as tags relacionadas ?

Por exemplo, eu tenho uma categoria de produto chamada 'Automotivo' e, dentro dessa categoria, existem algumas tags - 'Holden', 'Ford', 'Toyota', 'Nissan' etc.

Gostaria que ele exibisse 4 produtos na parte inferior, relacionados à etiqueta do produto que o usuário está visualizando no momento.

user1752759
fonte

Respostas:

29

Em primeiro lugar , você não pode atingir imediatamente a meta descrita com o código exibido na sua pergunta. Para entender por que não existe uma abordagem direta com esse código, é necessário dar uma olhada no que você está usando - woocommerce_related_products()- para fazer o que você fez até agora.

Em segundo lugar , você precisa entender, porque, caso contrário, não poderá fazer uma pergunta pontual, que deve ser absolutamente sua meta, para garantir que está recebendo uma resposta. Além disso, você deve ter em mente que o Wordpress Development tem seu escopo principal definido em questões relacionadas ao wordpress - se você estiver interessado, isso está sendo discutido no Wordpress Development Meta , um tópico específico sendo Nossas wooes e futuro dos plugins de plataforma na WPSE . Portanto, se você estiver fazendo perguntas sobre plug-ins, como o woocommerce, você deve decompô-lo para torná-lo o mais relacionado possível às principais funções - veja o próximo ponto -, pois você não pode esperar que as pessoas conheçam todos os detalhes de cada plug-in que você está usando.

Em terceiro lugar , agora vamos entrar em uma visão mais profunda do que está acontecendo. Como você disse, você está usando woocommerce_related_products()agora. Se você der uma olhada na fonte, verá que essa função usa woocommerce_get_template()para obter o related.phpmodelo. woocommerce_get_template()novamente usa woocommerce_locate_template()para localizar o modelo, o último faz isso usando a função principal do wordpress locate_template().
Agora, há uma conexão de volta ao núcleo, levando à constatação de que as funções de woocommerce mencionadas acima - e esperançosamente inspecionadas - são essencialmente invólucros para estender a funcionalidade principal. Outra coisa que ficou clara ao analisar as dependências de funcionalidade é, o que eu disse antes, você precisa de uma abordagem diferente para atingir seu objetivo, porque woocommerce_related_products()- agora inegável óbvio - não é o correto.
Se você me seguiu com minhas explicações e leu completamente até agora, percebeu que ela related.phpcontém o que está procurando. Estou falando especialmente da get_related()função, que inclui o woocommerce_product_related_postsgancho e faz uso das funções principais wp_get_post_terms()e get_posts()- get_related()é usada para obter um conjunto de identificações. Além disso, existe o woocommerce_related_products_argsgancho, que pode ser usado para alterar os argumentos da consulta de produtos relacionados related.php, WP_Queryé usado para isso. A consulta usa os IDs resultantes da get_related()chamada.
acho que você tem tudo em mãos agora para resolver seu problema. Na verdade, muito mais do que isso, isso fornece uma visão geral quase completa de como personalizar os produtos relacionados. Eu não mencionei todas as funcionalidades - funções e / ou conexões - do código-fonte inspecionado, mas definitivamente todas as importantes. Agora deve ficar mais claro como a funcionalidade de produtos relacionados do woocommerce pode ser rastreada até as principais funções do wordpress.

Em quarto lugar , venho para onde você deve aplicar suas personalizações e o que deveria ter pedido. Por exemplo, assim:

O Woocommerce tem o woocommerce_product_related_postsgancho para personalizar a get_posts()chamada para determinar produtos 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
                        )
                )
        ) ) );

Como posso personalizar isso para atingir meu objetivo? Que mostra produtos relacionados que estão na mesma categoria de produto product_cat- e têm as mesmas tags - product_tag- que o único produto mostrado.

Sem dar uma resposta conclusiva - pelo menos não se você tivesse a expectativa de obter um código completo e pronto -, a primeira coisa que você provavelmente deve fazer é alterar o tax_queryparâmetro relationde ORpara AND.





Notas:

  • Tornei esta uma resposta descritiva mais longa com a discussão em andamento vinculada acima em mente
  • Espero que você não se importe, que não seja apenas uma resposta à sua pergunta, mas também busque cumprir um objetivo educacional geral
  • isso não foi testado , porque não existe um código pronto real
  • Por último, mas não menos importante, é previsível que, com o lançamento do woocoomerce 2.1, algumas alterações significativas de código sejam implementadas, tendo isso em mente, mas por enquanto a partir de 2.0.19 o código acima é válido



Editar:

Você realmente não deve editar diretamente as classes principais (plug-in). É problemático, porque você precisa manter suas alterações nas atualizações novamente, pois os arquivos principais são atualizados e substituídos se você executar um. Especialmente se for facilmente evitável, como neste caso, o código abaixo faz o que você pretendia fazer de qualquer maneira, ou seja, implementar essa alteração por meio do seufunctions.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 o WooCommerce versão 2.1.0 e superior, o gancho acima não funcionará, pois não existe mais, portanto a resposta é utilizável até a versão 2.0.20. Mas o @NathanPowell descobriu uma boa resposta no StackOverflow a respeito da v2.1.0 disponível e para a personalização do conjunto de ganchos utilizáveis ​​dos produtos relacionados .

Nicolai
fonte
Muito obrigado @ialocin pela resposta rápida e detalhada. Como medida temporária, simplesmente mudei o ORpara para ANDno meu wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phparquivo e, em breve, alterarei isso para ser feito de dentro do functions.phparquivo. Mais uma vez obrigado.
user1752759
@ user1752759 Veja minha edição para fazer isso via #functions.php
Nicolai
Resposta perfeita! Ele deve ser usado em qualquer guia sobre como entender os plug-ins e como estendê-los às suas necessidades. Não tenho certeza se esses livros existe embora .. Mas ainda :)
ThdK
@ThdK Obrigado, eu não sei se é tão bom, mas depois de ler pela primeira vez desde que o escrevi, ainda estou feliz com a resposta, além de que certamente aprecio o elogio, é sempre bom ouvir :) você tentou isso com o WC 2.1.x?
Nicolai
Olá, @ialocin. A versão editada na parte inferior está faltando alguns colchetes e, infelizmente, não está mais funcionando como uma solução na versão 2.1.8. Se não houver muito problema, você poderia atualizar isso para mim?
User1752759
2

Não vamos nos enganar aqui, pessoal. A resposta aceita apenas levou o usuário ao seu objetivo.

O primeiro problema está aqui:

<?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);

Uma ação é removida e, em seguida, colocada na posição EXATA da qual foi removida. O objetivo não é totalmente claro.

Me deparei com isso com uma pesquisa nos produtos relacionados, porque não entendi que TAGS e CATEGORIES são o que impulsiona a woocommerce_output_related_productsfunção neste plug-in.

A melhor resposta para ESTA pergunta é o seguinte link e tem tudo a ver com o woocommerce_output_related_products_args()filtro: /programming/23554993/output-posts-relating-to-the-tags

Nathan Powell
fonte
Isso é realmente bem engraçado. Por que você pode perguntar, porque se você leu minha resposta com atenção, então você já viu, ela usa apenas um filtro. Para ser exato, o único filtro disponível naquele momento, mas você saberia disso, se realmente tivesse lido o que escrevi e teria tido tempo para examinar os arquivos de origem das diferentes versões. Apenas dizendo. Além disso, a resposta que você vinculou explica muito bem os novos ganchos disponíveis sine v2.1.
Nicolai
Desculpe por isso, era tarde da noite. Eu esperava explicar um pouco sobre a falha óbvia no código pelo OP.
22414 Nathan Powell
Não se preocupe, mas senti que tinha que dizer alguma coisa.
Nicolai
Seu link de referência funcionou para mim Nathan, obrigado, estou tentando fazer isso por mim duas horas agora. Agora eu sei para aplicar filtros corretamente :)
marcovega