PHP7.4+下wp_nav_menu的items_wrap报错:sprintf参数不足/未知格式符
错误原因分析
sprintf(): Too few arguments:wp_nav_menu的items_wrap参数是作为sprintf模板使用的,默认会传入3个固定参数:%1$s对应菜单ID,%2$s对应菜单类名,%3$s对应生成的菜单项HTML。你在if分支中使用了无编号的%s,且拼接的变量中可能包含%字符,导致sprintf解析时参数数量不匹配。Uncaught ValueError: Unknown format specifier "C":PHP7.4+对sprintf格式符的校验更严格,当URL中包含%(比如URL编码的空格%20)时,未转义的%会被当成sprintf的格式符,触发未知格式符的报错。
修正后的代码
$menu = wp_get_nav_menu_object('primary-menu'); $navId = $menu->term_id; $menuId = 'menu_' . $navId; $navUrl = get_field('social_media_url', $menuId); $navImg = get_field('social_media_img', $menuId); if ($navUrl && $navImg) { // 单独生成社交菜单项,避免URL中的%干扰外层sprintf解析 $socialItem = sprintf( '<li class="menu-social-option"><a href="%s" target="_blank"><img src="%s"></a></li>', esc_attr($navUrl), esc_attr($navImg['url']) ); // 保持items_wrap模板的编号格式符,匹配wp_nav_menu默认传入的3个参数 $socialOption = '<ul id="%1$s" class="%2$s">%3$s' . $socialItem . '</ul>'; } else { $socialOption = '<ul id="%1$s" class="%2$s">%3$s</ul>'; } $navArray = array( 'theme_location' => 'primary', 'menu_id' => 'primary-menu', 'container' => false, 'depth' => 2, 'items_wrap' => $socialOption, 'menu_class' => 'navbar-nav ml-auto', 'walker' => new Bootstrap_NavWalker(), 'fallback_cb' => 'Bootstrap_NavWalker::fallback', ); wp_nav_menu($navArray);
关键修正点
- 统一使用编号格式符:
items_wrap模板中始终使用%1$s、%2$s、%3$s,和wp_nav_menu内部传入的参数一一对应,避免参数数量不匹配。 - 隔离动态内容:将包含URL的社交菜单项单独用
sprintf生成,再拼接到items_wrap模板中,确保URL中的%不会被外层的sprintf误判为格式符。
内容的提问来源于stack exchange,提问作者in2d
相关产品推荐
相关产品推荐

