Перенаправление формы на ту же страницу

14 февр. 2013 г., 14:28:41
Просмотры: 40.5K
Голосов: 2

Я создаю собственную тему. На одной из страниц я отображаю пользовательские записи с помощью 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' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    ) );
?>
</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;
}

?>
3
Комментарии

Что содержит SHIURIM_PAGE? Что возвращает get_page_link(SHIURIM_PAGE)?

Max Yudin Max Yudin
14 февр. 2013 г. 14:52:29

Как создана эта страница? Покажите ваш код?

Bainternet Bainternet
14 февр. 2013 г. 15:04:28

SHIURIM_PAGE - это ID страницы. Я добавлю код к вопросам.

Amos N. Amos N.
14 февр. 2013 г. 15:18:12
Все ответы на вопрос 4
8

Если оставить атрибут action пустым, форма отправится на ту же страницу.

Просто сделайте так: <form action='' method='get'>

14 февр. 2013 г. 14:32:36
Комментарии

Не работает. По-прежнему переходит на index.php. get_page_link(SHIURIM_PAGE), который я указал, является прямой ссылкой на страницу, но это не помогло.

Amos N. Amos N.
14 февр. 2013 г. 14:37:33

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

Amos N. Amos N.
14 февр. 2013 г. 14:38:26

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

jberculo jberculo
14 февр. 2013 г. 15:53:58

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

Amos N. Amos N.
14 февр. 2013 г. 16:18:10

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

jberculo jberculo
14 февр. 2013 г. 18:11:24

Я нашел проблему и решение.

Amos N. Amos N.
14 февр. 2013 г. 18:20:00

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

Amos N. Amos N.
14 февр. 2013 г. 18:30:48

Спасибо jberculo, ваш совет помог мне найти решение

Amos N. Amos N.
19 февр. 2013 г. 12:10:02
Показать остальные 3 комментариев
0

Я нашел проблему и решение.

Проблема:

Использование:

<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'>

Удачи.

19 февр. 2013 г. 12:08:16
0

Вы можете использовать этот способ, он короче и отлично работает:

<form action="<?php echo get_bloginfo('home').'/?page_id='.get_the_ID();  ?>" method="get" >
28 мая 2015 г. 13:26:52
0

Еще один способ отправить форму на ту же страницу — использовать серверные переменные PHP:

echo "<form name='myForm' action='http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]."' method='post'>";

Использование функции the_permalink() также может не сработать, потому что вы можете находиться внутри цикла, и the_permalink() возвращает постоянную ссылку (permalink) объекта $post, который в данный момент обрабатывается в цикле.

12 нояб. 2015 г. 13:10:30