Reindirizzamento dell'azione del form alla stessa pagina
Sto creando un tema personalizzato. Nel mio tema ho una pagina che visualizza post personalizzati utilizzando una query personalizzata. Ho aggiunto un form a questa pagina. Il form contiene 2 combobox che contengono valori dei metadati del mio post personalizzato. Voglio che quando l'utente seleziona i valori da questi combobox e clicca su submit, WordPress mostri nuovamente la stessa pagina e aggiunga i parametri del submit alla mia query personalizzata (come il filtraggio di una tabella).
Il problema è che quando si clicca sul submit, WordPress reindirizza a index.php invece che alla mia pagina.
La mia dichiarazione del form è:
<form action='"<?php echo get_page_link(SHIURIM_PAGE)?> "' method='get'>";
Devo inserire qualcos'altro nell'action?
Grazie in anticipo.
Il mio codice completo della pagina:
<?php
/*
Template Name: Pagina Shiurim
*/
require 'search-form.php';
?>
<?php get_header();
global $THEME_PATH;
global $IMAGES_PATH;
?>
<link rel="stylesheet" type="text/css" href="<?php _e($THEME_PATH)?>/shiurim.css">
<div id="page-header-pic">
<img src='<?php _e($IMAGES_PATH)?>/contact-header.jpg' alt="immagine header" title="Immagine intestazione pagina" />
</div>
<div class="page-title">
<?php wp_title(); ?>
</div>
<div class="areaBg">
<div class="page-content-full">
<div class="panel">
<div class="panel-title"></div>
<div class="panel-content">
<div id="pageContentId">
<?php
// Funzione per ottenere i parametri
function getParam($paramName, $defaultValue) {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (!empty($_GET[$paramName])) {
return $_GET[$paramName];
}
}
else { // è un post
if (!empty($_POST[$paramName])) {
return $_POST[$paramName];
}
}
return $defaultValue;
}
$pageIndex = getParam('paged', 0);
$searchRav = getParam(SEARCH_RAV, 0);
$searchSidra = getParam(SEARCH_SIDRA, 0);
$searchText = getParam(SEARCH_TEXT, "");
$searchText = trim($searchText);
$queryArgs = array (
'post_type' => array( POST_TYPE_SHIUR ),
'orderby' => 'title',
'order' => 'ASC',
'paged' => $pageIndex
);
$paginateSearchArgs = array();
$metaQuery = array();
if ($searchRav != 0) {
$metaQuery[] = array(
'key' => POST_TYPE_RAV,
'value' => $searchRav
);
$paginateSearchArgs[SEARCH_RAV] = $searchRav;
}
if ($searchSidra != 0) {
$metaQuery[] = array(
'key' => POST_TYPE_SIDRA,
'value' => $searchSidra
);
$paginateSearchArgs[SEARCH_SIDRA] = $searchSidra;
}
if (count($metaQuery) > 0) {
$queryArgs['meta_query'] = $metaQuery;
}
if (! empty($searchText)) {
$queryArgs['s'] = $searchText;
$paginateSearchArgs[SEARCH_TEXT] = $searchText;
}
?>
<div id="shiurimSearchPanel">
<?php renderSearchFrom($searchRav, $searchSidra, $searchText); ?>
</div>
<div>
<?php
//query_posts($queryArgs);
$shiurim_query = new WP_Query( $queryArgs );
global $wp_query;
// Metti l'oggetto query predefinito in una variabile temporanea
$tmp_query = $wp_query;
// Ora cancellalo completamente
$wp_query = null;
// Ripopola il global con la nostra query personalizzata
$wp_query = $shiurim_query;
$big = 999999999; // serve un numero intero improbabile
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'prev_text' => '<<',
'next_text' => '>>'
) );
?>
</div>
<?php
$is_first = true;
if ( $shiurim_query->have_posts() ) : while ( $shiurim_query->have_posts() ) : $shiurim_query->the_post();
?>
<?php if (!$is_first) { ?>
<div class='shiurSeperator'></div>
<?php } ?>
<?php
$is_first = false;
get_template_part( "content", "shiur-list" );
?>
<?php endwhile; else: ?>
<p><?php _e('Nessun risultato trovato'); ?></p>
<?php
endif;
// Ripristina l'oggetto query originale
$wp_query = $tmp_query;
// Sii gentile; riavvolgi
wp_reset_postdata();
?>
</div>
</div>
</div>
</div>
<div class="clear"></div>
</div>
<?php get_footer(); ?>
search-form.php (Lo uso anche in index.php).
<?php
/**
* Pannello di ricerca
*/
function renderSearchFrom($searchRav = array(), $searchSidra = array(), $searchText = "") {
$rabanimList = getPostArrayResult(POST_TYPE_RAV);
$sdatorList = getPostArrayResult(POST_TYPE_SIDRA);
$html = "<div id='search-panel'>";
$html .= " <form action='" . get_page_link(SHIURIM_PAGE). "' method='post'>";
$html .= " Per rav";
$html .= " <select name='search_rav'>";
$html .= " <option value='0'>Tutti i rav</option>";
foreach ($rabanimList as $rav) {
$isSelected = ' ';
if ($rav['id'] == $searchRav) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $rav['id'] . "'" . $isSelected . ">" . $rav['title'] . "</option>";
}
$html .= "</select>";
$html .= " Per sidra";
$html .= " <select name='search_sidra'>";
$html .= " <option value='0'>Tutte le sidra</option>";
foreach ($sdatorList as $sidra) {
$isSelected = ' ';
if ($sidra['id'] == $searchSidra) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $sidra['id'] . "'" . $isSelected . ">" . $sidra['title'] . "</option>";
}
$html .= "</select>";
$html .= " Testo libero";
$html .= " <input type='text' name='search_text' class='searchFreeText' value='" . $searchText . "'/>";
$html .= " <input type='submit' value='Cerca' />";
$html .= " </form>";
$html .= "</div>";
echo $html;
}
?>
Non funziona. Continua a ricadere sull'index.php. Il get_page_link(SHIURIM_PAGE) che ho inserito è un link diretto alla pagina, ma non aiuta.

Se inserisco method="post" funziona, ma poi ho problemi con i parametri di paginazione.

Probabilmente stai usando nomi di parametri che sono utilizzati internamente da WordPress. Assicurati di renderli unici!

I miei parametri sono: search_rav, search_sidra e search_text. Vengono utilizzati da Wordpress?

Non lo so. Sicuro che non ce ne siano altri? Prova a controllare usando Chrome o firebug quali sono le variabili post...

Ho inserito la soluzione e la spiegazione in fondo alla mia domanda (Stackoverflow non mi ha permesso di rispondere alla mia stessa domanda).

Ho trovato il problema e la soluzione.
Il problema:
Usando:
<form action="<?php echo get_page_link(66) ?>" method="get">
non funziona bene. Nell'HTML generato vedo:
<form action="http://mySite/?page_id=66" method="get">
Ma quando si invia il form, il parametro ?page_id=66 scompare. Quindi WordPress non sa reindirizzare la richiesta al mio template di pagina.
La soluzione:
L'action deve puntare alla home page e aggiungere un campo nascosto che conterrà il page_id.
<form action="<?php echo home_url ?>" method="get">
<input type='hidden' name='page_id' value='66'>
Buona fortuna.

Un altro modo per inviare un form alla stessa pagina è utilizzare le variabili di server php:
echo "<form name='myForm' action='http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]."' method='post'>";
Anche l'uso della funzione the_permalink() potrebbe fallire, perché potresti essere all'interno di un loop e the_permalink() restituisce il permalink dell'oggetto $post attualmente elaborato dal loop stesso.
