我创建了一个自定义帖子类型的“投资组合”和一个带有模板的页面,该模板检索与该自定义帖子类型匹配的所有帖子。
问题是当我深入研究实际帖子时,该帖子似乎位于主菜单突出显示的“博客”下(将 current_page_parent 显示为一个类)
永久链接网址正确:www.site.com/portfolio/post-slug
但菜单认为父母是“博客”。
这显然是一个分层问题,但我不知道如何解决它。
我创建了一个自定义帖子类型的“投资组合”和一个带有模板的页面,该模板检索与该自定义帖子类型匹配的所有帖子。
问题是当我深入研究实际帖子时,该帖子似乎位于主菜单突出显示的“博客”下(将 current_page_parent 显示为一个类)
永久链接网址正确:www.site.com/portfolio/post-slug
但菜单认为父母是“博客”。
这显然是一个分层问题,但我不知道如何解决它。
看来这是核心 Wordpress 代码的问题;生成菜单类的代码会将 current_page_parent 添加到您的博客页面中,除了查看静态页面模板时。
(这已在http://core.trac.wordpress.org/ticket/13543中讨论过)。
但是,您可以使用 page_css_class 过滤器通过一些自定义代码来解决这个问题。例如,在 functions.php 中添加一些类似的内容(未经 100% 测试):
功能 my_page_css_class($css_class, $page) { if (get_post_type()=='portfolio' || is_page(57)) { if ($page->ID == get_option('page_for_posts')) { foreach ($css_class as $k=>$v) { if ($v=='current_page_parent') 未设置($css_class[$k]); } } if ($page->ID==57) { $css_class[]='current_page_parent'; } } 返回 $css_class; } add_filter('page_css_class','my_page_css_class',10,2);
当然,将 57 替换为您的投资组合页面的 ID。当查看单个投资组合或查看投资组合页面本身时,这会在打印博客页面时删除 current_page_parent 并将 current_page_parent 添加到您的投资组合页面。
这是我之前建议的解决方案的优化/扩展版本,它几乎是完全自动化的。不再需要额外的 CSS 或菜单属性。
此版本动态获取自定义帖子类型列表,如果当前帖子类型是自定义帖子类型,则它会从所有菜单项中删除“current_page_parent”类。
此外,它会检查每个菜单项以查看它是否适用于具有诸如“page-{custom_post_type_slug}.php”之类的页面模板的页面,如果是,它将添加“current_page_parent”类。
过滤器优先级为1,作为一些主题,替换current_page_parent/etc。具有“活动”类的类(例如“根”执行此操作),因此此过滤器需要首先执行。
最后,它使用了 3 个静态变量,因为该函数被重复调用,并且这些(显然)在所有调用中保持不变。
function theme_current_type_nav_class($css_class, $item) {
static $custom_post_types, $post_type, $filter_func;
if (empty($custom_post_types))
$custom_post_types = get_post_types(array('_builtin' => false));
if (empty($post_type))
$post_type = get_post_type();
if ('page' == $item->object && in_array($post_type, $custom_post_types)) {
$css_class = array_filter($css_class, function($el) {
return $el !== "current_page_parent";
});
$template = get_page_template_slug($item->object_id);
if (!empty($template) && preg_match("/^page(-[^-]+)*-$post_type/", $template) === 1)
array_push($css_class, 'current_page_parent');
}
return $css_class;
}
add_filter('nav_menu_css_class', 'theme_current_type_nav_class', 1, 2);
PS。只是指出到目前为止我见过的所有非 CSS 解决方案中的一个缺点,包括我自己的:没有考虑到突出显示链接到显示当前自定义帖子的页面的项目的菜单项父/祖先帖子类型。考虑一个自定义帖子类型“产品”和一个菜单,如:
Home Company News Contact
|
\--About Us
\--Products
“产品”是一个带有模板“page-product.php”的页面,并显示了“产品”类型的帖子的概述。由于发布的解决方案,它被突出显示。但是,“公司”作为其父/祖先也应该突出显示,但不是。要记住的事情。
WP 票:http ://core.trac.wordpress.org/ticket/16382
function fix_blog_menu_css_class( $classes, $item ) {
if ( is_tax( 'my-cat-tax' ) || is_singular( 'my-post-type' ) || is_post_type_archive( 'my-post-type' ) ) {
if ( $item->object_id == get_option('page_for_posts') ) {
$key = array_search( 'current_page_parent', $classes );
if ( false !== $key )
unset( $classes[ $key ] );
}
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'fix_blog_menu_css_class', 10, 2 );
我对此做了更多的环顾四周,并找到了另一种方法。
add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($css_class, $item)
{
if (get_post_type() === 'portfolio') {
$current_value = 'current_page_parent';
$css_class = array_filter($css_class, function ($element) use ($current_value) {
return ($element != $current_value);
});
}
$post_type = get_query_var('post_type');
if ($item->attr_title !== '' && $item->attr_title === $post_type) {
array_push($css_class, 'current_page_parent');
};
return $css_class;
}
我从这篇文章中获得了一些帮助,然后对其进行了修改以从博客页面中删除“current_page_parent”类。 https://wordpress.stackexchange.com/questions/3014/highlighting-wp-nav-menu-ancestor-class-wo-children-in-nav-structure/3034#3034
亲切的瓦尤
正如https://core.trac.wordpress.org/ticket/16382所解释的那样,为了向后兼容,.current_page_parent
匹配“任何不是页面的东西”(请记住,这在 10 年前被认为是向后的...... ) 所以现在的主题真的不应该还在使用它。
因此,最简单且最有效的解决方案(因为与以前的答案不同,它不需要在每次页面加载时运行额外的代码),是修改主题的 CSS 以替换使用.current_page_parent
类选择器.current-menu-parent
,这样做是正确的。(NB 下划线与连字符。)
如果您使用的是第三方主题并且不想直接修改它,那么您可以在自己的样式表中覆盖其属性。例如,如果您的主题有:
.current_page_parent > a {
border-bottom: 4px solid blue;
}
然后在您的子主题的样式表中,您将这样做以消除其效果,并将它们应用于正确的类:
.current_page_parent > a {
border-bottom: transparent !important; /* Cancel out incorrect styling */
}
.current-menu-parent > a {
border-bottom: 4px solid blue; /* Add styling correctly */
}
这只是一个示例 - 正确的方法取决于您的主题如何设置这些链接的样式。
这是一个对我有用的解决方案,无需在代码中定义我的自定义帖子类型或菜单 ID 或页面 ID:
函数 dtbaker_wp_nav_menu_objects($sorted_menu_items, $args){ // 这是我们想要停止运行的 nav-menu-template.php 中的代码 // 所以我们尽力在这个过滤器中“反转”这个代码 wp 代码。 /* if ( !empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id ) $classes[] = 'current_page_parent'; */ // 检查当前页面是否真的是一篇博客文章。 //print_r($wp_query);退出; 全局 $wp_query; if(!empty($wp_query->queried_object_id)){ $current_page = get_post($wp_query->queried_object_id); if($current_page && $current_page->post_type=='post'){ //是的! }别的{ $current_page = 假; } }别的{ $current_page = 假; } $home_page_id = (int) get_option( 'page_for_posts' ); foreach($sorted_menu_items as $id => $menu_item){ if ( !empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id ){ if(!$current_page){ foreach($sorted_menu_items[$id]->classes as $classid=>$classname){ if($classname=='current_page_parent'){ 未设置($sorted_menu_items[$id]->classes[$classid]); } } } } } 返回 $sorted_menu_items; } add_filter('wp_nav_menu_objects','dtbaker_wp_nav_menu_objects',10,2);