Redirecționarea formularului către aceeași pagină
Creez propria mea temă. În tema mea am o pagină care afișează postări personalizate folosind o interogare customizată. Am adăugat un formular în această pagină. Formularul conține 2 liste derulante care conțin valori din metadatele postării mele personalizate. Vreau ca atunci când utilizatorul selectează valori din aceste liste și face click pe submit, WordPress să afișeze din nou aceeași pagină și să adauge parametrii submitați la interogarea mea personalizată (ca un fel de filtrare a unui tabel).
Problema este că atunci când se face click pe submit, WordPress redirecționează către index.php în loc să rămână pe pagina mea.
Declarația formularului meu este:
<form action='"<?php echo get_page_link(SHIURIM_PAGE)?> "' method='get'>";
Ar trebui să pun altceva în atributul action?
Mulțumesc anticipat.
Codul complet al paginii mele:
<?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="Imagine antet" title="Imagine antet pagină contact" />
</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
// Funcție pentru obținerea parametrilor
function getParam($paramName, $defaultValue) {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (!empty($_GET[$paramName])) {
return $_GET[$paramName];
}
}
else { // este 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;
// Pune obiectul interogării implicite într-o variabilă temporară
$tmp_query = $wp_query;
// Acum șterge-l complet
$wp_query = null;
// Repopulează globalul cu interogarea noastră personalizată
$wp_query = $shiurim_query;
$big = 999999999; // avem nevoie de un număr întreg improbabil
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('Nu s-a găsit nimic'); ?></p>
<?php
endif;
// Restaurează obiectul interogării originale
$wp_query = $tmp_query;
// Fii amabil; resetează
wp_reset_postdata();
?>
</div>
</div>
</div>
</div>
<div class="clear"></div>
</div>
<?php get_footer(); ?>
search-form.php (Îl folosesc și în index.php).
<?php
/**
* Panou de căutare
*/
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 .= " După rav";
$html .= " <select name='search_rav'>";
$html .= " <option value='0'>Toți ravii</option>";
foreach ($rabanimList as $rav) {
$isSelected = ' ';
if ($rav['id'] == $searchRav) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $rav['id'] . "'" . $isSelected . ">" . $rav['title'] . "</option>";
}
$html .= "</select>";
$html .= " După sidra";
$html .= " <select name='search_sidra'>";
$html .= " <option value='0'>Toate sidrele</option>";
foreach ($sdatorList as $sidra) {
$isSelected = ' ';
if ($sidra['id'] == $searchSidra) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $sidra['id'] . "'" . $isSelected . ">" . $sidra['title'] . "</option>";
}
$html .= "</select>";
$html .= " Text liber";
$html .= " <input type='text' name='search_text' class='searchFreeText' value='" . $searchText . "'/>";
$html .= " <input type='submit' value='Caută' />";
$html .= " </form>";
$html .= "</div>";
echo $html;
}
?>
Nu funcționează. Încă se redirecționează către index.php. Link-ul get_page_link(SHIURIM_PAGE) pe care l-am pus este un link direct către pagină, dar nu ajută.

Dacă pun method="post" funcționează, dar atunci am probleme cu parametrii de paginare.

Probabil folosești nume de parametri care sunt folosite și intern de WordPress. Asigură-te că le faci unice!

Parametrii mei sunt: search_rav, search_sidra și search_text. Sunt folosiți de WordPress?

Nu știu. Sigur nu mai sunt alții? Încearcă să verifici folosind Chrome sau firebug care sunt variabilele post...

Am pus soluția și explicația la finalul întrebării mele (Stackoverflow nu m-a lăsat să răspund la propria întrebare).

Am găsit problema și soluția.
Problema:
Folosind:
<form action="<?php echo get_page_link(66) ?>" method="get">
nu funcționează corect. În HTML generat se vede:
<form action="http://mySite/?page_id=66" method="get">
Dar la trimiterea formularului, parametrul ?page_id=66 dispare. Astfel WordPress nu știe să redirecționeze cererea către șablonul paginii mele.
Soluția:
Acțiunea formularului va trimite către pagina principală și vom adăuga un câmp ascuns care va păstra page_id.
<form action="<?php echo home_url ?>" method="get">
<input type='hidden' name='page_id' value='66'>
Succes!

O altă modalitate de a trimite un formular către aceeași pagină este utilizarea variabilelor server PHP:
echo "<form name='myForm' action='http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]."' method='post'>";
Folosirea funcției the_permalink() poate de asemenea să eșueze, deoarece s-ar putea să fiți într-o buclă și the_permalink() returnează permalink-ul obiectului $post procesat în prezent de buclă în sine.
