Как выполнить функцию с add_action('init') только один раз при активации плагина?

23 окт. 2013 г., 20:05:37
Просмотры: 2.14K
Голосов: 1

Я использую 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');
}
0
Все ответы на вопрос 3
7

Функция <a href="http://codex.wordpress.org/Function_Reference/register_activation_hook" rel="noreferrer">register_activation_hook()</a> выполняется только при активации плагина.

Возможно, это именно тот хук, который вам нужен?

23 окт. 2013 г. 20:09:52
Комментарии

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

codecowboy codecowboy
23 окт. 2013 г. 20:11:30

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

Chip Bennett Chip Bennett
23 окт. 2013 г. 20:17:29

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

josh josh
23 окт. 2013 г. 20:17:41

@ChipBennett ты предполагаешь, что я знаю, как это сделать!

codecowboy codecowboy
24 окт. 2013 г. 13:52:12

Вот так:

josh josh
24 окт. 2013 г. 19:16:25

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

codecowboy codecowboy
24 окт. 2013 г. 20:31:33

@josh. спасибо. Я пробовал именно это, но эти функции не работают. Я обновил свой вопрос, добавив ссылку на стиль активации, который я использую

codecowboy codecowboy
24 окт. 2013 г. 20:35:05
Показать остальные 2 комментариев
0

Кодекс ошибается. Точнее, ошибался. Функцию wp_insert_term можно вызывать в любой подходящий момент.

Не следует запускать её до init, но нет особой необходимости запускать её на хуке init.

Помните, кодекс — это вики. Люди могут свободно его редактировать. Не все правки будут на 100% точными каждый раз.

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

25 окт. 2013 г. 00:35:05
1

Я не думаю, что есть необходимость добавлять элементы в хук init из функции активации. Думаю, можно вызывать их напрямую:

private static function single_activate() {
    self::add_partner_terms(); //$this->add_partner_terms();
    self::add_geo_terms();  //$this->add_geo_terms();
}

Я не совсем уверен, должно ли быть self:: или $this->, потому что я немного путаюсь в ООП, особенно сегодня.

25 окт. 2013 г. 00:03:53
Комментарии

Думаю, ты прав! Не понимаю, почему у меня это не работало раньше, но спасибо. Это self, потому что внутри статической функции нет $this.

codecowboy codecowboy
25 окт. 2013 г. 00:28:03