Posts com thumbnail antes dos outros posts no search.php
-
Olá,
gostaria de saber se existe como listar posts que tenham a imagem destacada antes dos posts que não tem no search.php.
-
Oi @cherber,
Acho que o único jeito é alterando a query SQL executada na busca. Não descobri nenhuma forma de alterar a Query do WP e continuar trazendo todos os resultados 🙁
Tente com o seguinte código no seu
functions.php
:function busca_thumbnails_posts_request( $sql_query, $wp_query ) { global $wpdb; if ( $wp_query->is_main_query() AND $wp_query->is_search() ) { $sql_query = str_replace( 'SQL_CALC_FOUND_ROWS', '', $sql_query ); $sql_query = "SELECT SQL_CALC_FOUND_ROWS * FROM ( {$sql_query} ) AS {$wpdb->posts} LEFT JOIN (SELECT * FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id' ) AS {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id ORDER BY {$wpdb->postmeta}.meta_value DESC"; } return $sql_query; } add_filter( 'posts_request', 'busca_thumbnails_posts_request', 10, 2 );
Ela faz dois selects: o original e mais um, buscando na tabela wp_postmeta os posts com imagem destacada, depois junta uma com a outra e ordena. Testei aqui e funcionou.
Não esqueça de voltar para dizer se funcionou para você também, se ficou com alguma dúvida e, se for o caso, marcar seu tópico como resolvido, ok?
Obrigado pela resposta @felipeelia, funcionou sim, tudo ok.
- Esta resposta foi modificada 7 anos, 4 meses atrás por Christian Herber Santos.
Oi @cherber,
O @mariovalney me passou uma solução bem mais limpa, pode trocar, por favor?
function myplugin_search_filter( $query ) { if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) { $new_meta_query = array( 'relation' => 'OR', array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS', ), array( 'key' => '_thumbnail_id', 'value' => 'bug #23268', 'compare' => 'NOT EXISTS', ), ); $meta_query = $query->get( 'meta_query' ); if ( empty( $meta_query ) ) { $meta_query = $new_meta_query; } else { if ( isset( $meta_query['relation'] ) ) { $old_meta_query = $meta_query; $meta_query = array(); $meta_query[] = $old_meta_query; } $meta_query['relation'] = 'AND'; $meta_query[] = $new_meta_query; } $query->set( 'orderby', 'meta_value' ); $query->set( 'meta_query', $meta_query ); } } add_action( 'pre_get_posts', 'myplugin_search_filter' );
Dessa forma você não altera o SQL diretamente e maximiza a compatibilidade do seu tema 🙂
Olá a todos 😀
A gente estava conversando @cherber e percebemos que qualquer solução que seja irá perder a ordenação das respostas (que por padrão é ‘os mais novos primeiro’).
Chegamos a conclusão que até teria como manter essa ordenação, mas seria um pouco mais complexo. Se for importante manter a ordenação, por favor nos avise.
Olá.
Primeiro obrigado pela ajuda de vocês!
Na solução do @felipeelia funcionou do jeito que esperava, com os posts com a imagem aparecendo antes, porém o botão que tenho “Ver Mais” que carrega mais posts não aparecia mais.
Na solução do @mariovalney o posts com imagem não vieram primeiro, mas o botão foi mantido.
A questão de ordenação ‘mais novos primeiro’, não há necessidade de manter.
- Esta resposta foi modificada 7 anos, 4 meses atrás por Christian Herber Santos.
Olá @cherber, tudo bem?
Estranho, pois testei aqui, mas talvez não estejam vindo primeiro poisTenta adicionar essa linha:
$query->set( 'order', 'DESC' );
Acima dessa:
$query->set( 'orderby', 'meta_value' );
Se não funcionar, além disso, troca a palavra meta_value por meta_value_num apenas nessa linha:
$query->set( 'orderby', 'meta_value_num' );
- Esta resposta foi modificada 7 anos, 4 meses atrás por Mário Valney.
Tudo jóia @mariovalney.
Agora está ok, funcionando como esperava.
Muito obrigado pela colaboração. 🙂
- O tópico ‘Posts com thumbnail antes dos outros posts no search.php’ está fechado para novas respostas.