如果一个函数需要ADD_ACTION(‘init’),我怎么能在插件激活时只运行一次呢?

时间:2013-10-23 作者:codecowboy

我正在使用wp\\u insert\\u term()从csv文件中插入大量分类术语。该csv文件的内容可能会偶尔更改。根据codex,wp\\u insert\\u term()需要在add\\u action(\'init\')上运行,但我只想运行一次。如何在插件激活时实现这一点?

我目前正在插件的构造器中执行此操作,该构造器在每次页面加载时都会运行:

   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 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  ) {
                // 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 个回复
最合适的回答,由SO网友:helgatheviking 整理而成

我认为没有必要从激活函数将这些项添加到init挂钩。我想你可以直接给他们打电话:

private static function single_activate() {
    self::add_partner_terms(); //$this->add_partner_terms();
    self::add_geo_terms();  //$this->add_geo_terms();
}
我不确定是否应该self::$this-> 因为我对OOP有点模糊,尤其是今晚。

SO网友:josh

这个register_activation_hook() 仅在插件激活时执行。

也许你更喜欢用这个钩子?

SO网友:Otto

抄本错了。或者更确切地说,是错误的。wp\\U insert\\U term可以在任何适当的时候运行。

您不应该在init之前运行它,但没有特别需要在init上运行它。

记住,《法典》是一个维基。人们可以自由编辑它。并不是所有的人每次都会百分之百。

编辑:至于问题中的代码不起作用的原因:“init”操作在激活过程中不会运行。因此,将这两个动作相加不会起任何作用。相反,您可以将插入项直接放在single\\u activate函数中,这样就可以了。但是,请确保首先检查要插入的术语是否存在。人们也可以激活、停用和重新激活。

结束

相关推荐