You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7.4+下wp_nav_menu的items_wrap报错:sprintf参数不足/未知格式符

解决wp_nav_menu自定义items_wrap时的PHP报错问题

错误原因分析

  • 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);

关键修正点

  1. 统一使用编号格式符:items_wrap模板中始终使用%1$s、%2$s、%3$s,和wp_nav_menu内部传入的参数一一对应,避免参数数量不匹配。
  2. 隔离动态内容:将包含URL的社交菜单项单独用sprintf生成,再拼接到items_wrap模板中,确保URL中的%不会被外层的sprintf误判为格式符。

内容的提问来源于stack exchange,提问作者in2d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:20:27