- Добавление полей в форму ввода
- Отображение данных
- Проверка данных
Префиксы ads_ и adp_
Все произвольные поля должны начинаться с префикса ads_ или adp_ например: ads_FIO, ads_address, adp_price.
ads_ — поля с этим префиксом сохраняются используя механизм мета полей ( fields)
adp_ — поля с этим префиксом будут сохранятся непосредственно в таблице wp_posts, поэтому предварительно надо добавить соответствующий столбец в эту таблицу, ну и естественно доступ к таким полям не требует никаких дополнительных затрат в отличии от мета полей. Доступ к ним можно получить через глобальную переменную $post->adp_price.
Форма ввода
Для того, чтобы плагин начал обрабатывать ваше новое поле его надо прописать в массив ads_filds_form сделать это можно в файле ads_config.php там уже есть готовый код:
$ads_config['ads_fields_form'] = ('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'] = ('ads_my_var', 'adp_myvar'); |
Все это защита от хакеров, чтобы они не могли подсунуть через форму ввода произвольную переменную. Как видно здесь идет список имен элементов формы.
Например мы решили добавить 2 поля улица:ads_street и номер дома:ads_home, причем улица обязательный параметр, а номер дома нет.
Внимание, напомню, название произвольных полей должно начинаться с префикса ads_ !
В форме добавляем поля в массив ads_filds_form:
$_SESSION['ads_fields_form'] = ('ads_street', 'ads_home' ); |
Далее идет обычный html текст ну что-то вроде
где эта улица*: <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?> |
Ну, думаю уже из комментариев понятно, что первая часть будет отображаться когда мы находимся непосредственно на странице объявления — полный вариант, вторая часть будет работать когда мы просматриваем рубрику (список) объявлений то есть короткий вариант. Дальше уже от вас зависит где и как вы будите выводить новые поля. Но логично было бы выводить улицу и номер дома в полном варианте.
Все то, что мы добавили в форме будет автоматически доступно в шаблоне поста. Добавляем вывод:
Улица : <?=$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 !('~^http://~',$post['ads_url'])){ $post['ads_url'] = 'http://'.$post['ads_url']; } // проверка улицы if( ($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 !('~^image/~',$files[0]['type']) ){ $files['error'] .= 'Первая загрузка только картинка JPG, GIF, PNG<br />'; $postID = $files[0]['id']; $res = wp_delete_attachment($postID); $files[0] = 0; } if(!('~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'); |
Здравствуйте! Подскажите пожалуйста, как убрать поля
Web ссылка
Телефоны:
Почта:
Чтобы люди не могли их вводить?
Спасибо!
Кажется нашел! Вырезал из form_default_template.php эту часть кода:
error_msg(‘ads_url’)?>
error_msg(‘ads_phone’)?>
error_msg(‘ads_email’)?>
Здравствуйте.
Хотелось бы попросить более подробно описать работу через префиксы adp.
Еще есть вопрос.
Короткий вывод объявлений показывается только в категориях обращаясь к файлу post_default_template.php. А как быть если сайт страничный, а посты категорий запрашиваются функцией query_posts. Можно ли в таком случае как-то выводить мета поля поста и прикрепленные файлы в том числе?
adp этот префикс необходимо использовать в том случае если критична скорость доступа к этим полям, они хранятся в таблице wp_post поэтому необходимо предварительно добавить в таблицу такое поле с помощью phpMyAdmin например, никаких дополнительных запросов MySQL уже не потребуется эти поля будут уже присутствовать в переменной $post.
Ну а для того, чтобы совсем уже ускорится необходимо отказаться от мета поляй (ads_) и использовать исключительно adp_ префикс и необходимо будет еще отключить функцию «приметь шаблоны постов» это еще — 2 MySQL запроса, но в этом случае вывода adp_ полей придется править шаблоны текущей темы.
Также целесообразно использовать комбинированный вариант ads_ и adp_ полей когда например есть поле, которое должно присутствовать во всех объявлениях и по этому полю надо делать частый поиск, ну например таким полем может быть цена товара или объекта недвижимости.
второй вопрос не понял немного подробней объясните
Спасибо, стало понятнее, буду разбираться дальше.
По второму вопросу подробнее.
Есть файл post_default_template.php где есть два варианта вывода формы, полный и короткий, с полным все понятно, выводит в единичном посте. А вот короткий выводится только в категориях (?cat=), я использую постраничную навигацию на сайте, на тех страницах где требуется я функцией query_posts вывожу нужные посты из нужной категории (?page_id=). И вот, в таком случае список постов формируется без мета полей и по всей видимости post_default_template.php вообще не участвует в формировании списка постов, отображается только заголовок и текст сообщения созданного формой поста.
И вот в чем вопрос, можно ли обращаться к мета полям созданного поста в обход post_default_template.php чтобы вывести информацию там где требуется, а не только в категориях? Или чтобы информация из полей формы которую заполняем попадала не в мета поля, а в сам пост?
Если все еще ничего не понятно, то наверное проще 1 раз увидеть, kokozov.com
Заранее огромное спасибо за ваше время, плагин очень нужный, нашел ему весьма необычное применение, только все тонкости понять бы
мета поля и картинки подключаются с помощью функции ads_addImgMeta() чтобы понять принцип ее работы читайте здесь
http://ili.com.ua/php/rabota-s-meta-polyami-i-kartinkami-v-wordpress-uskoryaemsya-v-10-raz.html
и вам ка я понял сделать на странице выборку постов вообщемто делается это по правильному след образом
ну вроде так
Заработало, но выводит все мета поля, а нужно выборочно. Пробовал через get_post_meta, в принципе работает, но картинки не грузятся так тогда.
Разбираюсь в плагине не один вечер, интересно, но времени уже нет на разбирания, не хотели бы за N-ную сумму денег помочь мне? Думаю у вас займет не больше вечера, так как плагин знаете хорошо очень?
напиши мне на почту что нужно сделать подробно
Здравстуйте. Извеняюсь за глупый вопрос. Но не понимаю как ставить эту форму на страницу???
Мне нужно чтобы посетитель смог добавлять объявления непосредственно с сайта, а не через админку.
И если я правильно понял, то этот плагин даёт такую возможность. А вот как ставить форму например в страницу не понимаю!
Спасибо. Я разобрался. Что называется «открыл глаза и всё увидел» ))))))))
Здравстуйте.
у меня такая проблема,
добавил в файл «form_default_template.php» поле для ввода
error_msg(‘ads_phone’)?>
в массив «$ads_config['ads_fields_form'] = array» — уже было прописано поле «ads_phone»
в файле «post_default_template.php» прописал вывод . Вот.
На сколько я понял этого достаточно для того чтобы проверить добавляются ли произвольные поля??? и если они добавляются, то они должны отображаться в админке?
для проверки надо использовать пользовательский фильтр смотри выше в статье есть заголовок ПРОВЕРКА там показано на примере улицы ads_street
Если в форму добавить новый input name=»ads_name» то в нем к сожалению не остаются введённый значения после submita. Вобшем FormPersister.php не работает с новыми инпутами. Можно как-то подправить?
ты инструкцию про добавление новых полей внимательно прочитал?
та вроде новую переменную определял. Пробовал и в ads_config.php и в темплейте, в mysql знчачение записывает . Щас буду проверять.
Все дело в selected, его тоже нельзя определять.
нельзя в input записывать пустое значение иначе FormPersister его пропускает
После установки плагина не могу вывести произвольные поля привычным способом на странице категории. Подскажите, что могло случиться?
просто я хочу сделать так, чтобы вывод постов, добавленных через плагин и добавленных через админку, был одинаковым. Но в постах из админки не могу вывести произвольные поля…
попробуй отключить опцию применять шаблоны постов
Спасибо за предложение… Эх, а я только разобрался с вашими шаблонами… )
Балин… не поверишь, и после отключения шаблонов не выводит мета-поля…
Странное дело, произвольные поля стали выводиться когда вместо номера категории в шаблоне стал использовать слаг. то есть не category-69.php, а category-news.php
напиши код как ты их выводить пытался
Юрий такой вопрос: как сделать в post_default_template.php проверку на предмет выбора определённой рубрики через чекбокс во время добавления объявления, чтобы потом можно было выводить соответствующий текст в объявлении?
Я дал этим рубрикам имена post_category1 и post_category2, но конструкция в post_default_template.php текст1текст2 не работает — всегда выводится только текст1..
Блин, повырезался код..
Ещё раз, но с заменой скобок:
{?if(‘post_category6[]‘):?}текст1{?else:?}текст2{?endif?}
Точнее, post_category1[] должно быть.
Прошу прощения, что 3 сообщения создал.. Жаль, что нельзя редактировать..
ну во первых разрешить обрабатывать переменную post_category добавить ее в массив
$ads_config['ads_fields_form'] = array(‘post_category’);
а дальше я не понял почему post_category1
post_category6 это что за переменные,
post_category и post_category6 это 2 разные переменные естественно фильтр post_category6 не пропустит? короче привожу кусок рабочего кода где через radio box выбираеца одна из 2 категорий
код проверки вставляется в пользовательский фильт ads_default_filter
HTML
тут пришлось авто заполнение делать самому
для чекбокса это не нужно FormPersister сделает все сам
post_category6 — это я просто ошибся, должно было быть:
{?if(‘post_category1[]‘):?}текст1{?else:?}текст2{?endif?}.
Вы не верно поняли суть вопроса.. То, о чём вы написали, я сделал.. Правда, немного другим способом:
в файле ads_config.php в массив $ads_config['ads_fields_form'] добавил ‘post_category1′ и ‘post_category2′,
в ф-цию ads_filter($post) добавил конструкцию:
if(sizeof($post['post_category1'])) $post['post_category'] = array_merge($post['post_category1'],$object_cat,$location_cat);
else $post['post_category'] = array_merge($post['post_category2'],$object_cat,$location_cat);
Проверку осуществил так:
if(empty($post['post_category1']) && empty($post['post_category2'])){
$post['error']['post_category1_2'] = ‘Выберите тип объявления!’;
HTML такой же, только без автозаполнения. Тут, правда, проблемка в том, что в данном случае radio будет работать, как checkbox — можно выбрать оба варианта, поскольку value разное, но это — ерунда..
А сам вопрос касался того, как сделать в post_default_template.php проверку на предмет выбора определённой рубрики из этих двух для конкретного объявления, чтобы потом можно было выводить в готовом объявлении соответствующий текст через post_default_template.php — т.е. текст1, если выбрали post_category1 или текст2, если выбрали post_category2 ..
Если бы нужно было вывести введённое в какую-то переменную значение, то тут без проблем: через {?=$ads_переменная?}.. А в данном случае я не знаю, как решить проблему..
Спасибо за альтернативный код.
а ну так это еще проще есть стандартная функция in_category($category_id)
этот код для post_default_template.php
Большое спасибо, Юрий — работает!
Но почему-то не работает приведённый вами код автозаполнения — ничего не выводит. При этом всё остальное сделано, как вы и описали.
Подскажите, как сделать выбор рубрики через выпадающий список? Т.е. хочу сделать единую форму для подачи объявлений, где:
- рубрика или подрубрика выбирается из выпадающего списка;
- короткий текст, или что-то вроде заглавия объявления, например «Шкода Фелиция» или «4-х комнатная квартира»;
- полный текст объявления.
Так по категориям написал специально статью с примерами
http://ili.com.ua/wordpress/funktsii-dlya-rabotyi-s-kategoriyami.html
Юрий, подскажите, а после вставки функции в ads_config.php вывести в форме?.
Спасибо.
Речь идет о функции выпадающего списка категорий.
да
только зачем столько вопросов, пользуйтесь эмпирическим методом (втыка), многие вопросы отпадут
Здравствуйте, подскажите пожалуйста как справиться с такой проблемой. После добавления объявления страница обновляется и появляется страница с тем же адресом (форма ввода объявления) только сама страница изменилась под шаблон default и вот такой ошибкой ( Something went wrong — -32300 : transport error — could not open socket: 354009680 Unable to find the socket transport «http» — did you forget to enable it when you configured PHP?) но объявление опубликовалось нормально. Как сделать чтобы страница обновлялась на страницу с объявлениями.
Если не затруднит то прошу написать на email.
скорей всего у тебя закрыто исходящее соединение на хосте,
возможно когда публикуются статьи WP пытается отослать на пинг сервера из за этого ошибка, обратись к хостеру
У меня такой вопрос. Значит я делаю сайт на основе этого плагина и мне нужно сделать так чтобы wordPress мог закачивать rar и прочие файлы. В этой статье вы написали что нужно сделать но вы не написали в каком файле эту нужно прописать? Подскажите пожалуйста, а лучше пример ещё приведите.
для индидуальных настроек создайте файл ads_config.php в папке плагина и туда этот код полжите
Так такой же файл там уже есть и если создать новый то старый будет заменен и это приведет к фатальной ошибки плагина…разве я не прав?
Здравствуйте.
В версии «Ads WordPress 3.1.0» файла «ads_config.php» я ненашел.
Напишите, пожалуйста как добавлять поля, радиокнопки, чекбоксы во все формы (цена, город) и как добавлять поля, радиокнопки, чекбоксы в форму конкретной рубрики, например «недвижимость» (1к-квартира, балкон, и т.д).
Я понимаю что вы пишите для, программистов, но у всех уровень знаний разный. Зачем всем по очереди наступать на одни и те же грабли.
Этой статьей вы избавите свой сайт от ненужных вопросов и самое главное, гораздо больше людей поставят ваш плагин.
Пишите, пожалуйста, последовательно, берем это, вставляем туда. Создаем файл с таким то названием и в такой папке и тд. В результате получаем это. И не ленитесь вставлять картинки. Одна картинка заменяет тысячу слов.
Дело говорит! Я вот сижу уже на этом сайте 3-ий день и не могу понять что, куда, как. Установить установил. А как категории добавлять так и не понял.
есть http://ili.com.ua/wordpress/ads-wordpress/poshagovaya-ustanovka-plagina-ads-wordpress-3x.html там есть 2 пункта по категориям
Исключить рубрики id
Родительская рубрика
дело в том что сейчас плагин находится в переходном состоянии в 3.1.0 меняется структура файлов, не все вопросы еще решены,
вот и одно из таких новшеств это то, что ads_config.php вам теперь надо создать самостоятельно, забыл об этом написать
когда все это устаканится напишу подробную инструкцию в картинках
и кстати говоря пример есть http://ili.com.ua/wordpress/funktsii-dlya-rabotyi-s-kategoriyami.html
может не совсем подробно но всеже при желании можно разобраться
а у меня проблема с добавление мета полей, в форме объявления они есть, а выводиться не хотят, с чем это может быть свыязано???
эта проблема наглядно на моем сайте
Ну так надо же добавить вывод полей в шаблоне !
в post_default_template.php добавьте вывод
Не совсем понял, точнее совсем не понял причем «Огранизация: «…
Моя проблема в том, что в новых произвольных полях, при заполнении данными они просто напросто не сохраняются и не создаются (проверял через админку новые заполненные при помощи плагина произвольные поля отсутствуют, хотя они вполне создаются в ручную в админке с ключами ads_…), и соответственно не выводятся, может я где-то не включил какую-то функцию???
Повторюсь что записи в новых произв полях просто не сохраняются
Не утруждай себя с ответов, отвечу Я, файл ads_config.php, все-таки нужет из-за отсутсвия этого файла и соответственно не возможности прописать в массив ads_filds_form файла ads_config.php код новых произвольных полей, у меня они (поля) и не выводились/не сохранялись, но методом перебора загрузил от предыдущей версии ads_config.php прописал там так как описано выше — КРАСОТА все просто летает, удачи и процветания тебе и твоей работе
Возможно мой коммент сможет помочь кому нибудь ещё