Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save davidwilliamdacosta/3a2fce4c69f227d3a195ad3d6c24f10c to your computer and use it in GitHub Desktop.
Save davidwilliamdacosta/3a2fce4c69f227d3a195ad3d6c24f10c to your computer and use it in GitHub Desktop.
Exibir produtos sem estoque final da pagina Woocommerce
<?php
/**
* Order product collections by stock status, instock products first.
*/
class iWC_Orderby_Stock_Status
{
public function __construct()
{
// Check if WooCommerce is active
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);
}
}
public function order_by_stock_status($posts_clauses)
{
global $wpdb;
// only change query on WooCommerce loops
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
$posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
}
return $posts_clauses;
}
}
new iWC_Orderby_Stock_Status;
?>
@ChicoCybergoth
Copy link

Prezados, está funcionando nas versões atuais?
Grato.

@JonataBiazuz
Copy link

JonataBiazuz commented Dec 1, 2020

Prezados, está funcionando nas versões atuais?
Grato.

@ChicoCybergoth.
Estou utilizando em WordPress 4.9.16 e Woocommerce 3.3.3. Sem problemas até o momento.

@agenciadw
Copy link

Bom dia, está sim.

@ChicoCybergoth
Copy link

Show! Obrigado! @JonataBiazuz @agenciadw

@marcelinhoakino
Copy link

Boa (Y), funciona, obrigado

@DavidsonVeniali
Copy link

Estou utilizando o WordPress 5.6.2 e Woocommerce 4.8.0, além de estar utilizando o DIVI. Percebi que ao adicionar este código os estilos CSS da página da loja somem. Gostaria de saber o que pode ser ou como arrumar isso. Grato

@LucasBecker19
Copy link

Olá. Como faço para aplicar este código nas páginas de atributo?
Estou montando um e-commerce e na slug ...marca/coca-cola/ o filtro não está sendo aplicado. Apenas no .../loja/
Neste caso o atributo é marca
Alguém consegue me ajudar?

@agenciadw
Copy link

Boa (Y), funciona, obrigado

Olá @DavidsonVeniali tudo bem? Você tem que aplicar ele no function, recomendo que use sempre um child para fazer aplicações no template e não correr o risco de perder as atualizações.

Sobre quebrar o CSS não era para acontecer isto, teria que analizar mais a fundo.

@agenciadw
Copy link

Olá. Como faço para aplicar este código nas páginas de atributo?
Estou montando um e-commerce e na slug ...marca/coca-cola/ o filtro não está sendo aplicado. Apenas no .../loja/
Neste caso o atributo é marca
Alguém consegue me ajudar?

@LucasBecker19 tudo bem? Não testei ele nos filtros, mas na teoria era para aplicar em todos.

@LucasBecker19
Copy link

Olá. Como faço para aplicar este código nas páginas de atributo?
Estou montando um e-commerce e na slug ...marca/coca-cola/ o filtro não está sendo aplicado. Apenas no .../loja/
Neste caso o atributo é marca
Alguém consegue me ajudar?

@LucasBecker19 tudo bem? Não testei ele nos filtros, mas na teoria era para aplicar em todos.

Perdão, eu acho que expliquei errado. Não quis dizer filtro, eu quis dizer ordenação.
Esta ordenação só esta sendo aplicada no /loja/ porém não está sendo aplicado nas marcas

Mas obrigado amigo!

@agenciadw
Copy link

Olá. Como faço para aplicar este código nas páginas de atributo?
Estou montando um e-commerce e na slug ...marca/coca-cola/ o filtro não está sendo aplicado. Apenas no .../loja/
Neste caso o atributo é marca
Alguém consegue me ajudar?

@LucasBecker19 tudo bem? Não testei ele nos filtros, mas na teoria era para aplicar em todos.

Perdão, eu acho que expliquei errado. Não quis dizer filtro, eu quis dizer ordenação.
Esta ordenação só esta sendo aplicada no /loja/ porém não está sendo aplicado nas marcas

