Если функция требует действия добавления ("инициализация"), как я могу запустить ее только один раз при активации плагина?


Я использую 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');

}
Author: codecowboy, 2013-10-23

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->, потому что я немного смутно представляю себе ООП, особенно сегодня вечером.

 1
Author: helgatheviking, 2013-10-24 21:03:53

register_activation_hook() выполняется только при активации плагина.

Возможно, это тот крючок, который вы предпочли бы использовать?

 5
Author: josh, 2013-10-23 17:09:52

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

Вы не должны запускать его до инициализации, но нет особой необходимости запускать его на инициализации.

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

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

 3
Author: Otto, 2013-10-24 21:35:05