Ads WordPress ads_ и adp_ добавление\проверка\отображение произвольных полей данных

  1. Добавление полей в форму ввода
  2. Отображение данных
  3. Проверка данных

Префиксы 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');

Обсуждение на сайте:

Рубрика:  мая 17, 2010.
/ » » »


Похожие записи:

57 Responses to Ads WordPress ads_ и adp_ добавление\проверка\отображение произвольных полей данных

  1. says:

    Здравствуйте! Подскажите пожалуйста, как убрать поля
    Web ссылка
    Телефоны:
    Почта:
    Чтобы люди не могли их вводить?
    Спасибо!

  2. says:

    Кажется нашел! Вырезал из form_default_template.php эту часть кода:
    error_msg(‘ads_url’)?>
    error_msg(‘ads_phone’)?>
    error_msg(‘ads_email’)?>

  3. GLuK says:

    Здравствуйте.
    Хотелось бы попросить более подробно описать работу через префиксы adp.
    Еще есть вопрос.
    Короткий вывод объявлений показывается только в категориях обращаясь к файлу post_default_template.php. А как быть если сайт страничный, а посты категорий запрашиваются функцией query_posts. Можно ли в таком случае как-то выводить мета поля поста и прикрепленные файлы в том числе?

  4. admin says:

    adp этот префикс необходимо использовать в том случае если критична скорость доступа к этим полям, они хранятся в таблице wp_post поэтому необходимо предварительно добавить в таблицу такое поле с помощью phpMyAdmin например, никаких дополнительных запросов MySQL уже не потребуется эти поля будут уже присутствовать в переменной $post.
    Ну а для того, чтобы совсем уже ускорится необходимо отказаться от мета поляй (ads_) и использовать исключительно adp_ префикс и необходимо будет еще отключить функцию «приметь шаблоны постов» это еще — 2 MySQL запроса, но в этом случае вывода adp_ полей придется править шаблоны текущей темы.
    Также целесообразно использовать комбинированный вариант ads_ и adp_ полей когда например есть поле, которое должно присутствовать во всех объявлениях и по этому полю надо делать частый поиск, ну например таким полем может быть цена товара или объекта недвижимости.

    второй вопрос не понял немного подробней объясните

  5. GLuK says:

    Спасибо, стало понятнее, буду разбираться дальше.

    По второму вопросу подробнее.

    Есть файл post_default_template.php где есть два варианта вывода формы, полный и короткий, с полным все понятно, выводит в единичном посте. А вот короткий выводится только в категориях (?cat=), я использую постраничную навигацию на сайте, на тех страницах где требуется я функцией query_posts вывожу нужные посты из нужной категории (?page_id=). И вот, в таком случае список постов формируется без мета полей и по всей видимости post_default_template.php вообще не участвует в формировании списка постов, отображается только заголовок и текст сообщения созданного формой поста.
    И вот в чем вопрос, можно ли обращаться к мета полям созданного поста в обход post_default_template.php чтобы вывести информацию там где требуется, а не только в категориях? Или чтобы информация из полей формы которую заполняем попадала не в мета поля, а в сам пост?

    Если все еще ничего не понятно, то наверное проще 1 раз увидеть, kokozov.com
    Заранее огромное спасибо за ваше время, плагин очень нужный, нашел ему весьма необычное применение, только все тонкости понять бы :)

  6. admin says:

    мета поля и картинки подключаются с помощью функции ads_addImgMeta() чтобы понять принцип ее работы читайте здесь
    http://ili.com.ua/php/rabota-s-meta-polyami-i-kartinkami-v-wordpress-uskoryaemsya-v-10-raz.html

    и вам ка я понял сделать на странице выборку постов вообщемто делается это по правильному след образом

     <?php 
    //создаем новый объект WP_Query добавить свои параметры  
    $my_query = new WP_Query('category_name=featured&posts_per_page=1');
    // пропускаем массив posts  через ads_addImgMeta  
    //и указываем флаг принудительного запуска 
    $my_query->posts = ads_addImgMeta($my_query->posts, true); 
    /* после этого массив $my_query->posts  будет 
    содержать все мета поля + все картинки и их мета поля +  
    уже расчитанные url этих картинок или файлов */
     
      while ($my_query->have_posts()) : $my_query->the_post();
      $do_not_duplicate = $post->ID; ?>
        <!-- Do stuff...    здесь рисуем все что хотим
    все данные в переменной  $my_query->post -->
      <?php endwhile; ?>

    ну вроде так

  7. GLuK says:

    Заработало, но выводит все мета поля, а нужно выборочно. Пробовал через get_post_meta, в принципе работает, но картинки не грузятся так тогда.
    Разбираюсь в плагине не один вечер, интересно, но времени уже нет на разбирания, не хотели бы за N-ную сумму денег помочь мне? Думаю у вас займет не больше вечера, так как плагин знаете хорошо очень? :)

  8. admin says:

    напиши мне на почту что нужно сделать подробно

  9. Oleg says:

    Здравстуйте. Извеняюсь за глупый вопрос. Но не понимаю как ставить эту форму на страницу???

  10. Oleg says:

    Мне нужно чтобы посетитель смог добавлять объявления непосредственно с сайта, а не через админку.

    И если я правильно понял, то этот плагин даёт такую возможность. А вот как ставить форму например в страницу не понимаю!

  11. Oleg says:

    Спасибо. Я разобрался. Что называется «открыл глаза и всё увидел» ))))))))

  12. Oleg says:

    Здравстуйте.

    у меня такая проблема,
    добавил в файл «form_default_template.php» поле для ввода

    error_msg(‘ads_phone’)?>

    в массив «$ads_config['ads_fields_form'] = array» — уже было прописано поле «ads_phone»

    в файле «post_default_template.php» прописал вывод . Вот.

    На сколько я понял этого достаточно для того чтобы проверить добавляются ли произвольные поля??? и если они добавляются, то они должны отображаться в админке?

  13. admin says:

    для проверки надо использовать пользовательский фильтр смотри выше в статье есть заголовок ПРОВЕРКА там показано на примере улицы ads_street

  14. Anton says:

    Если в форму добавить новый input name=»ads_name» то в нем к сожалению не остаются введённый значения после submita. Вобшем FormPersister.php не работает с новыми инпутами. Можно как-то подправить?

  15. admin says:

    ты инструкцию про добавление новых полей внимательно прочитал?

  16. Anton says:

    та вроде :) новую переменную определял. Пробовал и в ads_config.php и в темплейте, в mysql знчачение записывает . Щас буду проверять.

  17. Anton says:

    Все дело в selected, его тоже нельзя определять.

  18. admin says:

    нельзя в input записывать пустое значение иначе FormPersister его пропускает

    <input name="test" value="" />   неправильно
    <input name="test"  />  правильно
  19. says:

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

  20. says:

    просто я хочу сделать так, чтобы вывод постов, добавленных через плагин и добавленных через админку, был одинаковым. Но в постах из админки не могу вывести произвольные поля…

  21. admin says:

    попробуй отключить опцию применять шаблоны постов

  22. says:

    Спасибо за предложение… Эх, а я только разобрался с вашими шаблонами… )

  23. says:

    Балин… не поверишь, и после отключения шаблонов не выводит мета-поля…

  24. says:

    Странное дело, произвольные поля стали выводиться когда вместо номера категории в шаблоне стал использовать слаг. то есть не category-69.php, а category-news.php

  25. admin says:

    напиши код как ты их выводить пытался

  26. says:

    Юрий такой вопрос: как сделать в post_default_template.php проверку на предмет выбора определённой рубрики через чекбокс во время добавления объявления, чтобы потом можно было выводить соответствующий текст в объявлении?
    Я дал этим рубрикам имена post_category1 и post_category2, но конструкция в post_default_template.php текст1текст2 не работает — всегда выводится только текст1..

  27. says:

    Блин, повырезался код..

    Ещё раз, но с заменой скобок:

    {?if(‘post_category6[]‘):?}текст1{?else:?}текст2{?endif?}

  28. says:

    Точнее, post_category1[] должно быть.

    Прошу прощения, что 3 сообщения создал.. Жаль, что нельзя редактировать..

  29. admin says:

    ну во первых разрешить обрабатывать переменную 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

     
    // вариант аренды
          if( !((121,$_post['post_category']) OR (120,$_post['post_category'])) )
             $_post['error']['variant_aendi'] = __('Укажите вариант аренды!','ads-wordpress');

    HTML

    <tr><td>Вариант аренды<font color="red">*</font>
    <br /><?$this->error_msg('variant_aendi')?> </td>
    <td>
    <input type="radio" name="post_category[]" value="120" <?if(@(120,$_POST['post_category'])) echo  'checked="checked"';  ?> /> помесячно
    <input type="radio" name="post_category[]" value="121" <?if(@(121,$_POST['post_category'])) echo  'checked="checked"';?> /> посуточно
    </td></tr>

    тут пришлось авто заполнение делать самому
    для чекбокса это не нужно FormPersister сделает все сам

  30. says:

    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_переменная?}.. А в данном случае я не знаю, как решить проблему..

    Спасибо за альтернативный код.

  31. admin says:

    а ну так это еще проще есть стандартная функция in_category($category_id)

    if(in_category(33) echo "Выбранна категория 33";
    elseif  (in_category(34) echo "Выбранна категория 34";
    else echo "Невыбранно ничего!";

    этот код для post_default_template.php

  32. says:

    Большое спасибо, Юрий — работает! :)

    Но почему-то не работает приведённый вами код автозаполнения — ничего не выводит. При этом всё остальное сделано, как вы и описали.

  33. says:

    Подскажите, как сделать выбор рубрики через выпадающий список? Т.е. хочу сделать единую форму для подачи объявлений, где:
    - рубрика или подрубрика выбирается из выпадающего списка;
    - короткий текст, или что-то вроде заглавия объявления, например «Шкода Фелиция» или «4-х комнатная квартира»;
    - полный текст объявления.

  34. admin says:

    Так по категориям написал специально статью с примерами
    http://ili.com.ua/wordpress/funktsii-dlya-rabotyi-s-kategoriyami.html

  35. pe4erskiy says:

    Юрий, подскажите, а после вставки функции в ads_config.php вывести в форме?.

    Спасибо.

  36. pe4erskiy says:

    Речь идет о функции выпадающего списка категорий.

  37. admin says:

    да
    только зачем столько вопросов, пользуйтесь эмпирическим методом (втыка), многие вопросы отпадут

  38. says:

    Здравствуйте, подскажите пожалуйста как справиться с такой проблемой. После добавления объявления страница обновляется и появляется страница с тем же адресом (форма ввода объявления) только сама страница изменилась под шаблон 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.

  39. admin says:

    скорей всего у тебя закрыто исходящее соединение на хосте,
    возможно когда публикуются статьи WP пытается отослать на пинг сервера из за этого ошибка, обратись к хостеру

  40. Дима says:

    У меня такой вопрос. Значит я делаю сайт на основе этого плагина и мне нужно сделать так чтобы wordPress мог закачивать rar и прочие файлы. В этой статье вы написали что нужно сделать но вы не написали в каком файле эту нужно прописать? Подскажите пожалуйста, а лучше пример ещё приведите.

  41. admin says:

    для индидуальных настроек создайте файл ads_config.php в папке плагина и туда этот код полжите

  42. Дима says:

    Так такой же файл там уже есть и если создать новый то старый будет заменен и это приведет к фатальной ошибки плагина…разве я не прав?

  43. slego says:

    Здравствуйте.

    В версии «Ads WordPress 3.1.0» файла «ads_config.php» я ненашел.
    Напишите, пожалуйста как добавлять поля, радиокнопки, чекбоксы во все формы (цена, город) и как добавлять поля, радиокнопки, чекбоксы в форму конкретной рубрики, например «недвижимость» (1к-квартира, балкон, и т.д).

    Я понимаю что вы пишите для, программистов, но у всех уровень знаний разный. Зачем всем по очереди наступать на одни и те же грабли.

    Этой статьей вы избавите свой сайт от ненужных вопросов и самое главное, гораздо больше людей поставят ваш плагин.

    Пишите, пожалуйста, последовательно, берем это, вставляем туда. Создаем файл с таким то названием и в такой папке и тд. В результате получаем это. И не ленитесь вставлять картинки. Одна картинка заменяет тысячу слов.

  44. DRaMS says:

    Дело говорит! Я вот сижу уже на этом сайте 3-ий день и не могу понять что, куда, как. Установить установил. А как категории добавлять так и не понял.

  45. admin says:

    есть http://ili.com.ua/wordpress/ads-wordpress/poshagovaya-ustanovka-plagina-ads-wordpress-3x.html там есть 2 пункта по категориям

    Исключить рубрики id
    Родительская рубрика

  46. admin says:

    дело в том что сейчас плагин находится в переходном состоянии в 3.1.0 меняется структура файлов, не все вопросы еще решены,
    вот и одно из таких новшеств это то, что ads_config.php вам теперь надо создать самостоятельно, забыл об этом написать
    когда все это устаканится напишу подробную инструкцию в картинках
    и кстати говоря пример есть http://ili.com.ua/wordpress/funktsii-dlya-rabotyi-s-kategoriyami.html
    может не совсем подробно но всеже при желании можно разобраться

  47. says:

    а у меня проблема с добавление мета полей, в форме объявления они есть, а выводиться не хотят, с чем это может быть свыязано???
    эта проблема наглядно на моем сайте

  48. admin says:

    Ну так надо же добавить вывод полей в шаблоне !
    в post_default_template.php добавьте вывод

    Огранизация: <?=$ads_show?>
    ....
  49. says:

    Не совсем понял, точнее совсем не понял причем «Огранизация: «…
    Моя проблема в том, что в новых произвольных полях, при заполнении данными они просто напросто не сохраняются и не создаются (проверял через админку новые заполненные при помощи плагина произвольные поля отсутствуют, хотя они вполне создаются в ручную в админке с ключами ads_…), и соответственно не выводятся, может я где-то не включил какую-то функцию???
    Повторюсь что записи в новых произв полях просто не сохраняются

  50. says:

    Не утруждай себя с ответов, отвечу Я, файл ads_config.php, все-таки нужет из-за отсутсвия этого файла и соответственно не возможности прописать в массив ads_filds_form файла ads_config.php код новых произвольных полей, у меня они (поля) и не выводились/не сохранялись, но методом перебора загрузил от предыдущей версии ads_config.php прописал там так как описано выше — КРАСОТА все просто летает, удачи и процветания тебе и твоей работе

    Возможно мой коммент сможет помочь кому нибудь ещё

Новости

  • Война на мультипликационном фронте?
  • Цена газа для Украины – без изменений
  • Украинское кино в Нигерии
  • Английский язык региональный в Киеве
  • Молодежь Украины не ждут на выборах
  • В Харькове узаконили русский язык
  • Триумфальное шествие Мадонны по Киеву
  • Комментарии


    Расширеный поиск +

    Другие статьи

    Объявления

    Мои проекты на WordPress

    , - специализированная доска объявлений по недвижимости на стоимость сборки $300 с установкой.
    городская доска объявлений, основные разделы: недвижимость, транспорт, услуги, работа, куплю-продам. Стоимость сборки $300 с установкой.
    - разработка, поддержка.

    Счетчики