Как вообще пользоваться API wordpress читаем вот тут http://codex.wordpress.org/Plugin_API
Здесь же я перечислю фильтры и события которые добавляет плагин Ads-WordPress.
Фильтр: ads_check_fields
Запускает пользовательские фильтры проверки данных (которые пользователь ввел в форме).
В фильтр передается 2 переменных: 1-массив полей формы, 2- ссылка на сам объект форма.
Стартует фильтр в ads_form_class.php строки 107, 132
$_REQUEST = apply_filters(‘ads_check_fields’, $_REQUEST, & $this);
1 | $_REQUEST = apply_filters(‘ads_check_fields’, $_REQUEST, & $this); |
Пример использования в файле ads_config.php
add_filter(‘ads_check_fields’, ‘ads_all_filter’); function ads_filter($_post){ if( empty($_post[‘post_title’]) ) $_post[‘error’][‘post_title’][] = ‘Пустой заголовок!’; if( ($len = utf8_strlen($_post[‘post_title’])) > 50 ) $_post[‘error’][‘post_title’][] = ‘Заголовок не белее 50 символов, введено ‘.$len; }
12345678 | add_filter(‘ads_check_fields’, ‘ads_all_filter’); function ads_filter($_post){ if( empty($_post[‘post_title’]) ) $_post[‘error’][‘post_title’][] = ‘Пустой заголовок!’; if( ($len = utf8_strlen($_post[‘post_title’])) > 50 ) $_post[‘error’][‘post_title’][] = ‘Заголовок не белее 50 символов, введено ‘.$len; } |
Проверяем: первое заголовок (post_title) не пустой и второе условие заголовок не больше 50 символов.
Как видно из примера текст ошибки мы записываем в специальный массив $_post[‘error’] пока в этом массиве будет хоть одна ошибка объявление не опубликуется!
Пример подключения в шаблоне формы например form_default_template.php:
if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Error in email!»; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); }
12345678 | if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Error in email!»; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’);} |
Проверяем корректность e-mail.
Обратите внимание – функцию фильтра и само подключение нужно обернуть в условие if( !function_exists(‘ads_this_form_filter’) ){ }. Это связанно с тем, что шаблон формы подключается (include) дважды. Первый раз подключаются фильтры, сканируется названия полей из html текста, потом следует проверка данных (отрабатывает фильтр) Второй include непосредственно печать формы с ошибками или без.
Это очень удобно если у вас много разделов, у каждого раздела разные наборы данных и соответственно разные условия проверки. Для каждого раздела можно создать свой шаблон-форму и здесь же задать условия проверки. Таким образом первый фильтр в ads_config.php – будет работать для всех разделов, а второй фильтр только для разделов, которым назначен шаблон form_default_template.php.
Такой вот полиморфизм.
Фильтр: ads_load_post
расположен: ads_form_class.php строка 447
$load_post = apply_filters(‘ads_load_post’, $load_post, & $this);
1 | $load_post = apply_filters(‘ads_load_post’, $load_post, & $this); |
Когда пользователь загружает объявление для редактирования, весь массив $post предварительно пропускается через этот фильтр.
При переходе на новую версию плагина может возникнуть ошибка, когда редактор не хочет загружать старые объявления для редактирования. Это связанно с тем, что у них не выставлены 2 метаполя: ads_form_name = ярлык страницы с формой редактирования и ads_form_id – id страницы этой же формы, воспользуемся фильтром ads_load_post и при загрузке объявления будем устанавливать эти 2 поля на лету. И так, в ads_config.php добавляем:
function add_ads_form_name($load_post ){ update_post_meta($load_post[‘ID’], ‘ads_form_name’, ‘dobavit-obyavlenie’); update_post_meta($load_post[‘ID’], ‘ads_form_id’, 102); return $load_post; } add_filter(‘ads_load_post’, ‘add_ads_form_name’);
123456 | function add_ads_form_name($load_post ){ update_post_meta($load_post[‘ID’], ‘ads_form_name’, ‘dobavit-obyavlenie’); update_post_meta($load_post[‘ID’], ‘ads_form_id’, 102); return $load_post;}add_filter(‘ads_load_post’, ‘add_ads_form_name’); |
‘dobavit-obyavlenie’ и 102 – естественно надо поменять на свои.
Фильтр: ads_check_files
расположен ads_form_class_lib.php строка 1289
$_FILES = apply_filters(‘ads_check_files’, $_FILES, &$attachments, &$this);
1 | $_FILES = apply_filters(‘ads_check_files’, $_FILES, &$attachments, &$this); |
Фильтр запускается перед загрузкой файлов в нем можно проверить тип загружаемого файла его размер и т.д.
Принимает 3 параметра: 1) системный массив $_FILES то что нам загружают; 2) &$attachments – массив уже загруженных файлов; 3) и на всякий случай ссылку на объект форму.
Пример: проверим загрузку четвертого файла, проверим чтобы он был текстовый, Word или Exel.
Рабочий пример: Дать объявление
в ads_config.php добавляем фильтр:
function check_txt_file($_FILES, $attachments ){ if( empty($attachments[3]) ){ if( empty($_FILES[3][‘size’]) ){ $_FILES[‘error’][3] = «Надо добавить текстовый файл.»; }else{ $mime = wp_check_filetype_and_ext($_FILES[3][‘tmp_name’], $_FILES[3][‘name’]); if( $mime[‘proper_filename’] !== false ) $_FILES[‘error’][3] = «Тип файла не соответствует расширению.»; $type = wp_ext2type($mime[‘ext’]); if( !($type == ‘document’ OR $type == ‘text’ OR $type == ‘spreadsheet’) ) $_FILES[‘error’][3] = «Неправильный тип файла.»; } } return $_FILES; } add_filter(‘ads_check_files’, ‘check_txt_file’,1,2);
1234567891011121314151617 | function check_txt_file($_FILES, $attachments ){ if( empty($attachments[3]) ){ if( empty($_FILES[3][‘size’]) ){ $_FILES[‘error’][3] = «Надо добавить текстовый файл.»; }else{ $mime = wp_check_filetype_and_ext($_FILES[3][‘tmp_name’], $_FILES[3][‘name’]); if( $mime[‘proper_filename’] !== false ) $_FILES[‘error’][3] = «Тип файла не соответствует расширению.»; $type = wp_ext2type($mime[‘ext’]); if( !($type == ‘document’ OR $type == ‘text’ OR $type == ‘spreadsheet’) ) $_FILES[‘error’][3] = «Неправильный тип файла.»; } } return $_FILES;}add_filter(‘ads_check_files’, ‘check_txt_file’,1,2); |
Нумерация файлов начинается с 0, четвертый файл будет иметь индекс 3!
Особенность проверки состоит в том, что у нас есть 2 массива $_FILES – в нем приходит только что отправленный файл и массив $attachments – в нем файл будет хранится постоянно после обработки WordPress. Сначала проверяем $attachments если там нет файла, проверяем $_FILES[3][‘size’] – если и тут пусто значит нам ничего не прислали, выводим ошибку. Если файл прислали проверяем его mime и соответствие расширения wp_check_filetype_and_ext.
Далее проверяем к какому группе типов относится файл wp_ext2type – описания этой функции в codex нет, к сожалению, но она находится в /wp-includes/functions.php по расширению возвращает группу файла (audio,video,archive … все типы кроме image почему-то).
Ошибки записываем в $_FILES[‘error’][номер файла]. Файл не загрузится пока для него есть ошибка.
Вдогонку к этому: wp_get_mime_types, wordpres фильтры mime_types, upload_mimes с помощью них можно расширить список типов файлов разрешенных к загрузке.
Событие: ads_after_saving
расположен ads_form_class.php строка 120, 148
do_action( ‘ads_after_saving’, $post_id, $_REQUEST, & $this);
1 | do_action( ‘ads_after_saving’, $post_id, $_REQUEST, & $this); |
Событие запускается ПОСЛЕсохранения объявления в БД. В этот момент уже точно есть ID объявления, установлены все meta поля и точно известно сколько файлов загрузил пользователь.
Аргументы: $post_id – id объявления, $_REQUEST – полный массив данных из формы, $this – ссылка на объект форму.
Пример: добавим ко всем объявления скрытое мета поле ads_count_file – счетчик кол-ва загруженных файлов, затем используя это мета поля мы можем легко найти объявления у которых есть хоть один файл(картинка).
add_action(‘ads_after_saving’, ‘ads_count_file’, 1 ,3); function ads_count_file($post_id, $arg, $form){ $attachments = $form->get_attachments(); if($attachments) update_post_meta($post_id, ‘ads_count_file’, count($attachments) ); else delete_post_meta($post_id, ‘ads_count_file’); }
123456789 | add_action(‘ads_after_saving’, ‘ads_count_file’, 1 ,3);function ads_count_file($post_id, $arg, $form){ $attachments = $form->get_attachments(); if($attachments) update_post_meta($post_id, ‘ads_count_file’, count($attachments) ); else delete_post_meta($post_id, ‘ads_count_file’);} |
Тут нам пригодится объект форма $form используя метод $form->get_attachments(); мы получаем массив уже загруженных файлов ну и далее добавляем мета поле ‘ads_count_file’, а если файлов нет тогда удаляем его.
События: ads_move_trash, ads_restore
расположение:
ads_move_trash в ads_filters.php строка 446, ads_form_class_lib.php строка 190
ads_restore в ads_form_class_lib.php строка 219
События запускаются когда объявление отправляется в корзину и восстанавливается соответственно.
do_action( ‘ads_move_trash’, $ID )
1 | do_action( ‘ads_move_trash’, $ID ) |
do_action( ‘ads_restore’, $ID )
1 | do_action( ‘ads_restore’, $ID ) |
Принимает один параметр – ID объявления.
Например при удалении в корзину меняем метаполе post_colorна grey, а при восстановлении удаляем поле.
add_action(‘ads_move_trash’,’ads_to_trash’,1,1); function ads_to_trash($post_id){ update_post_meta($post_id, ‘post_color’, ‘gray’ ); } add_action(‘ads_restore’,’ads_ads_restore’,1,1); function ads_ads_restore($post_id){ delete_post_meta($post_id, ‘post_color’); }
12345678910 | add_action(‘ads_move_trash’,‘ads_to_trash’,1,1);function ads_to_trash($post_id){ update_post_meta($post_id, ‘post_color’, ‘gray’ );} add_action(‘ads_restore’,‘ads_ads_restore’,1,1); function ads_ads_restore($post_id){ delete_post_meta($post_id, ‘post_color’);} |
Можно использовать для совместимости с различными темами wordpress, для установки специфических полей.
Событие: ads_cron
расположен в ads_filters.php:478
do_action( ‘ads_cron’ );
1 | do_action( ‘ads_cron’ ); |
Прилепил на всякий случай, запускается после того как отрабатывает автоматическая сборка мусора по расписанию каждый день (cron).