Jump to content
MatheusAssuncao

Carregamento Ajax - Cidades por estado no Wordpress

Recommended Posts

Boa tarde pessoal!

 

Eu criei um formulário HTML no wordpress para salvar no banco os dados do contato. Tenho um SELECT estado:

<select id='estado' name='estado'>
   <option value='UF'>Nome do estado</option>
</select>

E um select cidade. Ao selecionar um estado eu preciso que carregue o select de cidades via ajax. As cidades estão em uma tabela do banco de dados do wordpress.

Meu script PHP que recebe a requisição ajax e consulta no banco é esse:

<?php
include "conexao.php";

$estado = mysql_real_escape_string( $_GET['estado'] );
$cidades = [];

$resultado = mysql_query("SELECT Codigo, Nome FROM Municipio WHERE Uf='$estado' ORDER BY Nome", $conexao);

while ( $row = mysql_fetch_array( $resultado ) ) 
	array_push($cidades, ['Codigo' => $row['Codigo'], 'Nome' => utf8_encode($row['Nome'])]);

echo(json_encode( $cidades ));

O script JS que faz a requisição é esse:

$('#estado').change(function () {
                if ($('#estado').val()) {
                    $.getJSON('cidades.ajax.php?search=', {
                        estado: $('#estado').val(),
                        ajax: 'true'
                    }, function (j) {
                        var options;
                        for (var i = 0; i < j.length; i++) {
                            options += '<option value="' + j[i].Codigo + '">' + j[i].Nome + '</option>';
                        }
                        $('#cidade').html(options).show();
                    });
                }
            });

Isso funciona no meu servidor próprio, mas não consigo fazer funcionar no wordpress. Implementei o script JS através de um plug-in pra inserir JS nas páginas, mas o Wordpress não permite executar um arquivo PHP não registrado por ele (ou algo assim).

 

Poderiam me ajudar? Como faço pra fazer com que meu script AJAX requisite a consulta no banco do wordpress onde estão as cidades?

 

Espero ter sido claro.

Share this post


Link to post
Share on other sites

