歲月留聲

WordPress 6.0 菜单函数 wp_nav_menu 不工作?

今天无意中发现博客主页、单页(文章和页面)右上方菜单能正常显示,但是分类、标签或者搜索页面菜单都出不来,空白,开始以为是缓存代码有问题,检查发现确实有问题。

WordPress 6.0 菜单函数 wp_nav_menu 不工作? - 第1张图片

「WordPress 6.0 菜单函数 wp_nav_menu 不工作?:https://0xo.net/182」

但是修正菜单缓存代码后,直接打开分类、标签或者搜索页面,菜单还是空白;这时候打开一下首页、单页(文章和页面),右上方菜单能正常显示,这样再打开分类、标签等页面,菜单也能正常显示。

这就是说缓存能正常工作,但是主题跟 wp_nav_menu 还是不和~搜索找到 WP_NAV_MENU Does not work WP 6.0Since Update WP 6.0 menus are messed up und untranslatetable

wp_nav_menu 出不来大概率与 pre_get_posts 有关,检查主题代码有好几个 pre_get_posts,最终锁定下面代码:

「WordPress 6.0 菜单函数 wp_nav_menu 不工作?:https://0xo.net/182」
//分类、归档页面不显示私密文章 uxtt.com
function theme_search_filter( $query ) {
if( is_admin() || is_home() || is_front_page() || is_singular() ){
return $query;
}
if ( $query->is_search || $query->is_archive ) {
$query->set( 'post_status', 'publish' );
$query->set( 'post_type', array( 'post', 'page' ) );//归档页面 包含 页面 page
$query->set( 'orderby', 'modified');
$query->set( 'posts_per_page', 15 );
}
return $query;
}
add_filter( 'pre_get_posts', 'theme_search_filter' );

操作前面搜索结果,加上 $query->get('post_type') === 'nav_menu_item' 把 nav_menu_item 排除掉,改成如下:

//分类、归档页面不显示私密文章 uxtt.com
function theme_search_filter( $query ) {
if( is_admin() || is_home() || is_front_page() || is_singular() || ($query->get('post_type') === 'nav_menu_item') ){
return $query;
}
if ( $query->is_search || $query->is_archive ) {
$query->set( 'post_status', 'publish' );
$query->set( 'post_type', array( 'post', 'page' ) );//归档页面 包含 页面 page
$query->set( 'orderby', 'modified');
$query->set( 'posts_per_page', 15 );
}
return $query;
}
add_filter( 'pre_get_posts', 'theme_search_filter' );

再试,果然好了。另外还发现,首页查询少了 1~2 次。

应该是 WordPress 6.0 提高了导航菜单性能

「WordPress 6.0 菜单函数 wp_nav_menu 不工作?:https://0xo.net/182」

在获取导航菜单的 wp_get_nav_menu_items 函数中,首先使用简单的 taxonomy query 代替 get_objects_in_term 函数,这个替换可以把两次数据库查询降低到一次,这样每次获取菜单都能节省一次 SQL 请求,并且还能保持数据一致性。

此外如果菜单中含有分类和文章数据,wp_get_nav_menu_items 会改成使用 _prime_term_cache 和 _prime_post_cache 来准备 term 和 post 缓存,这两个函数会使得获取菜单的数据库请求变得更少,效率更高。

「WordPress 6.0 菜单函数 wp_nav_menu 不工作?:https://0xo.net/182」

退出移动版