将插件从PHP7.4升级到PHP8.2时遇字符串与整数相乘类型错误求助
PHP8.2迁移中WordPress插件的TypeError解决建议
错误详情
Fatal error: Uncaught TypeError: Unsupported operand types: string * int in /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/book-a-room/bookaroom-meetings-public.php:127 Stack trace: #0 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/book-a-room/bookaroom-meetings-public.php(91): bookaroom_public::showForm_checkHoursError() #1 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/shortcodes.php(433): bookaroom_public::mainForm() #2 [internal function]: do_shortcode_tag() #3 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/shortcodes.php(273): preg_replace_callback() #4 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/widgets/shortcode.php(130): do_shortcode() #5 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/controls-stack.php(2297): Elementor\Widget_Shortcode->render() #6 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/widget-base.php(614): Elementor\Controls_Stack->render_by_mode() #7 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/widget-base.php(755): Elementor\Widget_Base->render_content() #8 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/element-base.php(464): Elementor\Widget_Base->print_content() #9 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/element-base.php(1375): Elementor\Element_Base->print_element() #10 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/element-base.php(464): Elementor\Element_Base->print_content() #11 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/element-base.php(1375): Elementor\Element_Base->print_element() #12 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/base/element-base.php(464): Elementor\Element_Base->print_content() #13 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/core/base/document.php(1749): Elementor\Element_Base->print_element() #14 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/core/base/document.php(1144): Elementor\Core\Base\Document->print_elements() #15 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/frontend.php(1179): Elementor\Core\Base\Document->print_elements_with_wrapper() #16 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/includes/frontend.php(1074): Elementor\Frontend->get_builder_content() #17 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/class-wp-hook.php(324): Elementor\Frontend->apply_builder_in_content() #18 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters() #19 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/post-template.php(256): apply_filters() #20 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/modules/page-templates/module.php(190): the_content() #21 [internal function]: Elementor\Modules\PageTemplates\Module->print_callback() #22 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/modules/page-templates/module.php(207): call_user_func() #23 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/elementor/modules/page-templates/templates/header-footer.php(19): Elementor\Modules\PageTemplates\Module->print_content() #24 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-includes/template-loader.php(106): include('/home/851390.cl...') #25 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-blog-header.php(19): require_once('/home/851390.cl...') #26 /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/index.php(17): require('/home/851390.cl...') #27 {main} thrown in /home/851390.cloudwaysapps.com/ctbcfdcbzf/public_html/wp-content/plugins/book-a-room/bookaroom-meetings-public.php on line 127
问题代码(第127行)
$validStart = strtotime( date( 'Y-m-d' ) ) + ( get_option( 'bookaroom_reserveBuffer' ) * 24 * 60 * 60 );
问题分析
错误提示Unsupported operand types: string * int,说明get_option('bookaroom_reserveBuffer')返回的是字符串类型,PHP8.0+提升了类型严格性,不再自动将字符串隐式转换为数字运算。若之前的类型转换尝试无效,大概率是未覆盖选项不存在、返回非有效值的场景。
解决方案
方案1:强制转换+默认值兜底
$reserveBuffer = get_option( 'bookaroom_reserveBuffer' ); // 仅当值为有效数字时转换为整数,否则设为0 $reserveBufferInt = is_numeric($reserveBuffer) ? (int)$reserveBuffer : 0; $validStart = strtotime(date('Y-m-d')) + ($reserveBufferInt * 24 * 60 * 60);
方案2:使用WordPress原生函数(推荐)
WordPress提供的absint()函数可安全将值转为非负整数,同时处理非数字、false等异常情况:
// 给get_option设置默认值0,再用absint确保为整数 $reserveBuffer = absint(get_option('bookaroom_reserveBuffer', 0)); $validStart = strtotime(date('Y-m-d')) + ($reserveBuffer * 24 * 60 * 60);
方案3:简化时间计算(可选优化)
用strtotime直接计算天数,避免手动换算秒数:
$reserveBuffer = absint(get_option('bookaroom_reserveBuffer', 0)); $validStart = strtotime("today + {$reserveBuffer} days");
内容的提问来源于stack exchange,提问作者Marc AMM
相关产品推荐
相关产品推荐