Eu consegui fazer adicionando as funções do arquivo functions.php dentro da pasta do meu tema. Pra quem precisa executar o ajax dentro do wordpress, pesquise sobre como fazer através do arquivo functions.php

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Flaviaac
      Boa tarde pessoal,
       
      Sou iniciante em Desenvolvimento Web e não estou conseguindo resolver um problema no meu código, se alguém puder me ajudar agradeço imensamente.
       

      Vamos lá!
       
      Na tela de cadastro eu tenho um campo tipo select, onde escolho o tipo de documento, e no campo de baixo eu tenho um tipo text que mostrará a quantidade de anos para descarte deste documento. Então quando o usuário selecionar um dos documentos no campo de cima automaticamente deve aparecer o valor do tempo de descarte no campo de baixo, e ai sim o usuário poderá cadastrar o documento em si.
       
      Obs.: estou ignorando o restante dos campos de cadastro pois não são relevantes para este problema.
       

       
      Este evento está funcionando perfeitamente, o problema é que quando clico no botão "cadastrar" o campo de "periodicidade de descarte" não está salvando no bando de dados com o valor exibido, mas sim como zero.
       
      No arquivo processa_cadastro.php quando dou um var_dump em $periodo_doc ele imprime: int(0)
       
       
      Não consegui identificar onde estou errando.
       
      Por favor, poderiam me dar uma luz.
      Obrigada!
       
       
       
      Segue os códigos para entendimento.
       
       
      tipo_arquivo.sql:
      -- phpMyAdmin SQL Dump -- version 5.2.0 -- https://www.phpmyadmin.net/ -- -- Host: localhost -- Tempo de geração: 12-Jul-2022 às 14:46 -- Versão do servidor: 10.4.24-MariaDB -- versão do PHP: 7.4.29 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Banco de dados: `sistemadescarte` -- -- -------------------------------------------------------- -- -- Estrutura da tabela `tipo_arquivo` -- CREATE TABLE `tipo_arquivo` ( `id_tipo` int(11) NOT NULL, `nome_tipo` varchar(255) NOT NULL, `descarte` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Extraindo dados da tabela `tipo_arquivo` -- INSERT INTO `tipo_arquivo` (`id_tipo`, `nome_tipo`, `descarte`) VALUES (1, 'Ata Extraordinária', 5), (2, 'Ata Ordinária', 5), (3, 'carta', 8), (4, 'Memorando', 10), (5, 'Memorando Circular', 8), (6, 'Ofício', 5), (7, 'Ofício Circular', 5), (8, 'Processo', 10); -- -- Índices para tabelas despejadas -- -- -- Índices para tabela `tipo_arquivo` -- ALTER TABLE `tipo_arquivo` ADD PRIMARY KEY (`id_tipo`), ADD KEY `id_tipo` (`id_tipo`); -- -- AUTO_INCREMENT de tabelas despejadas -- -- -- AUTO_INCREMENT de tabela `tipo_arquivo` -- ALTER TABLE `tipo_arquivo` MODIFY `id_tipo` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;  
      documento.sql:
      -- phpMyAdmin SQL Dump -- version 5.2.0 -- https://www.phpmyadmin.net/ -- -- Host: localhost -- Tempo de geração: 12-Jul-2022 às 14:47 -- Versão do servidor: 10.4.24-MariaDB -- versão do PHP: 7.4.29 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Banco de dados: `sistemadescarte` -- -- -------------------------------------------------------- -- -- Estrutura da tabela `documento` -- CREATE TABLE `documento` ( `ID_DOC` int(11) NOT NULL, `NUMERO_DOC` varchar(20) NOT NULL, `TIPO_DOC` int(11) NOT NULL, `INTERESSADO` varchar(255) NOT NULL, `TITULO` varchar(400) NOT NULL, `OBS` varchar(400) DEFAULT NULL, `PERIODICIDADE` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Extraindo dados da tabela `documento` -- INSERT INTO `documento` (`ID_DOC`, `NUMERO_DOC`, `TIPO_DOC`, `INTERESSADO`, `TITULO`, `OBS`, `PERIODICIDADE`) VALUES (2, '788741-2019/65', 1, 'admin', 'Ata extraordinária de 2018', 0), (3, '888888-2021/21', 3, 'gerencia', 'Carta a gerencia', 0), (4, '333653-2022/1', 8, 'teste', 'Processo', 'teste na observação', 0), (6, '224568-2022/3', 2, 'teste', 'Ata Ordinária', 0); -- -- Índices para tabelas despejadas -- -- -- Índices para tabela `documento` -- ALTER TABLE `documento` ADD PRIMARY KEY (`ID_DOC`), ADD KEY `TIPO_DOC` (`TIPO_DOC`); -- -- AUTO_INCREMENT de tabelas despejadas -- -- -- AUTO_INCREMENT de tabela `documento` -- ALTER TABLE `documento` MODIFY `ID_DOC` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2295; -- -- Restrições para despejos de tabelas -- -- -- Limitadores para a tabela `documento` -- ALTER TABLE `documento` ADD CONSTRAINT `documento_ibfk_1` FOREIGN KEY (`TIPO_DOC`) REFERENCES `tipo_arquivo` (`id_tipo`); COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;  
       
      cadastro.php:
      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript" src="js/descarte.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <title>Cadastro de Documento</title> </head> <form action="" method="post"> <div class="form-row"> <!-- tipo de documento --> <div class="form-group col-md-1"> <label>Tipo de Documento</label> <select name="tipo" id="tipo" class="form-control" onchange="funcaoDescarte()"> <option selected>Selecione...</option> <!--------------- P H P ----------------> <?php while($row = $result->fetch_assoc()) { echo "<option value=".$row['id_tipo'].">".$row['nome_tipo']."</option>"; } ?> <!--------------- F I M P H P ---------> </select> </div> </div> <div class="form-row"> <!-- tempo para descarte --> <div class="form-group col-md-2"> <span class="form-text">Periodicidade para descarte deste documento:</span> <input name="descarte" type="text" class="form-control" id="descarte" value="" disabled=""> <input type="text" readonly class="form-control-plaintext" value="Anos"> </div> </div> <!------------------- botão cadastrar e limpar ----------------------------------------------> &nbsp; </br> <div class="form-row"> <!-- Cadastrar e Limpar --> <div class="form-group col-md-4"> <button type="submit" name="cadastrar_doc" class="btn btn-primary">Cadastrar</button> <button type="reset" name="limpar_doc" class="btn btn-primary">Limpar campos</button> </div> </div> </form  
      descarte.js:
      function funcaoDescarte(){ var x = document.getElementById("tipo").value; y = $.ajax({ url:"periodicidade.php", method:"POST", data:{ id : x }, success:function(data){ $("#descarte").val(data); } }) }  
      periodicidade.php:
      <?php include_once "conexao.php"; $k = $_POST['id']; $k = trim($k); $sql = "SELECT * FROM tipo_doc WHERE id_tipo ='{$k}'"; $result = $conn->query($sql); while($row = $result->fetch_assoc()){ echo $row['descarte']; } ?>  
      processa_cadastro.php:
      <?php $tipo_doc = intval(filter_input(INPUT_POST, 'tipo', FILTER_SANITIZE_NUMBER_INT)); $periodo_doc = intval(filter_input(INPUT_POST, 'descarte', FILTER_SANITIZE_NUMBER_INT)); if(isset($_POST['cadastrar_doc'])) { if($tipo_doc !='' || $periodo_doc !='') { $stmt = $conn->prepare("INSERT INTO documento (tipo_doc, periodicidade) VALUES (?, ?)"); $stmt->bind_param("ii", $tipo_doc, $periodo_doc); $stmt->execute(); echo "<span class='alert alert-success'> Cadastrado com sucesso</span>"; $erro = mysqli_error($conn); echo "Ocorreu o seguinte erro: ", '"', $erro, '"<br>'; }else{ echo "<span class='alert alert-danger'> Não cadastrado</span>"; $erro = mysqli_error($conn); echo "Ocorreu o seguinte erro: ", '"', $erro, '"<br>'; } } $stmt->close(); $conn->close(); ?>  
       
    • By eduardodsilvaq
      Erro retornado no console do navegador: 400 bad request
      Rastreei o erro ate essa parte no arquivo admin-ajax.php mudando o valor de resposta de 0 para 1:
      if ( is_user_logged_in() ) { // If no action is registered, return a Bad Request response. if ( ! has_action( "wp_ajax_{$action}" ) ) { wp_die( '0', 400 ); } Tentei de tudo, mas infelizmente nao entendi oq realmente significa esse login e como ele funciona.
      Vi algumas pessoas tendo problema com o host, no meu caso estou usando hostinger. (Nao creio que isso e relevante mas ta ai.)
       
      Código utilizado:
       
      Javascript
      function formValidation() { event.preventDefault(); var name = document.forms["contactForm"]["name"].value; var email = document.forms["contactForm"]["email"].value; var subject = document.forms["contactForm"]["subject"].value; var message = document.forms["contactForm"]["message"].value; document.getElementById('status').innerHTML = ''; var errorMessage="<span class='error'>All fields are required.</span>"; var regEx = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; if (name.trim() == "" ||email.trim() == "" || subject.trim() == "" || message.trim() == "") { document.getElementById('status').innerHTML = errorMessage; return false; } if (!regEx.test(email)) { var errorMessage="<span class='error'>Invalid email.</span>"; document.getElementById('status').innerHTML = errorMessage; return false; } processContactSubmit(); return true; } function processContactSubmit() { var request = new XMLHttpRequest(); request.open("POST", "/wp-admin/admin-ajax.php?action=process_contact_form"); request.onreadystatechange = function() { if(this.readyState === 4 && this.status === 200) { document.getElementById("status").innerHTML = this.responseText; } }; var myForm = document.getElementById("contactForm"); var formData = new FormData(contactForm); request.send(formData); } functions.php
      add_action('wp_ajax_nopriv_process_contact_form', 'process_contact_form'); add_action('wp_ajax_process_contact_form', 'process_contact_form'); //Retirar essa parte para error no console, no contrario ira aparecer no navegador o numero 0. function process_contact_form() { $to = "Recipient Email Address"; $subject = $_POST["subject"]; $headers = "Testing"; $message = $_POST["message"]; $attachments = ""; $sent = wp_mail($to, $subject, $message, $headers, $attachments); if (! $sent) { echo "<span class='error'>Problem in sending mail.</span>"; } else { echo "<span class='success'>Hi, thank you for the message.</span>"; } wp_die(); } Html
      <form name="contactForm" id="contactForm" method="post" onsubmit="return formValidation()" action=""> <p class="comment-form-comment"><textarea id="message" name="message" required="" placeholder="" aria-required="true"></textarea></p> <p class="comment-form-author"><label for="author">Nome: </label> <input id="name" name="name" required="" size="30" type="text" value=" " /></p> <p class="comment-form-author about"><label for="author">Assunto: </label> <input id="subject" name="subject" required="" size="40" type="text" value=" " /></p> <p class="comment-form-email"><label for="email">Email: </label> <input id="email" name="email" required="" size="30" type="text" value="" /></p> <p class="form-submit"><input id="submit" class="submit" name="email_contato" type="submit" value="Enviar" /></p> </form>&nbsp; <h3><div id="status"></div></h3>  
    • By Jack Oliveira
      Ola pessoal estou com uma dificuldade ou melhor com erro ao fazer a leitura do arquivo por ajax
      Pelo meus calculos esta certo a forma que fiz, porem nao me mostra o resultado
      Espero que possam dar uma ideia do que seria e de como resolver
       
      este é o erro que retorna
      <br /> <b>Notice</b>: Undefined index: length in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>31</b><br /> <br /> <b>Notice</b>: Undefined index: start in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>32</b><br /> <br /> <b>Notice</b>: Undefined index: length in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>32</b><br /> You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1  
      No arquivo php esta assim
      <?php session_start(); header('Content-Type: application/json'); require('./database/config.php'); require('./database/config.database.php'); require_once('./includes/funcoes.php'); //require('ssp.class.php'); $Campos = "'DL.id, DL.titulo, DL.telefone, DC.titulo as CityTitulo'"; $column = array("DL.id", "DL.titulo", "DC.titulo", "DL.destaque"); $queryIJ = 'directory_listing DL inner join directory_cidades DC on(DL.cidade = DC.titulo)'; $query = "WHERE DC.status=1 AND DL.status=1 "; if (isset($_POST["is_category"])) { $query = "DL.cidade = '" . $_POST["is_category"] . "' AND "; } if (isset($_POST["search"]["value"])) { $query = '(DL.id LIKE "%' . $_POST["search"]["value"] . '%" OR DL.titulo LIKE "%' . $_POST["search"]["value"] . '%" OR DL.telefone LIKE "%' . $_POST["search"]["value"] . '%") '; } if (isset($_POST["order"])) { $query = 'ORDER BY ' . $column[$_POST['order']['0']['column']] . ' ' . $_POST['order']['0']['dir'] . ' '; } else { $query = 'ORDER BY DL.id DESC '; } $query1 = ''; if ($_POST["length"] != 1) { $query1 = 'LIMIT ' . $_POST["start"]. ', ' . $_POST["length"]; } define('QUERYIJ', $queryIJ); define('CAMPOS', $Campos); define('QUERY', $query); define('QUERY1', $query1); $number_filter_row = DBCount(QUERYIJ,CAMPOS,QUERY); function ListarDirectoryEmpresaCidade($Q1 = QUERYIJ, $Camp = CAMPOS, $Query2 = QUERY, $Query3 = QUERY1) { $QueryInnerJoin = DBRead($Q1,$Camp, $Query2 .$Query3); return groupByEmpresaByCidade($QueryInnerJoin,'CityTitulo'); } function groupByEmpresaByCidade($array, $key) { $return = array(); foreach($array as $val) { $return[$val[$key]][] = $val; } return $return; } $data = array(); $ListarDirectoryEmpresa = ListarDirectoryEmpresaCidade(); foreach ($ListarDirectoryEmpresa as $ListarCidade) { //$ListarCidade[0]['CityTitulo'] foreach ($ListarCidade as $ListarDirectory) { //$ListarDirectory['titulo'] $sub_array = array(); $sub_array[] = $ListarDirectory["id"]; $sub_array[] = $ListarDirectory["titulo"]; $sub_array[] = $ListarCidade[0]['CityTitulo']; $sub_array[] = $ListarDirectory["telefone"]; $data[] = $sub_array; } } $result = DBCount('directory_listing','*'); $output = array( "draw" => intval($_POST["draw"]), "recordsTotal" => $result, "recordsFiltered" => $number_filter_row, "data" => $data ); echo json_encode($output); ?> Ja no html esta assim
       
      <div class="table-responsive"> <table id="list_data" class="table table-bordered table-striped"> <thead> <tr> <th>Id.</th> <th>Titulo</th> <th> <select name="directory_cidades" id="directory_cidades" class="form-control"> <option value="">Buscar Cidade</option> <?php $Query = DBRead('directory_cidades','*',"ORDER BY titulo ASC"); foreach($Query as $rows) { echo '<option value="' . $rows["titulo"] . '">' . $rows["titulo"] . '</option>'; } ?> </select> </th> <th>Telefone</th> </tr> </thead> </table> </div> No javascript esta assim
       
      <script type="text/javascript" language="javascript"> $(document).ready(function() { load_data(); function load_data(is_category) { var dataTable = $('#list_data').DataTable({ "processing": true, "serverSide": true, "order": [], "ajax": { url: "ajax-list.php", type: "POST", data: { is_category: is_category } }, "columnDefs": [{ "targets": [2], "orderable": false, }, ], }); } $(document).on('change', '#directory_cidades', function() { var directory_cidades = $(this).val(); $('#list_data').DataTable().destroy(); if (directory_cidades != '') { load_data(directory_cidades); } else { load_data(); } }); }); </script> Sei que o problema não esta no html e nem no javacript postei eles para melhor entender
    • By Roberto Pereira Lima Ribei
      Olá pessoal.
       
      O site do meu cliente tinha um problema nas buscas, como mostra a imagem:

       
      Na barra lateral, essa busca era filtrada pelo plugin Search & Filter com a opção de selecionar as categorias de Custom Post Types criadas com o ACF e CPT UI.
       
      A questão é que mesmo havendo vários posts com a palavra chave relacionada "olfato", somente uma publicação aparecia.
       
      Aparentemente, um conflito entre os plugins gerou a falha e consegui corrigir usando o ACF: Better Search.

       
      Só que nessa, ainda não mostrava também os resultados para publicações que constavam a palavra-chave somente em campos personalizados e perdemos a filtragem e o seletor (feito pelo Search & Filter).
       
      Consegui resolver a busca. O post "Teste para busca" tem a palavra-chave somente no campo personalizado.
      Mostrar as categorias de publicações do CPT UI, consegui resolver com o o Plugin Custom Post Types Widget.
       

       
      Agora, preciso filtrar a amostragem dessas categorias de acordo com os resultados de busca e ter um seletor, para que o usuário possa selecionar um ou mais categorias e mostrar apenas os posts relacionados a elas.
       
      Eu encontrei esse código que aprimora os resultados da busca nativa do wordpress, mas não encontro o arquivo onde eu devo colocar esse código. Quando eu fiz as alterações tanto no arquivo seach.php quanto functions.php, o site quebrou. Não faço ideia se errei os parâmetros, argumentos ou o que fiz de errado. (novato)
       
      Essa é a página onde aparecem os resultados:
      https://geroprodev.dbai.com.br/?s=olfato&amp;post_type[]=post&amp;post_type[]=page&amp;post_type[]=acervo&amp;post_type[]=produtos&amp;post_type[]=projetos&amp;post_type[]=evento&amp;fs=1
       
      Essa é a página de busca:
      https://geroprodev.dbai.com.br/busca-teste/
       
      Esse é o link código que encontrei no Github para extender a pesquisa nativa com o Search & Filter que eu quero usar como referência (que eu não encontrei onde vou incluir esse código):
      https://support.searchandfilter.com/forums/topic/compatibility-with-acf-better-search/
       
      https://gist.github.com/fiskhandlarn/f6f86c99e59f62d72ac2ce10be12dc1a/
       
      ☼ IMPORTANTE ☼
      O tema utilizado é o Avada.
      Mesmo com vários plugins sendo indicados para resolver esse problema, neste caso, nenhum deles resolveu.
      A solução mais simples que encontrei foi usar a "Search CPT" e o plugin ACF: Better Search.
      O que eu não encontrei em nenhuma pasta do CPT foi o arquivo search.php ou relacionado.
       

      E esse é o código:
       
      <?php /* ############################## ########### Search ########### ############################## Included are steps to help make this script easier for other to follow All you have to do is add custom ACF post types into Step 1 and custom taxonomies into Step 10 I also updated this work to include XSS and SQL injection projection [list_searcheable_acf list all the custom fields we want to include in our search query] @return [array] [list of custom fields] */ // Define list of ACF fields you want to search through - do NOT include taxonomies here function list_searcheable_acf(){ $list_searcheable_acf = array( "your", "acf", "non-repeater", "field-names", "here", "repeater" => array( "repeater-sub-field1", "repeater-sub-field2" ) ); return $list_searcheable_acf; } /* * [advanced_custom_search search that encompasses ACF/advanced custom fields and taxonomies and split expression before request] * @param [query-part/string] $search [the initial "where" part of the search query] * @param [object] $wp_query [] * @return [query-part/string] $search [the "where" part of the search query as we customized] * modified from gist: https://gist.github.com/FutureMedia/9581381/73afa809f38527d57f4213581eeae6a8e5a1340a * see https://vzurczak.wordpress.com/2013/06/15/extend-the-default-wordpress-search/ * credits to Vincent Zurczak for the base query structure/spliting tags section and Sjouw for comment cleanup */ function advanced_custom_search( $search, $wp_query ) { global $wpdb; if ( empty( $search )) { return $search; } // 1- get search expression $terms_raw = $wp_query->query_vars[ 's' ]; // 2- check search term for XSS attacks $terms_xss_cleared = strip_tags($terms_raw); // 3- do another check for SQL injection, use WP esc_sql $terms = esc_sql($terms_xss_cleared); // 4- explode search expression to get search terms $exploded = explode( ' ', $terms ); if( $exploded === FALSE || count( $exploded ) == 0 ) { $exploded = array( 0 => $terms ); } // 5- setup search variable as a string $search = ''; // 6- get searcheable_acf, a list of advanced custom fields you want to search content in $list_searcheable_acf = list_searcheable_acf(); // 7- get custom table prefixes, thanks to Brian Douglas @bmdinteractive on github for this improvement $table_prefix = $wpdb->prefix; // 8- search through tags, inject each into SQL query foreach( $exploded as $tag ) { $search .= " AND ( (".$table_prefix."posts.post_title LIKE '%$tag%') OR (".$table_prefix."posts.post_excerpt LIKE '%$tag%') OR (".$table_prefix."posts.post_content LIKE '%$tag%') ". // 9- Adds to $search DB data from custom post types "OR EXISTS ( SELECT * FROM ".$table_prefix."postmeta WHERE post_id = ".$table_prefix."posts.ID AND ("; // 9b - reads through $list_searcheable_acf array to see which custom post types you want to include in the search string $metaStatements = array(); foreach ($list_searcheable_acf as $key => $searcheable_acf) { if ( is_array( $searcheable_acf ) ) { foreach ( $searcheable_acf as $repeater_acf ) { array_push( $metaStatements, "(meta_key LIKE '" . $key . "_%_" . $repeater_acf . "' AND meta_value LIKE '%$tag%')" ); } } else { array_push( $metaStatements, "(meta_key = '" . $searcheable_acf . "' AND meta_value LIKE '%$tag%')" ); } } $search .= join( $metaStatements, "\n OR " ); $search .= ") )". // 10- Adds to $search DB data from comments "OR EXISTS ( SELECT * FROM ".$table_prefix."comments WHERE comment_post_ID = ".$table_prefix."posts.ID AND comment_content LIKE '%$tag%' )". // 11 - Adds to $search DB data from taxonomies "OR EXISTS ( SELECT * FROM ".$table_prefix."terms INNER JOIN ".$table_prefix."term_taxonomy ON ".$table_prefix."term_taxonomy.term_id = ".$table_prefix."terms.term_id INNER JOIN ".$table_prefix."term_relationships ON ".$table_prefix."term_relationships.term_taxonomy_id = ".$table_prefix."term_taxonomy.term_taxonomy_id". // 11b- Add custom taxonomies here " WHERE ( taxonomy = 'your' OR taxonomy = 'custom' OR taxonomy = 'taxonomies' OR taxonomy = 'here' ) AND object_id = ".$table_prefix."posts.ID AND ".$table_prefix."terms.name LIKE '%$tag%' )". ")"; // closes $search } // closes foreach return $search; } // closes function advanced_custom_search // 12- use add_filter to put advanced_custom_search into the posts_search results add_filter( 'posts_search', 'advanced_custom_search', 500, 2 );  
      Preciso entender como modificar esses argumentos e onde é que vou inserir as categorias/subcategorias dos Custom Post Types e como filtrar nessa aba lateral.
      É possível fazer isso usando o próprio Custom Post Type Widget? Faço pela busca nativa ou pela busca do CPT?
       
       
      Obrigado desde já!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.