Come inviare correttamente un modulo di ricerca e visualizzare il risultato in una pagina indipendente
Ho implementato una funzione di ricerca nel mio sito WordPress che utilizza select box dipendenti dinamici.
Tuttavia, ho riscontrato il seguente problema:
Se seleziono solo il primo box, oppure i primi due box, e clicco il pulsante Search
, viene effettuato correttamente il redirect alla pagina dei risultati.
Ma se seleziono anche il terzo box, viene reindirizzato a una pagina con lo stesso URL della pagina dei risultati ma mostra il contenuto della homepage.
Controllando la Console di Chrome vedo questo errore:
Failed to load resource: the server responded with a status of 404 (Not Found)
Di seguito riporto tutto il codice relativo.
1. Parte front-end dei select box:
<form class="select-boxes" action="<?php echo site_url("/part-search-result/"); ?>" method="POST" target="_blank">
<?php include(__DIR__.'/inc/part-search.php'); ?>
</form>
2. part-search.php
<?php
include( __DIR__.'/db-config.php' );
$query = $db->query("SELECT * FROM ps_manufact WHERE status = 1 ORDER BY manufact_name ASC");
$rowCount = $query->num_rows;
?>
<select name="manufacturer" id="manufact" onchange="manufactText(this)">
<option value="">Seleziona Produttore</option>
<?php
if($rowCount > 0){
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['manufact_id'].'">'.$row['manufact_name'].'</option>';
}
}else{
echo '<option value="">Nessun produttore disponibile</option>';
}
?>
</select>
<input id="manufacturer_text" type="hidden" name="manufacturer_text" value=""/>
<script type="text/javascript">
function manufactText(ddl) {
document.getElementById('manufacturer_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="type" id="type" onchange="typeText(this)">
<option value="">Seleziona prima il Produttore</option>
</select>
<input id="type_text" type="hidden" name="type_text" value=""/>
<script type="text/javascript">
function typeText(ddl) {
document.getElementById('type_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="year" id="year" onchange="yearText(this)">
<option value="">Seleziona prima il Tipo</option>
</select>
<input id="year_text" type="hidden" name="year_text" value=""/>
<script type="text/javascript">
function yearText(ddl) {
document.getElementById('year_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<select name="model" id="model" onchange="modelText(this)">
<option value="">Seleziona prima l'Anno</option>
</select>
<input id="model_text" type="hidden" name="model_text" value=""/>
<script type="text/javascript">
function modelText(ddl) {
document.getElementById('model_text').value = ddl.options[ddl.selectedIndex].text;
}
</script>
<input type="submit" name="search" id="search" value="Cerca">
<script type="text/javascript">
jQuery(function($) {
$('#manufact').on('change',function(){
var manufactID = $(this).val();
if(manufactID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'manufact_id='+manufactID,
success:function(html){
$('#type').html(html);
$('#year').html('<option value="">Seleziona prima il Tipo</option>');
}
});
}else{
$('#type').html('<option value="">Seleziona prima il Produttore</option>');
$('#year').html('<option value="">Seleziona prima il Tipo</option>');
}
});
$('#type').on('change',function(){
var typeID = $(this).val();
if(typeID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'type_id='+typeID,
success:function(html){
$('#year').html(html);
$('#model').html('<option value="">Seleziona prima l'Anno</option>');
}
});
}else{
$('#year').html('<option value="">Seleziona prima il Tipo</option>');
$('#model').html('<option value="">Seleziona prima l'Anno</option>');
}
});
$('#year').on('change',function(){
var yearID = $(this).val();
if(yearID){
$.ajax({
type:'POST',
url:'<?php echo home_url('wp-content/themes/myTheme/inc/ajax-data.php') ?>',
data:'year_id='+yearID,
success:function(html){
$('#model').html(html);
}
});
}else{
$('#model').html('<option value="">Seleziona prima l'Anno</option>');
}
});
});
</script>
3. ajax-data.php
<?php
include( __DIR__.'/db-config.php' );
if(isset($_POST["manufact_id"]) && !empty($_POST["manufact_id"])){
$query = $db->query("SELECT * FROM ps_type WHERE manufact_id = ".$_POST['manufact_id']." AND status = 1 ORDER BY type_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Seleziona Tipo</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['type_id'].'">'.$row['type_name'].'</option>';
}
}else{
echo '<option value="">Nessun tipo disponibile</option>';
}
}
if(isset($_POST["type_id"]) && !empty($_POST["type_id"])){
$query = $db->query("SELECT * FROM ps_year WHERE type_id = ".$_POST['type_id']." AND status = 1 ORDER BY year_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Seleziona Anno</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['year_id'].'">'.$row['year_name'].'</option>';
}
}else{
echo '<option value="">Nessun anno disponibile</option>';
}
}
if(isset($_POST["year_id"]) && !empty($_POST["year_id"])){
$query = $db->query("SELECT * FROM ps_model WHERE year_id = ".$_POST['year_id']." AND status = 1 ORDER BY model_name ASC");
$rowCount = $query->num_rows;
if($rowCount > 0){
echo '<option value="">Seleziona Modello</option>';
while($row = $query->fetch_assoc()){
echo '<option value="'.$row['model_id'].'">'.$row['model_name'].'</option>';
}
}else{
echo '<option value="">Nessun modello disponibile</option>';
}
}
?>
4. part-search-result.php
<?php
if (isset($_POST['search'])) {
$clauses = array();
if (isset($_POST['manufacturer_text']) && !empty($_POST['manufacturer_text'])) {
$clauses[] = "`manufacturer` = '{$_POST['manufacturer_text']}'";
}
if (isset($_POST['type_text']) && !empty($_POST['type_text'])) {
$clauses[] = "`type` = '{$_POST['type_text']}'";
}
if (isset($_POST['year_text']) && !empty($_POST['year_text'])) {
$clauses[] = "`year` = '{$_POST['year_text']}'";
}
if (isset($_POST['model_text']) && !empty($_POST['model_text'])) {
$clauses[] = "`model` = '{$_POST['model_text']}'";
}
$where = !empty( $clauses ) ? ' where '.implode(' and ',$clauses ) : '';
$sql = "SELECT * FROM `wp_products` ". $where;
$result = filterTable($sql);
} else {
$sql = "SELECT * FROM `wp_products` WHERE `manufacturer`=''";
$result = filterTable($sql);
}
function filterTable($sql) {
$con = mysqli_connect("localhost", "root", "root", "i2235990_wp2");
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$filter_Result = mysqli_query($con, $sql);
return $filter_Result;
}
?>
<?php get_header(); ?>
<div class="container">
<div id="products" class="row list-group">
<?php while ( $rows = mysqli_fetch_array($result) ): ?>
<div class="item col-xs-12 col-sm-4 col-md-4 col-lg-4">
<div class="thumbnail">
<?php
echo '<img name="product-image" class="group list-group-image hvr-bob" src=' . $rows['image_url'] . ' width="400px" height="250px" alt="Immagine prodotto" />';
?>
<div class="caption">
<h4 class="group inner list-group-item-heading">
<?php
echo "Produttore:\t".$rows['manufacturer'].'<br>';
echo "Tipo:\t".$rows['type'].'<br>';
echo "Anno:\t".$rows['year'].'<br>';
echo "Modello:\t".$rows['model'].'<br>';
echo '<br>';
echo "Descrizione:\t".$rows['description'].'<br>';
?>
</h4>
</div>
</div>
</div>
<?php endwhile; ?>
</div>
</div>
<?php get_footer(); ?>
Pensavo potesse esserci un problema con l'uso non corretto di POST in WordPress, ho trovato un tutorial: Gestire le richieste POST in WordPress
Tuttavia, ho già usato action
per il redirect alla pagina dei risultati, non ho idea di come risolvere il mio problema.
Per creare la tua funzionalità di ricerca indipendente, segui questi passaggi.
1- Hai bisogno di un modulo per inviare i dati. Ecco un semplice modulo che può farlo per te:
<form method="post" name="car-select" action="<?php echo site_url('/my-page/'); ?>">
<select name="make">
<option value="benz">Mercedes</option>
<option value="bmw">BMW</option>
<option value="audi">Audi</option>
</select>
<select name="type">
<option value="sedan">Berlina</option>
<option value="coupe">Coupé</option>
</select>
<input type="submit" value="Trova l'auto dei miei sogni!"/>
</form>
Dove /my-page/
è lo slug della pagina che creeremo successivamente.
2- Una funzione per gestire i risultati della ricerca. Ecco una funzione base che cerca le auto in base ai valori inseriti:
function my_custom_search() {
$car_make = $_POST['make'];
$car_type = $_POST['type'];
$car_query = new WP_Query ( array (
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array (
'taxonomy' => 'car_make',
'field' => 'slug',
'terms' => $car_make,
),
array (
'taxonomy' => 'car_type',
'field' => 'slug',
'terms' => $car_type,
),
),
));
if ($car_query->have_posts) {
while($car_query->have_posts()){
$car_query->the_post();
get_template_part('IL TEMPLATE CHE VUOI UTILIZZARE');
}
}
// Paginazione qui
}
3- Una pagina per mostrare i risultati della ricerca. Ricordi lo slug del primo requisito? Crea una pagina nella directory del tuo template e chiamala page-my-search-template.php
. Poi includi questa funzione nel tuo nuovo template di pagina, dove preferisci:
my_custom_search();
Dovrai poi creare una pagina con lo slug my-page
(quello nell'action del form), utilizzando il template appena creato.
Ora, ogni invio del form attiverà una query di ricerca e mostrerà i risultati nel tuo template di ricerca personalizzato!
ASPETTA !! Voglio la mia paginazione !!
Puoi implementare la tua paginazione nella funzione di ricerca, tuttavia consiglio di usare WP-PageNavi per chi non ha abbastanza competenze per scrivere uno script di paginazione. Installa il plugin e imposta la query così:
wp_pagenavi(array( 'query' => $car_query ));
In questo modo avrai una paginazione per la tua pagina di ricerca personalizzata, semplice e veloce.

Non hai bisogno di query mySQL. La ricerca predefinita di WordPress invia "s" con l'URL. Puoi ottenerlo con un semplice form con input nascosti.
<form role="search" method="get" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<input type="hidden" name="action" value="careers_search">
<input type="text" name="search-career" value="Cerca...">
<input type="submit" class="form-submit" value="Invia">
</form>
Questo form si invierà sullo stesso URL. Dopo l'invio, ecco cosa dovrebbe succedere:
<?php
if( isset( $_GET['careers_search'] ) ) {
// Il tuo codice va qui...
}
?>
