Suporte » Plugins » Loop com consulta no BD

  • Resolvido Jean Christopher

    (@jchristopherj)


    Estou com uma dúvida de qual é a melhor forma de fazer isso, tenho um projeto específico e para ele tive que criar algumas tabelas extras para posterior consulta. Enfim minha dúvida é a seguinte, eu preciso relacionar consultas no banco de dado com as postagens e depois apresentá-las em uma página. Um exemplo simples seria apresentar as postagens relacionadas a cidades que começam com a letra ‘S’, com mais de 30.000 mil habitantes e com área litorânea, todas elas deveriam aparecer em uma página para o usuário.

    Qual a melhor forma de fazer isso?

    OBS: Peço desculpas se tiver criado o tópico na área errada.

Visualizando 8 respostas - 1 até 8 (de um total de 8)
  • Olá Jean!
    Primeiro eu acho que não é certo criar novas tabelas no banco de dados do wordpress.
    Ao usar o WordPress você deve usar a concepção de custom post types do contrario a chance de dar M* é grande. Mas basta você fazer uma consulta usando join. ex:
    https://www.w3schools.com/sql/sql_join.asp

    • Esta resposta foi modificada 5 anos, 2 meses atrás por Mário Valney.
    Criador do tópico Jean Christopher

    (@jchristopherj)

    Então marcos na verdade acho difícil acontecer algum problema, porque não vou adicionar informações “preciosas” digamos assim, a questão não é como faço a consulta, isso é fácil, quero saber se o ideal seria mesmo fazer um loop customizado. Pensei em fazer algo assim:

    No banco de dados quero relacionar o perfil que o usuário definirem em um formulário com as postagens que tem aquelas características.

    Depois que o usuário criar o perfil vou fazer uma consulta no banco para saber quais os ids das postagens que tem aquelas informações:

    <?php
    global $wpdb;
    $sqlQuery= "Select id from ... where";/* Vou definir ali a consulta conforme precisar para pegar os ids dos posts. 
    $ids= $wpdb-> get_col($sqlQuery);
    

    OBS: Vou usar o esc_sql() sempre que precisar.

    Depois que conseguir o id quero fazer um loop personalizado com condicional para os usuários cadastrados ou não, se não for cadastrado vai mostrar as postagens normalmente sem filtrar, porém se for cadastrado vou mostrar apenas as postagens referentes aos ids do array.

    $the_query = new WP_Query( $ids);
    if ( $the_query->have_posts() ) : ?>
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
            <?php echo '<p>' . the_content() .'</p>';?>
    
        <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php endif; ?>

    Acredito que seria algo assim. Não sei se é a melhor forma de fazer e nem se funciona. kkk Começando no WordPress agora. Se eu estiver equivocado quando ao uso do post type me falem por favor.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá, tudo bem?

    Pessoalmente sou contra usar tabelas próprias, a menos que seja totalmente fora do paradigma do WordPress, por outro lado, não é o fim do mundo fazê-lo (se fosse, o WP não teria criado a classe wpdb e documentado tão bem).

    No caso em questão, o exemplo do @jchristopherj faz todo sentido ter tabelas personalizadas. Outro exemplo seria num projeto em que você precise implementar a tabela de cidades, estados e CEPs dos Correios.

    Agora sobre o Loop, sim: está correta a lógica que você montou (a sintaxe não: está errado o argumento passado à WP_Query).

    Você consultou o que precisava nas suas tabelas e depois montou uma Query com a classe devida. Dessa forma, não está poluindo o WordPress (imagina que louco ter a taxonomia cidade com dezenas de milhares de registros ‘-‘ não é uma boa ideia) e ainda aproveita todo o Core e seus caches e sua otimização ao usar o que é nativo para o que é nativo.

    Agora é bom entender mais sobre o WP para poder criar relacionamentos fortes. Por exemplo, na tabela “cidades” você tem o ID de cada cidade e para relacionar com o post você pode salvar um metadado no post com esse ID.

    Abraços

    • Esta resposta foi modificada 5 anos, 2 meses atrás por Mário Valney. Razão: Update sobre meta dados
    • Esta resposta foi modificada 5 anos, 2 meses atrás por Mário Valney.
    Criador do tópico Jean Christopher

    (@jchristopherj)

    Boa tarde Mario, agradeço pelo comentário. Foi exatamente o que eu pensei, vou ter muitos relacionamentos então achei bem pertinente usar algumas tabelas adicionais para colocar esses dados.

    Sobre a Query que fiz:

    $sqlQuery= "Select id from ... where";/* Vou definir ali a consulta conforme precisar para pegar os ids dos posts.

    Eu não quis detalhar de onde vinha nem a condição, minha preocupação é o restante do código, até porque eu pensei em definir as condições da query através de um perfil que o usuário cadastrar.

    Pensei exatamente a mesma coisa sobre usar um meta dado com a id de alguma tabela do banco que me possibilite realizar esse relacionamento post/bd.

    Agora acho que no loop eu fiz errado pelo que andei lendo o ideal seria usar

    
    $args = array( 'post__in' => $ids);
    // The Query
    $the_query = new WP_Query( $args );

    Depois o loop.

    Não sei se entendi exatamente onde disse que estava errado. Tenho me esforçado para entender a forma com que o wordpress faz algumas coias, mas ainda tenho dúvidas.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Yepp. Agora está certo:
    https://codex.wordpress.org/Class_Reference/WP_Query

    Uma última dica: pessoalmente eu acho que a melhor arquitetura seria o WordPress consumindo as tabelas, ou seja, como eu exemplifiquei: você salva um metadado no post com o ID da tabela ou algo do tipo e não o contrário (o ID do post em algum canto da tabela). Mas claro que isso é algo pessoal, não é regra e cada caso é um caso.

    Então, para finalizar, não hesite em perguntar no Fórum e ler a documentação.
    Que bom que está se esforçando para entender o WP, vai ver que é um CMS #duk7 hahaha

    Abraços

    P.S.: Se não tiver mais dúvidas quanto a esse tópico, por favor marque como Resolvido.

    • Esta resposta foi modificada 5 anos, 2 meses atrás por Mário Valney.
    Criador do tópico Jean Christopher

    (@jchristopherj)

    Foi exatamente o que pensei, não quero colocar os ids das postagens no banco até para ficarem mais limpas as consultas. Só vou fazer referência da postagem com id de alguma tabela e depois faço um join. Agradeço a presteza vou continuar estudando aqui.

    Moderador Claudio Sanches

    (@claudiosanches)

    Se for usar muitas vezes essa query, pode também adicionar no cache do WordPress usando:

    function get_cities_ids() {
    	global $wpdb;
    
    	$ids = wp_cache_get( 'ids', 'cities' );
    	if ( false !== $ids ) {
    		return $ids;
    	}
    
    	$query = "Select id from ... where";
    	$ids   = $wpdb->get_col( $query );
    
    	wp_cache_set( 'ids', $ids, 'cities' );
    
    	return $ids;
    }

    Recomendo (muito) ler esse artigo sobre uso ou não de tabelas próprias no WordPress: https://pippinsplugins.com/custom-database-api-reasons-for-custom-tables-and-an-api/

Visualizando 8 respostas - 1 até 8 (de um total de 8)
  • O tópico ‘Loop com consulta no BD’ está fechado para novas respostas.