Mas obrigado amigo!

Entendi, vou testar aqui e depois dou um parecer.

@damianCARVALHO
Copy link

Fala galera!
Tem um vídeo completo, bem rápido, explicando como inserir esse snipet no functions.php do Wordpress.

https://www.youtube.com/watch?v=IXb6S3KySQc&t=9s&pp=sAQA

Vale a pena assistir!!

@agenciadw
Copy link

Fala galera!
Tem um vídeo completo, bem rápido, explicando como inserir esse snipet no functions.php do Wordpress.

https://www.youtube.com/watch?v=IXb6S3KySQc&t=9s&pp=sAQA

Vale a pena assistir!!

Muito obrigado

@damianCARVALHO
Copy link

David. Bom dia! na loja ficou perfeito! Estamos precisando além da loja, fazer essa mesma lógica em uma lista de produtos que fica posicionada na home. Na home foi utilizado o mesmo widget de "products" utilizado na loja, sabe nos direcionar de alguma maneira para implantar essa lógica também na lista de produtos da home?

Desde já, parabenizo o trabalho, muito bom.

@FernandesEduiardo
Copy link

Ola tudo bem ?
Existe algum codigo que esconda esse item da loja?

@ChicoCybergoth
Copy link

Funcionou show! Obrigado David!

Mais uma pergunta cara, eu percebi que além do frontend ele afetou o backend também, a lista de produtos também colocou os itens em falta no final, o que não tem muito problema mas eu estava acostumado com a listagem então me confundiu um pouco, teria como ele afetar somente o frontend?

@agenciadw
Copy link

David. Bom dia! na loja ficou perfeito! Estamos precisando além da loja, fazer essa mesma lógica em uma lista de produtos que fica posicionada na home. Na home foi utilizado o mesmo widget de "products" utilizado na loja, sabe nos direcionar de alguma maneira para implantar essa lógica também na lista de produtos da home?

Desde já, parabenizo o trabalho, muito bom.

Para a página inicial normalmente eu construo ela através do Elementor e defino por lá qual a ordem que vou colocar.

@agenciadw
Copy link

Ola tudo bem ?
Existe algum codigo que esconda esse item da loja?

No próprio Woocommerce. Você vai em Woocommerce > Produtos > Inventário e em Visibilidade dos produtos fora de estoque basta marcar Ocultar os produtos fora de estoque do catálogo

@agenciadw
Copy link

Funcionou show! Obrigado David!

Mais uma pergunta cara, eu percebi que além do frontend ele afetou o backend também, a lista de produtos também colocou os itens em falta no final, o que não tem muito problema mas eu estava acostumado com a listagem então me confundiu um pouco, teria como ele afetar somente o frontend?

Eu recomendo para isto usar o plugin Snippets, por ela você pode definir onde o código irá afetar.

@FernandesEduiardo
Copy link

FernandesEduiardo commented Aug 16, 2021 via email

@gabrekc
Copy link

gabrekc commented Aug 22, 2021

Estou utilizando o WordPress 5.6.2 e Woocommerce 4.8.0, além de estar utilizando o DIVI. Percebi que ao adicionar este código os estilos CSS da página da loja somem. Gostaria de saber o que pode ser ou como arrumar isso. Grato

Você conseguiu resolver isso? Também utilizo o DIVI e aconteceu a mesma coisa comigo, o código remove todo o layout e deixa só a listagem de produtos...

@paolohenrik
Copy link

Boa noite, estou com problemas em aplicar na pagina HOME, no restante do site funciona, mas na HOME não.
Alguém tem alguma ideia de como posso fazer?

@vittorduartte
Copy link

vittorduartte commented Mar 2, 2022

Boa noite, estou com problemas em aplicar na pagina HOME, no restante do site funciona, mas na HOME não. Alguém tem alguma ideia de como posso fazer?

A homepage não se inclui na regra de páginas no código. Para acrescentar mude a seguinte linha de:
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
Para:
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_home())) {

Vale a pena lembrar que só funcionará se a lista de produtos estiver sendo gerada por um post_loop. Espero que resolva o seu problema :)

