我试图在页面或帖子正文中添加一个使用自定义walker类的菜单,并决定使用短代码。我不必使用短代码,但我必须将菜单嵌入页面/帖子内容的中心部分,并且菜单必须使用自定义walker。
而像这样的问题:https://wordpress.stackexchange.com/a/293006/67420 有一种工作方法可以在页面内容中嵌入菜单,尝试扩展该菜单以传递自定义walker会失败,并出现以下警告:
警告:call\\u user\\u func\\u array()要求参数1是有效回调,在/…中找不到类“new wp\\u bootstrap\\u navwalker()”/站点/wp包括/导航菜单模板。php在线580
此菜单使用相同的自定义walker类,在标题中定期调用时运行良好。在这种情况下,我必须将主菜单插入到某个页面内容的中心部分(因此它不会在该页面的标题中调用)。此外,我还尝试按照下面的建议显式包含该类@Antti Koskinen.
以下是我的短代码:
[menu container="div" container_id="main-nav" container_class="collapse navbar-collapse justify-content-center" menu_id="false" menu_class="navbar-nav" depth="3" fallback_cb="wp_bootstrap_navwalker::fallback" walker="new wp_bootstrap_navwalker()"]
下面是我的自定义快捷码函数:
add_shortcode( \'menu\', \'se_menu_shortcode\' );
function se_menu_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
\'container\' => null,
\'container_id\' => null,
\'container_class\' => null,
\'menu_id\' => null,
\'menu_class\' => null,
\'depth\' => null,
\'fallback_cb\' => null,
\'walker\' => null
), $atts ) );
return wp_nav_menu( array(
\'container\' => $container,
\'container_id\' => $container_id,
\'container_class\' => $container_class,
\'menu_id\' => $menu_id,
\'menu_class\' => $menu_class,
\'depth\' => $depth,
\'fallback_cb\' => $fallback_cb,
\'walker\' => $walker,
\'echo\' => false
) );
}
感谢您的帮助!
最合适的回答,由SO网友:Antti Koskinen 整理而成
Update 30.6.2019
啊,现在我想我明白了代码和警告是怎么回事了。我认为它实际上是在试图找到一个名为“new wp\\u bootstrap\\u navwalker()”的类。
在我的本地沙盒WP中,我在更改后使用了短代码\'walker\' => $walker,
到\'walker\' => new $walker,
. 我还将walker参数从walker="new wp_bootstrap_navwalker()"
到walker="wp_bootstrap_navwalker"
EDIT
\'walker\' => new $walker,
应该是这样的
\'walker\' => $walker ? new $walker : \'\',
为避免错误,如果
$walker
是
null
.
如果您收到“找不到类”警告,那么在您尝试实例化类时,可能还没有包括/加载类文件。因此,如果需要,您可以尝试在shortcode函数中要求/包含类文件。沿着这些路线,
function se_menu_shortcode( $atts, $content = null ) {
// extract
if ( ! class_exists(\'wp_bootstrap_navwalker\') ) {
require_once \'path/to/class/definition/file.php\';
}
// return
}
或者您可以尝试编写一个自动加载器来自动处理类的请求/包含,
https://www.php.net/manual/en/function.spl-autoload-register.php