Suporte » Desenvolvendo com WordPress » Posts com thumbnail antes dos outros posts no search.php

  • Resolvido Christian Herber Santos

    (@cherber)


    Olá,
    gostaria de saber se existe como listar posts que tenham a imagem destacada antes dos posts que não tem no search.php.

Visualizando 7 respostas - 1 até 7 (de um total de 7)
  • Moderador Felipe Elia

    (@felipeelia)

    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?

    Criador do tópico Christian Herber Santos

    (@cherber)

    Obrigado pela resposta @felipeelia, funcionou sim, tudo ok.

    Moderador Felipe Elia

    (@felipeelia)

    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 🙂

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    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.

    Criador do tópico Christian Herber Santos

    (@cherber)

    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.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá @cherber, tudo bem?
    Estranho, pois testei aqui, mas talvez não estejam vindo primeiro pois

    Tenta 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' );

    Criador do tópico Christian Herber Santos

    (@cherber)

    Tudo jóia @mariovalney.

    Agora está ok, funcionando como esperava.
    Muito obrigado pela colaboração. 🙂

Visualizando 7 respostas - 1 até 7 (de um total de 7)
  • O tópico ‘Posts com thumbnail antes dos outros posts no search.php’ está fechado para novas respostas.