Проблема с передачей элемента массива в сессию wordpress

229
20 февраля 2018, 07:39

Всем привет. Пишу php функцию на вордпресс.

Суть в том, что пользователь выбирает в выпадающем списке свой город. Выбранный город записывается в глобальную переменную вордпресса в сессию для того, чтобы после перезагрузки страницы отобразить посты, метка которого соответствует выбранному городу.

После выбора пункта должна просто обновиться страница и вместо "Выбор города" должно появиться имя выбранного города. На его основе я буду отображать посты только с меткой этого города вот таким способом:

<?php $page = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>    
<?php if(have_posts()) : query_posts('category_name=news&numberposts=0&paged='.$page.'&tag='.get_query_var($vibor_gor[0])); while(have_posts()) : the_post(); ?>
    ...
<?php endwhile; ?>
<?php endif; wp_reset_query(); ?>

Для наглядности посмотрите картинку ниже.

Функция должна отслеживать изменение поля select и записывать его значение в глобальную переменную в сессию.

Саму функцию пишу в файле темы function.php

Вот код:

function select_city() {
    session_start(); //открываю сессию (может быть открываю не там)
global $vibor_gor; //объявляю глобаньную переменную
    $vibor_gor = array(); //говорю что эта переменная массив
    $tags = get_tags(); //получаю массив существующих тегов
foreach ($tags as $tag){
    array_push($vibor_gor, $tag->name); //циклом вытягиваю имена тегов
}
    if(!empty($_SESSION['sesgor'])) //если в нем что-то есть
    {
        $vstavka = $_SESSION['sesgor'];
    }
    else $vstavka= "Выбор города"; //если пользователь еще не выбрал город, то выводим это
$html = '<select class="vibor_gor" name="vibor_gor" onchange="location.reload()">
         <option disabled selected value>'.$vstavka.'</option>'; //первая опция просто для вида, что тут можно выбарть город
foreach ($vibor_gor as $value){
    $html .= "<option value='{$value}'>{$value}</option>"; //заполняем все опции нашими тегами городов
    array_push($_SESSION['sesgor'], $value); //тут я пытаюсь заполнить массив в сессии нашими городами
}   
$html .= '</select>';
echo $html;
}; 

Проблема в том, что после выбора города и обновления страницы значение select либо остается "Выбор города", либо "Array", либо последним в списке массива, а именно "Старый Оскол", либо вообще пустым. Пробовал по разному, но всегда не то что нужно.

Пробовал искать плагин для выбора городов. То что нужно - нет, или не нашел. Если хотите - используйте этот код для написания такового плагина на вордпресс. Очень будет востребован.

Answer 1

Сразу несколько проблем.

  1. session_start() лучше использовать в самом начале скрипта, т.к. не понятно когда запустится ваша функция, сколько раз она запустится, и запустится ли вообще. А сессия - это глобальный массив, и по-хорошему должен быть доступен везде и всегда.

  2. Вы хотите запомнить в сессии выбор пользователя, но сохраняете значение на этапе формирования формы, а не при её сабмите. В скрипте, который вы здесь представили, вы просто заполняете в сессию все города, которые у вас есть, отсюда и ARRAY в качестве вабранного элемента (т.е. в сесии действительно хранится массив).

В итоге, вам нужно сохранять сессию, когда вы уже получили что-то от юзера. Т.е. где-то внутри if (have_posts()) нужно вытащить значение, которое выбрал пользователь и сохранить его в сессию. Не знаю как точно работает WordPress, но подозреваю, что как-то так:

$_SESSION['sesgor'] = get_query_var($vibor_gor[0]));
  1. Ну и в целом код довольно кривенький, прислушайтесь к совету @SeVlad в комментарии к вопросу.
READ ALSO
Как передать AJAX&#39;ом данные из DatePicker в контроллер yii2

Как передать AJAX'ом данные из DatePicker в контроллер yii2

DatePicker создается следующим кодом:

220
Подключение к DB2 на z/OS из php

Подключение к DB2 на z/OS из php

Я новичок в ДБ2 и сходу натолкнулся на проблемы с подключениемИтоговая цель, надо подключиться к DB2 из php посредством odbc

215
Class php для форматирования json

Class php для форматирования json

Существует ли класс php для красивого форматирования JSON строки? Json получается очень большой и если записать в файл одной строкой, то будет...

139
mod_fcgid: stderr: PHP Notice: Undefined variable: name

mod_fcgid: stderr: PHP Notice: Undefined variable: name

Всем приветЕсть форма на сайте, в которую человек вбивает имя и телефон, дальше данные передаются по апи, но в файле записей появляются строчки...

158