Перенаправление формы на ту же страницу
Я создаю собственную тему. На одной из страниц я отображаю пользовательские записи с помощью custom query. Я добавил форму на эту страницу. Форма содержит 2 выпадающих списка со значениями meta данных моих пользовательских записей. Я хочу, чтобы когда пользователь выбирал значения из этих списков и нажимал кнопку отправки, WordPress показывал ту же страницу и добавлял параметры отправки в мой пользовательский запрос (что-то вроде фильтрации таблицы).
Проблема в том, что при нажатии на кнопку отправки WordPress перенаправляет на index.php вместо моей страницы.
Мое объявление формы:
<form action='"<?php echo get_page_link(SHIURIM_PAGE)?> "' method='get'>";
Нужно ли мне указать что-то другое в action?
Заранее спасибо.
Мой полный код страницы:
<?php
/*
Template Name: Shiurim page
*/
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="Изображение заголовка" title="Заголовок страницы">
</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
// Получение параметра из GET или POST запроса
function getParam($paramName, $defaultValue) {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (!empty($_GET[$paramName])) {
return $_GET[$paramName];
}
}
else { // это 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;
// Сохраняем оригинальный объект запроса во временную переменную
$tmp_query = $wp_query;
// Очищаем его полностью
$wp_query = null;
// Заполняем глобальную переменную нашим пользовательским запросом
$wp_query = $shiurim_query;
$big = 999999999; // нужно невероятно большое число
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('Ничего не найдено'); ?></p>
<?php
endif;
// Восстанавливаем оригинальный объект запроса
$wp_query = $tmp_query;
// Сбрасываем данные
wp_reset_postdata();
?>
</div>
</div>
</div>
</div>
<div class="clear"></div>
</div>
<?php get_footer(); ?>
search-form.php (Я также использую его в index.php).
<?php
/**
* Панель поиска
*/
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 .= " По раву";
$html .= " <select name='search_rav'>";
$html .= " <option value='0'>Все равы</option>";
foreach ($rabanimList as $rav) {
$isSelected = ' ';
if ($rav['id'] == $searchRav) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $rav['id'] . "'" . $isSelected . ">" . $rav['title'] . "</option>";
}
$html .= "</select>";
$html .= " По сидре";
$html .= " <select name='search_sidra'>";
$html .= " <option value='0'>Все сидры</option>";
foreach ($sdatorList as $sidra) {
$isSelected = ' ';
if ($sidra['id'] == $searchSidra) {
$isSelected = ' selected ';
}
$html .= "<option value='" . $sidra['id'] . "'" . $isSelected . ">" . $sidra['title'] . "</option>";
}
$html .= "</select>";
$html .= " Свободный текст";
$html .= " <input type='text' name='search_text' class='searchFreeText' value='" . $searchText . "'/>";
$html .= " <input type='submit' value='Поиск' />";
$html .= " </form>";
$html .= "</div>";
echo $html;
}
?>
Не работает. По-прежнему переходит на index.php. get_page_link(SHIURIM_PAGE), который я указал, является прямой ссылкой на страницу, но это не помогло.

Если я указываю method="post", то это работает, но тогда у меня возникают проблемы с параметрами пагинации.

Возможно, вы используете названия параметров, которые также используются внутри WordPress. Убедитесь, что они уникальны!

Мои параметры: search_rav, search_sidra и search_text. Используются ли они в Wordpress?

Я не знаю. Уверены, что других нет? Попробуйте проверить с помощью Chrome или Firebug, какие POST-переменные передаются...

Я разместил решение и объяснение внизу своего вопроса (Stackoverflow не позволил мне ответить на собственный вопрос).

Я нашел проблему и решение.
Проблема:
Использование:
<form action="<?php echo get_page_link(66) ?>" method="get">
неправильно. В сгенерированном HTML я вижу:
<form action="http://mySite/?page_id=66" method="get">
Но при отправке формы параметр ?page_id=66 исчезает. Поэтому WordPress не знает, как перенаправить запрос к шаблону моей страницы.
Решение:
Атрибут action должен указывать на главную страницу, а идентификатор страницы нужно передавать в скрытом поле.
<form action="<?php echo home_url ?>" method="get">
<input type='hidden' name='page_id' value='66'>
Удачи.

Еще один способ отправить форму на ту же страницу — использовать серверные переменные PHP:
echo "<form name='myForm' action='http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]."' method='post'>";
Использование функции the_permalink() также может не сработать, потому что вы можете находиться внутри цикла, и the_permalink() возвращает постоянную ссылку (permalink) объекта $post, который в данный момент обрабатывается в цикле.
