我有一个带有激活挂钩功能的插件。此函数必须注册4个设置变量。
我不明白为什么,但只有第一个设置被正确注册,最后3个以某种方式被跳过。
这是插件主文件:
<?php
/*
Plugin Name: Integrazione Liferay
Version: 1.1.0
Text Domain: integrazione-liferay
*/
register_activation_hook( __FILE__, \'integrazione_liferay_activate\');
register_deactivation_hook( __FILE__, \'integrazione_liferay_deactivate\');
register_uninstall_hook( __FILE__, \'integrazione_liferay_uninstall\');
//Funzione di attivazione plugin
function integrazione_liferay_activate() {
// Registro variabile che indica se il cron deve essere attivo
if (get_option(\'integrazione_liferay_cron_enabled\') === false) {
$args = array(
\'type\' => \'integer\',
\'default\' => 0,
);
register_setting( \'integrazione_liferay_options\', \'integrazione_liferay_cron_enabled\', $args );
}
update_option( \'integrazione_liferay_cron_enabled\', 1);
// Registro variabile che indica se è necessario riscrivere i permalinks
if (get_option(\'integrazione_liferay_flush_permalinks\') === false) {
$args = array(
\'type\' => \'integer\',
\'default\' => 0,
);
register_setting( \'integrazione_liferay_options\', \'integrazione_liferay_flush_permalinks\', $args );
}
update_option( \'integrazione_liferay_flush_permalinks\', 0);
// Registro variabile che indica l\'ultimo timestamp elaborato
if (get_option(\'integrazione_liferay_last_timestamp\') === false) {
$args = array(
\'type\' => \'integer\',
\'default\' => 0,
);
register_setting( \'integrazione_liferay_options\', \'integrazione_liferay_last_timestamp\', $args );
}
update_option( \'integrazione_liferay_last_timestamp\', 0);
// Registro variabile che memorizza il csv serializzato
if (get_option(\'integrazione_liferay_csv_data\') === false) {
$args = array(
\'type\' => \'string\',
\'default\' => "",
);
register_setting( \'integrazione_liferay_options\', \'integrazione_liferay_csv_data\', $args );
}
update_option( \'integrazione_liferay_csv_data\', "");
}
// Funzione di disattivazione plugin
function integrazione_liferay_deactivate() {
// Disabilito creazione nuovi cron
update_option( \'integrazione_liferay_cron_enabled\', 0);
// De-schedulo tutti i cron già schedulati
$timestamp = wp_next_scheduled( \'integrazione_liferay_cron_hook\' );
while ($timestamp) {
wp_unschedule_event( $timestamp, \'integrazione_liferay_cron_hook\' );
$timestamp = wp_next_scheduled( \'integrazione_liferay_cron_hook\' );
}
}
// Funzione di disinstallazione plugin
function integrazione_liferay_uninstall() {
// Eseguo disattivazione preventiva
integrazione_liferay_deactivate();
// Rimuovo i settings
unregister_setting( \'integrazione_liferay_options\', \'integrazione_liferay_cron_enabled\' );
unregister_setting( \'integrazione_liferay_options\', \'integrazione_liferay_flush_permalinks\' );
unregister_setting( \'integrazione_liferay_options\', \'integrazione_liferay_last_timestamp\' );
unregister_setting( \'integrazione_liferay_options\', \'integrazione_liferay_csv_data\' );
}
我试着通过停用和重新激活插件来调试这篇文章。调试器每次都会尝试将最后3个设置设置为
get_option() 在这三个月里
false 每次激活时。这是调试结果(GIF):

这就是结果
/options.php 激活后:

我在其他一些插件中使用过这种设置模式,但我无法理解这种模式的行为。
提前感谢您的回复。
最合适的回答,由SO网友:Jacob Peattie 整理而成
register_setting 不在数据库中插入任何内容。应该是磨合的admin_init, 不仅仅是在激活时,而且用于构建选项页面Settings API 并在管理员中保存选项时处理诸如清理和权限之类的事情。
如果要在激活时向数据库添加一些默认选项值,请使用add_option(). 它将向数据库中添加选项和值,但前提是该选项还没有值:
function integrazione_liferay_activate() {
add_option( \'integrazione_liferay_cron_enabled\', 1 );
add_option( \'integrazione_liferay_flush_permalinks\', 0 );
add_option( \'integrazione_liferay_last_timestamp\', 0 );
add_option( \'integrazione_liferay_csv_data\', \'\' );
}