Как выполнить функцию с add_action('init') только один раз при активации плагина?
Я использую wp_insert_term() для добавления большого количества терминов таксономии из CSV файла. Содержимое этого файла может периодически изменяться. Согласно документации, wp_insert_term() должен выполняться на add_action('init'), но мне нужно запустить его только один раз. Как этого добиться при активации плагина?
Сейчас я просто делаю это в конструкторе моего плагина, который выполняется при каждой загрузке страницы:
add_action('init', array($this, 'add_geo_terms'));
а затем
public function add_geo_terms() {
// Путь к CSV файлу с данными
$path = plugin_dir_path( __FILE__ ).'assets/uk-counties.csv';
$row = 1;
// Открываем файл для чтения
if (($handle = fopen($path, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
if ($c == 1) {
error_log( $data[$c] . "<br />\n");
// Добавляем термин таксономии
wp_insert_term($data[$c],'reseller-regions');
}
}
}
fclose($handle);
}
}
Я использую функции активации из wordpress plugin boilerplate, поэтому не считаю этот вопрос дубликатом.
register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );
public static function activate( $network_wide ) {
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
if ( $network_wide ) {
// Получаем ID всех блогов
$blog_ids = self::get_blog_ids();
foreach ( $blog_ids as $blog_id ) {
switch_to_blog( $blog_id );
self::single_activate();
}
restore_current_blog();
} else {
self::single_activate();
}
} else {
self::single_activate();
}
}
private static function single_activate() {
// Пытался разные варианты с именем класса, self и т.д.
add_action('init', 'add_partner_terms');
add_action('init', 'add_geo_terms');
}

Я знаю об этом, но когда я добавил функцию wp_insert_term() внутри хука активации, она не сработала.

Подключите ваш вызов add_action()
в колбэк, который сам подключен к хуку активации плагина.

Вы сначала запускаете хук активации? Перед всеми остальными хуками, включая хук init? (Chip 'da man!)


Я использую WordPress Plugin Boilerplate, поэтому мой single_activate — это статическая функция. Но я всё равно не могу заставить это работать при активации :-/

Кодекс ошибается. Точнее, ошибался. Функцию wp_insert_term можно вызывать в любой подходящий момент.
Не следует запускать её до init, но нет особой необходимости запускать её на хуке init.
Помните, кодекс — это вики. Люди могут свободно его редактировать. Не все правки будут на 100% точными каждый раз.
Примечание: Что касается причины, по которой ваш код в вопросе не работает: Хук "init" не срабатывает во время процесса активации. Поэтому добавление этих двух действий ни к чему не приведёт. Вместо этого вы можете поместить вставку термина непосредственно в функцию single_activate, и всё будет работать. Однако не забудьте сначала проверить, существует ли термин, который вы хотите добавить. Пользователи могут активировать, деактивировать и повторно активировать плагин.

Я не думаю, что есть необходимость добавлять элементы в хук init из функции активации. Думаю, можно вызывать их напрямую:
private static function single_activate() {
self::add_partner_terms(); //$this->add_partner_terms();
self::add_geo_terms(); //$this->add_geo_terms();
}
Я не совсем уверен, должно ли быть self::
или $this->
, потому что я немного путаюсь в ООП, особенно сегодня.
