В процессе создания плагина я ставлю перед собой несколько целей:
- Сделать импорт постов с Liveinternet. Это главное.
- Изучить лучше WordPress, научиться писать плагины под этот движок.
При удачном стечении обстоятельств :) ко мне в руки попал li.ru импортер для старой версии WordPress до 3-й, который не работал в новой версии. Его я использую для своих целей. Приступим…
Для начала нужно разобрать основной принцип работы плагинов для WordPress. В движке используется система перехвата событий движка написанными в плагине функциями и дальнейшая работа идет уже в функции. Это т.н. система хуков (hook). Две основные функции для перехвата:
1 2 3 |
add_action (in_action, out_action); |
– переопределяет функцию движка на пользовательскую
1 2 3 |
add_filter (in_action, filter); |
– срабатывает при вызове базовой функции, т.е. дополняет ее.
В плагине у нас будет класс, который будет наследоваться (расширять) класс WP_Importer.
1 2 3 |
class liru_Import extends WP_Importer |
Соответственно класс имеет конструктор function liru_Import (), его я и буду использовать для перехвата.
1 2 3 |
add_action( 'init', 'liru_Import' ); |
Писать можно в начале, или в конце файла, но не в теле класса. Таким образом мы заставляем WordPress выполнить нашу функцию вместе с стандартным вызовом init. Конструктор будет пустой.
1 2 3 4 5 |
function liru_Import() { // Nothing. } |
Далее нам нужно позаботиться о возможности установки нашего плагина в систему и его активации в разделе плагинов в админке. Стоит обратить внимание, что наш импортер не будет иметь настроек, но если в будущем они будут нужны, то добавить или удалить настройки можно такими функциями:
1 2 3 4 |
register_activation_hook(__FILE__, ‘set_funct’); register_deactivation_hook(__FILE__, ‘unset_funct’); |
Тут set_funct функция для установки настроек плагина, unset_funct для удаления, при удалении плагина. Написать их нужно в файле плагина. Так же нужно знать, что опции хранятся в специльной таблице WordPress.
*prefix_options – таблица mySQL с настройкам wordpress. prefix задаётся в файле wp-config при установке wordpress и по умолчанию имеет занчение wp (т. е. таблица называется wp_options).
Дальнейшую работу с опциями можно посмотреть в документации. Мне это не пригодилось.
Установки Импортера выполняется проще.
1 2 3 4 5 |
$liveinternetru_import = new liru_Import(); register_importer('liru', __('LiveInternet.ru'), __('Import posts from a LiveInternet.ru XML export file.'), array ($liveinternetru_import, 'dispatch')); |
Создаем экземпляр нашего класса импорта, вызываем стандартную функцию register_importer где указывается название, описание (для раздела импорта) и главный параметр тут array().
Рассмотрим методы класса.
function dispatch() используется для проверки шагов выполнения импорта и прерывания выполнения в случае ошибки. У нас будет 2 шага. На первом будем выводить приветствие, на втором проверять событие ‘import-upload’. Т.е. если файл для импорта загружен, тогда вызываем функцию импорта.
function import() – главная функция, которая ведет процесс импорта. Как и dispatch() эти функции переопределяют и расширяют стандартный класс WP_Importer.
Т.к. основной код я брал не свой, я приведу его в конце полностью с комментариями.
function greet() будет выводить начальное приветствие и загружать форму, в которой мы будем выбирать файлы для импорта. Выполняется на первом шаге.
function header() и function footer() будут вызываться в dispatch() на определенных шагах выполнения. Они выводят только html разметку.
Теперь в начале файла выполним несколько проверок:
1 2 3 4 |
if ( !defined('WP_LOAD_IMPORTERS') ) return; |
Если выполнение происходит не из меню импорта, то ничего выполнять не будем.
1 2 3 |
require_once ABSPATH . 'wp-admin/includes/import.php'; |
Загружаем API импорта. Раньше было достаточно положить файл импорта в папку import в структуре сайта и новый импортер автоматически подхватывался. Теперь же по системе плагинов все указываем руками.
Нужно убедиться, что класс, от которого мы будем наследовать импортер существует.
1 2 3 4 5 6 7 |
if ( !class_exists( 'WP_Importer' ) ) { $class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php'; if ( file_exists( $class_wp_importer ) ) require_once $class_wp_importer; } |
Если все еще не подключен, то подключаем его и наконец-то объявляем наш класс импорта.
1 2 3 4 5 |
if ( class_exists( 'WP_Importer' ) ) { class liru_Import extends WP_Importer { } } |
В следующем посте приведу полный код с комментариями, т.к. он довольно таки большой.
Полезные ссылки:
Ссылка для скачивания liru-importer c моего блога
Мой плагин в репозиториях WordPress