@agenciadw
Copy link

@vittorduartte obrigado pela resposta!

@ChicoCybergoth
Copy link

Funcionou show! Obrigado David!
Mais uma pergunta cara, eu percebi que além do frontend ele afetou o backend também, a lista de produtos também colocou os itens em falta no final, o que não tem muito problema mas eu estava acostumado com a listagem então me confundiu um pouco, teria como ele afetar somente o frontend?

Eu recomendo para isto usar o plugin Snippets, por ela você pode definir onde o código irá afetar.

Grato pela resposta, mas você acha que teria alguma solução simples sem ter que instalar um plugin?

@agenciadw
Copy link

Funcionou show! Obrigado David!
Mais uma pergunta cara, eu percebi que além do frontend ele afetou o backend também, a lista de produtos também colocou os itens em falta no final, o que não tem muito problema mas eu estava acostumado com a listagem então me confundiu um pouco, teria como ele afetar somente o frontend?

Eu recomendo para isto usar o plugin Snippets, por ela você pode definir onde o código irá afetar.

Grato pela resposta, mas você acha que teria alguma solução simples sem ter que instalar um plugin?

Sim, você pode usar o function do seu tema.

@ChicoCybergoth
Copy link

Funcionou show! Obrigado David!
Mais uma pergunta cara, eu percebi que além do frontend ele afetou o backend também, a lista de produtos também colocou os itens em falta no final, o que não tem muito problema mas eu estava acostumado com a listagem então me confundiu um pouco, teria como ele afetar somente o frontend?

Eu recomendo para isto usar o plugin Snippets, por ela você pode definir onde o código irá afetar.

Grato pela resposta, mas você acha que teria alguma solução simples sem ter que instalar um plugin?

Sim, você pode usar o function do seu tema.

Sim amigo, eu estou usando, a questão é a que expliquei antes, a lista de produtos no frontend ficou de acordo com o efeito, com os produtos sem estoque no fim, a questão é que isso afetou a lista de produtos no backend também, não que seja MUITO problema mas estava acostumado com a sequência antiga, não é nada demais mas se pudesse ocorrer só front eu iria preferir, entende?

Obrigado pela atenção.

@brunosdemoura
Copy link

brunosdemoura commented Sep 18, 2022

Notice: Trying to get property 'ID' of non-object in /home/u217584747/domains/tropicaldiversidades.com/public_html/wp-includes/class-wp-query.php on line 4186

Notice: Trying to get property 'post_title' of non-object in /home/u217584747/domains/tropicaldiversidades.com/public_html/wp-includes/class-wp-query.php on line 4188

Notice: Trying to get property 'post_name' of non-object in /home/u217584747/domains/tropicaldiversidades.com/public_html/wp-includes/class-wp-query.php on line 4190

Notice: Trying to get property 'post_type' of non-object in /home/u217584747/domains/tropicaldiversidades.com/public_html/wp-includes/class-wp-query.php on line 4338

Conseguem me auxiliar? Utilizei o snippet e está apresentando o erro acima na minha home. Inseri o código via Plugin Snippets PHP.

Tema atual: Woodmart Child (versão 1.0.0)

Obrigado.

@maxwelllcordeiro
Copy link

Funcionou... mas tem como fazer funcionar também nos produtos relacionados da pagina descrição dos produtos?

@KauanDesigner
Copy link

Se você estiver usando widgets de catálogo de produtos, pode ser que não funcione (que foi o meu caso). A maneira que consegui foi indo ali na aba de produtos e filtrei para produtos fora de estoque, depois fui alterando as datas de postagem para serem as primeiras publicadas, exemplo: se seu produto foi publicado dia 15 em tal horário, altere a data do produto fora de estoque para o dia 14 em tal horário. Assim ele aparece como último no catálogo. Observação: no widget de catálogo, precisa está filtrado por data, se não, não irá funcionar. Espero ter ajudado!:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment