我正在用面向对象的方法创建一个主题选项页面。此对象的每个新实例都是一个单独的子页面。渲染和所有选项都很好(仍在进行中,但简而言之,效果很好),除了AJAX保存。
我已将__construct
方法此
public function __construct( $subpage_name, $html_array ) {
$this->subpage_name = $subpage_name;
$this->html_array = $html_array;
add_action( \'admin_menu\', array( $this, \'create_submenu_pages\' ) );
add_action( \'wp_ajax_settings_save\', array( $this, \'all_settings_save\' ) );
}
我有一个方法
public function all_settings_save() {
if ( isset( $_POST[\'data\'], $_POST[\'settings_nonce\'] ) && wp_verify_nonce( sanitize_key( $_POST[\'settings_nonce\'] ), \'settings_nonce_action\' ) && \'\' !== $_POST[\'data\'] ) { // Input var okay.
$settings = json_decode( sanitize_text_field( wp_unslash( $_POST[\'data\'] ) ) ); // Input var okay.
update_option( str_replace( \' \', \'_\', strtolower( $this->subpage_name ) ), $settings );
}
wp_die();
}
当我单击save按钮时,我的ajax可以工作,因为我可以在inspector中看到数据(网络选项卡,然后是admin ajax.php),例如,它显示表单数据是:
action:settings_save
data:{
"settings": {
"header_title": "Testing",
"logo": "",
"retina_logo": "",
"retina_logo_width": "23",
"retina_logo_height": "",
"transparent_logo": "",
"transparent_retina_logo": "",
"transparent_retina_logo_width": "",
"transparent_retina_logo_height": "",
"background_image": ""
}
}
settings_nonce:b7778588e3
所以这应该存储在我的数据库中,如果是“标题设置”页面,那么
header_settings
my中的选项
wp_options
桌子但当我重新加载页面时,不会插入任何内容,因为我没有调用任何行
header_settings
存在于
wp_options
桌子
我以为验证检查失败了,所以我删除了它们,但我还是什么都没有得到。
我做错了什么?
最合适的回答,由SO网友:dingo_d 整理而成
找到问题。首先我添加了
ini_set(\'log_errors\',TRUE);
ini_set(\'error_reporting\', E_ALL);
ini_set(\'error_log\', dirname(__FILE__) . \'/error_log.txt\');
沿着
define(\'WP_DEBUG\', TRUE);
在我的
wp-config.php
, 这会将错误、通知和警告写入
error_log.txt
在根文件夹中(我不知道为什么我一开始没有想到这一点)。
然后我看到了错误-我使用json_decode
而不是wp_json_encode
将我的设置编码为字符串,然后再将其存储到我的选项中。
有一个奇怪的问题,名字不属于子页面,但我现在就来讨论这个问题。
感谢死亡医生建议error_message()
找出代码是否有效的方法。这将有助于将来进行任何AJAX调试。