Если функция требует действия добавления ("инициализация"), как я могу запустить ее только один раз при активации плагина?
Я использую wp_insert_term() для вставки большого количества терминов таксономии из csv-файла. Содержимое этого csv-файла может время от времени меняться. Согласно кодексу, wp_insert_term() должен запускаться при add_action("инициализация"), но я хочу запустить его только один раз. Как я могу добиться этого при активации плагина?
В настоящее время я просто делаю это в конструкторе моего плагина, который запускается при каждой загрузке страницы:
add_action('init', array($this, 'add_geo_terms'));
И затем
public function add_geo_terms() {
$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 , поэтому я не верю, что это действительно дубликат.
register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );
public static function activate( $network_wide ) {
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
if ( $network_wide ) {
// Get all blog ids
$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() {
add_action('init', 'add_partner_terms'); // i have tried many variations with classname, self etc
add_action('init', 'add_geo_terms');
}
3 answers
Я не думаю, что есть необходимость добавлять элементы в крючок инициализации из функции активации. Я думаю, вы можете позвонить им напрямую:
private static function single_activate() {
self::add_partner_terms(); //$this->add_partner_terms();
self::add_geo_terms(); //$this->add_geo_terms();
}
Я не совсем уверен, должно ли это быть self::
или $this->
, потому что я немного смутно представляю себе ООП, особенно сегодня вечером.
register_activation_hook()
выполняется только при активации плагина.
Возможно, это тот крючок, который вы предпочли бы использовать?
Кодекс ошибочен. Вернее, ошибся. wp_insert_term может быть запущен в любой подходящий момент.
Вы не должны запускать его до инициализации, но нет особой необходимости запускать его на инициализации.
Помните, кодекс - это вики. Люди могут свободно редактировать его. Не все из них будут на 100 % каждый раз.
Изменить: Что касается причины, по которой ваш код в вопросе не работает: действие "инициализация" не выполняется во время процесса активации. Так что добавляя эти два действия ничего не дадут. Вместо этого вы можете поместить термин insert непосредственно в эту функцию single_activate, и все будет в порядке. Однако не забудьте сначала проверить, существует ли термин, который вы хотите вставить, или нет. Люди также могут активировать, деактивировать и повторно активировать.