API плагина

Как вообще пользоваться 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).