- Добавление полей в форму ввода
- Отображение данных
- Проверка данных
Префиксы ads_ и adp_
Все произвольные поля должны начинаться с префикса ads_ или adp_ например: ads_FIO, ads_address, adp_price.
ads_ – поля с этим префиксом сохраняются используя механизм мета полей (custom fields)
adp_ – поля с этим префиксом будут сохранятся непосредственно в таблице wp_posts, поэтому предварительно надо добавить соответствующий столбец в эту таблицу, ну и естественно доступ к таким полям не требует никаких дополнительных затрат в отличии от мета полей. Доступ к ним можно получить через глобальную переменную $post->adp_price.
Форма ввода
Для того, чтобы плагин начал обрабатывать ваше новое поле его надо прописать в массив ads_filds_form сделать это можно в файле ads_config.php там уже есть готовый код:
$ads_config[‘ads_fields_form’] = array(‘post_title’,’post_content’, ‘comment_status’,’ar_tags’,’tags_input’,’ads_lifetime’, ‘ads_phone’, ‘ads_email’,’ads_location’,’ads_url’);
123 | $ads_config[‘ads_fields_form’] = array(‘post_title’,‘post_content’,‘comment_status’,‘ar_tags’,‘tags_input’,‘ads_lifetime’, ‘ads_phone’,‘ads_email’,‘ads_location’,‘ads_url’); |
Добавляем в это список свои поля, этот список действует глобально для всех форм.
И есть другой вариант добавить ваше поле непосредственно в шаблоне формы. Откройте файл в папке плагина /templates/form_default_template.php – это форма ввода используется по умолчанию для всех категорий.
$_SESSION[‘ads_fields_form’] = array(‘ads_my_var’, ‘adp_myvar’);
1 | $_SESSION[‘ads_fields_form’] = array(‘ads_my_var’, ‘adp_myvar’); |
Все это защита от хакеров, чтобы они не могли подсунуть через форму ввода произвольную переменную. Как видно здесь идет список имен элементов формы.
Например мы решили добавить 2 поля улица:ads_street и номер дома:ads_home, причем улица обязательный параметр, а номер дома нет.
Внимание, напомню, название произвольных полей должно начинаться с префикса ads_ !
В форме добавляем поля в массив ads_filds_form:
$_SESSION[‘ads_fields_form’] = array(‘ads_street’, ‘ads_home’ );
1 | $_SESSION[‘ads_fields_form’] = array(‘ads_street’, ‘ads_home’ ); |
Далее идет обычный html текст ну что-то вроде
где эта улица*: <input name=»ads_street» /><?$this->error_msg(‘ads_street’)?> где этот дом: <input name=»ads_home» />
1234 | где эта улица*:<input name=«ads_street» /><?$this->error_msg(‘ads_street’)?>где этот дом:<input name=«ads_home» /> |
Добавляем этот текст в тег form нашей формы.
Конструкция <?$this->error_msg(‘ads_street’)?> будет выводить сообщение об ошибках соответствующее этому полю.
В плагине используется библиотека Дмитрия Котерова авто заполнения полей формы. Поэтому не надо устанавливать никаких значений value в input, иначе значение полей будет все время сбрасываться если пользователь ввел что-то неправильно.
C формой вроде бы разобрались, переходим к отображению полей.
Вывод данных
Открываем шаблон post_default_template.php (он также используется по умолчанию) и для начала рассмотрим его повнимательнее.
Шаблон состоит из 2 частей :
<? if(is_single() OR is_page()):?> // мы находимся на странице записи полный вид объявления <?else:?> // мы находимся в рубрике короткий вид объявления <?endif?>
12345 | <? if(is_single() OR is_page()):?>// мы находимся на странице записи полный вид объявления<?else:?>// мы находимся в рубрике короткий вид объявления<?endif?> |
Ну, думаю уже из комментариев понятно, что первая часть будет отображаться когда мы находимся непосредственно на странице объявления – полный вариант, вторая часть будет работать когда мы просматриваем рубрику (список) объявлений то есть короткий вариант. Дальше уже от вас зависит где и как вы будите выводить новые поля. Но логично было бы выводить улицу и номер дома в полном варианте.
Все то, что мы добавили в форме будет автоматически доступно в шаблоне поста. Добавляем вывод:
Улица : <?=$ads_street?> <? if( $ads_home ) echo ‘дом ‘.$ads_home;?>
1 | Улица : <?=$ads_street?> <? if( $ads_home ) echo ‘дом ‘.$ads_home;?> |
Напомню, все выше сказанное будет работать если вы включили опцию Применять шаблоны постов в админке плагина
Проверка данных
Теперь переходим к самому сложному, нам надо организовать проверку данных, в данном случае нам надо проверить ввел ли пользователь улицу или нет.
Для этого в файле ads_config.php надо подключить пользовательский фильтр ads_check_fields, вернее он там уже подключен и нам надо только изменить функцию ads_filter:
function ads_filter($post){ // например исправляем url адресс если пользователь ввел адерс без http:// // добавляем его if($post[‘ads_url’] == ‘http://’) $post[‘ads_url’] = »; elseif($post[‘ads_url’] AND !preg_match(‘~^http://~’,$post[‘ads_url’])){ $post[‘ads_url’] = ‘http://’.$post[‘ads_url’]; } // проверка улицы if( empty($post[‘ads_street’] ){ $post[‘error’][‘ads_street’] = ‘ВЫ забыли ввести улицу!’; } return $post; } add_filter(‘ads_check_fields’, ‘ads_filter’);
1234567891011121314 | function ads_filter($post){ // например исправляем url адресс если пользователь ввел адерс без http:// // добавляем его if($post[‘ads_url’] == ‘http://’) $post[‘ads_url’] = »; elseif($post[‘ads_url’] AND !preg_match(‘~^http://~’,$post[‘ads_url’])){ $post[‘ads_url’] = ‘http://’.$post[‘ads_url’]; } // проверка улицы if( empty($post[‘ads_street’] ){ $post[‘error’][‘ads_street’] = ‘ВЫ забыли ввести улицу!’; } return $post;}add_filter(‘ads_check_fields’, ‘ads_filter’); |
Сама проверка if( empty($post[‘ads_street’] ) если в ads_street пусто генерируем ошибку $post[‘error’][‘ads_street’] = ‘ВЫ забыли ввести улицу!’; пока фильтр будет возвращать что-либо в массиве $post[‘error’] форма будет считаться не заполненной.
Точно также можно добавить фильтр в самой форме ввода form_default_template.php там уже есть закоментированный пример кода. Это очень удобно так как такой фильтр будет запускаться только вместе с формой, а форм, как я уже писал, можно сделать много и привязать их к соответствующим категориям объявлений, короче говоря – проверка данных будет идти в соответствии с категорией.
Подключая фильтр непосредственно в форме обязательно используйте проверку if( !function_exists(‘ads_default_filter’) ){} как в примере.
Проверка файлов
Для проверки ввода файлов, их типа, размера и т.д используйте фильтр ads_check_files. Вот как это может выглядеть:
function ads_filter_files($files){ if( $files[0] AND !preg_match(‘~^image/~’,$files[0][‘type’]) ){ $files[‘error’] .= ‘Первая загрузка только картинка JPG, GIF, PNG<br />’; $postID = $files[0][‘id’]; $res = wp_delete_attachment($postID); $files[0] = 0; } if(!preg_match(‘~rar|zip|force-download~’,$files[1][‘type’]) ){ $files[‘error’] .= ‘Вторая загрузка только архив RAR или ZIP<br />’; $postID = $files[1][‘id’]; $res = wp_delete_attachment($postID); $files[1] = 0; } return $files; } add_filter(‘ads_check_files’, ‘ads_filter_files’);
1234567891011121314151617 | function ads_filter_files($files){ if( $files[0] AND !preg_match(‘~^image/~’,$files[0][‘type’]) ){ $files[‘error’] .= ‘Первая загрузка только картинка JPG, GIF, PNG<br />’; $postID = $files[0][‘id’]; $res = wp_delete_attachment($postID); $files[0] = 0; } if(!preg_match(‘~rar|zip|force-download~’,$files[1][‘type’]) ){ $files[‘error’] .= ‘Вторая загрузка только архив RAR или ZIP<br />’; $postID = $files[1][‘id’]; $res = wp_delete_attachment($postID); $files[1] = 0; } return $files;}add_filter(‘ads_check_files’, ‘ads_filter_files’); |
Очень показательный пример первое условие проверяет наличие файла № 1 и его mime type – это должно быть изображение, если тип файла не соответствует он тут же удаляется $res = wp_delete_attachment($postID);. Аналогично проверяется тип второго файла, но это уже должен быть архив.
Ну и напоследок, чтобы научить WordPress понимать новые типы файлов надо использовать фильтр upload_mimes. Так например широко известный формат rar WordPress не поддерживается, показываю как его добавить:
// добавляем новый тип медиа объектов RAR архивы function additional_types2($mimes) { $mimes[‘rar’] = ‘application/x-rar-compressed’; return $mimes;} add_filter(‘upload_mimes’, ‘additional_types2’);
123 | // добавляем новый тип медиа объектов RAR архивыfunction additional_types2($mimes) { $mimes[‘rar’] = ‘application/x-rar-compressed’; return $mimes;}add_filter(‘upload_mimes’, ‘additional_types2’); |