Plugin does not add action

时间:2019-02-15 作者:Fusion

我是Wordpress插件开发的新手,我想创建一个简单的插件,它将在Wordpress管理的常规设置中添加2个字段。从这个答案中,我得到了以下代码(工作正常):Add multiple custom fields to the general settings page

复制时(&A);将此代码粘贴到我的主题中functions.php 文件,它工作得很好。但我需要它只有在插件被激活后才能工作(所以它独立于主题)。因此,我将此代码移到插件的主文件中,并添加了注册激活和停用插件功能。

function my_general_section() {  
    add_settings_section(  
        \'my_settings_section\', // Section ID 
        \'My Options Title\', // Section Title
        \'my_section_options_callback\', // Callback
        \'general\' // What Page?  This makes the section show up on the General Settings Page
    );

    add_settings_field( // Option 1
        \'option_1\', // Option ID
        \'Option 1\', // Label
        \'my_textbox_callback\', // !important - This is where the args go!
        \'general\', // Page it will be displayed (General Settings)
        \'my_settings_section\', // Name of our section
        array( // The $args
            \'option_1\' // Should match Option ID
        )  
    ); 

    add_settings_field( // Option 2
        \'option_2\', // Option ID
        \'Option 2\', // Label
        \'my_textbox_callback\', // !important - This is where the args go!
        \'general\', // Page it will be displayed
        \'my_settings_section\', // Name of our section (General Settings)
        array( // The $args
            \'option_2\' // Should match Option ID
        )  
    ); 

    register_setting(\'general\',\'option_1\', \'esc_attr\');
    register_setting(\'general\',\'option_2\', \'esc_attr\');
}

function my_section_options_callback() { // Section Callback
    echo \'<p>A little message on editing info</p>\';  
}

function my_textbox_callback($args) {  // Textbox Callback
    $option = get_option($args[0]);
    echo \'<input type="text" id="\'. $args[0] .\'" name="\'. $args[0] .\'" value="\' . $option . \'" />\';
}

function orgnizerInfoSettings__activation(){
    add_action(\'admin_init\', \'my_general_section\'); 
}

function orgnizerInfoSettings__deactivation(){
    remove_action(\'admin_init\', \'my_general_section\');
}

register_activation_hook( __FILE__, \'orgnizerInfoSettings__activation\' );
register_deactivation_hook( __FILE__, \'orgnizerInfoSettings__deactivation\' );
你知道我做错了什么吗?我觉得一切都是合法的。

1 个回复
SO网友:Krzysiek Dróżdż

激活挂钩只有在插件被激活后才会运行。所以只有一次,也只有在那一次请求中。这意味着允许插件的作者在插件激活后执行一些操作。只需执行一次的操作。例如,如果插件使用自定义数据库表,则可以使用激活挂钩创建此类表。

另一方面add_action 如果您希望它在请求期间运行,则必须每次都为每个请求执行。

若插件并没有激活,那个么它的代码就不会再运行,所以它的动作就不会被执行。

这意味着:

在这种情况下,不需要使用激活挂钩以下是修复后的代码:

function my_general_section() {
    register_setting(\'general\',\'option_1\', \'esc_attr\');
    register_setting(\'general\',\'option_2\', \'esc_attr\');

    add_settings_section(  
        \'my_settings_section\', // Section ID 
        \'My Options Title\', // Section Title
        \'my_section_options_callback\', // Callback
        \'general\' // What Page?  This makes the section show up on the General Settings Page
    );

    add_settings_field( // Option 1
        \'option_1\', // Option ID
        \'Option 1\', // Label
        \'my_textbox_callback\', // !important - This is where the args go!
        \'general\', // Page it will be displayed (General Settings)
        \'my_settings_section\', // Name of our section
        array( // The $args
            \'option_1\' // Should match Option ID
        )  
    ); 

    add_settings_field( // Option 2
        \'option_2\', // Option ID
        \'Option 2\', // Label
        \'my_textbox_callback\', // !important - This is where the args go!
        \'general\', // Page it will be displayed
        \'my_settings_section\', // Name of our section (General Settings)
        array( // The $args
            \'option_2\' // Should match Option ID
        )  
    ); 
}

function my_section_options_callback() { // Section Callback
    echo \'<p>A little message on editing info</p>\';  
}

function my_textbox_callback($args) {  // Textbox Callback
    $option = get_option($args[0]);
    echo \'<input type="text" id="\'. $args[0] .\'" name="\'. $args[0] .\'" value="\' . $option . \'" />\';
}
add_action(\'admin_init\', \'my_general_section\');

相关推荐

Hooks are not executing

根据我对钩子的理解,您可以通过do\\u action(“hook\\u name”)创建一个钩子;然后向所述钩子中添加一些内容,并在希望它执行钩子的位置调用该方法,因此:public function hook_name(){ do_action(\'hook_name\'); } 有些地方你会做类似的事情:add_action(\'hook_name\', \'some_hook\'); 然后在主题中的一些地方,你称之为:hook_name();