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.php
modelo. 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.php
contém o que está procurando. Estou falando especialmente da get_related()
função, que inclui o woocommerce_product_related_posts
gancho 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_args
gancho, 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_posts
gancho 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_query
parâmetro relation
de OR
para 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 .
OR
para paraAND
no meuwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
arquivo e, em breve, alterarei isso para ser feito de dentro dofunctions.php
arquivo. Mais uma vez obrigado.functions.php
Não vamos nos enganar aqui, pessoal. A resposta aceita apenas levou o usuário ao seu objetivo.
O primeiro problema está aqui:
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_products
funçã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-tagsfonte