我正在开发一个以类别作为主菜单的网站。我有一个新的帖子类型,并添加了一个带有"城市指南"标签的存档内容作为菜单项。现在,当我在城市指南页面上时,菜单项没有突出显示。或者使用代码,类"current"未在菜单项类中打印。这是我的代码:
<?php
$menu_name = PRIMARY_NAVIGATION_NAME;
$menu_items = array();
if( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ){
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = $menu ? wp_get_nav_menu_items($menu->term_id) : array();
}
?>
<nav class="visible-sm visible-md visible-lg" role="navigation">
<ul id="menu-primary-navigation" class="main-navigation">
<?php if( !empty($menu_items) ): ?>
<?php
$current_category_object = null;
if( !empty($wp_query->query_vars['category_name']) ){
$category_name = $wp_query->query_vars['category_name'];
$current_category_object = get_category_by_slug($wp_query->query_vars['category_name']);
}
?>
<?php foreach( $menu_items as $item): ?>
<?php
$active_class = false;
if ($item->object == 'category' && !empty($current_category_object) ){
$cat_object = get_category($item->object_id);
if ($cat_object->term_id == $current_category_object->term_id || $cat_object->term_id == $current_category_object->parent) {
$active_class = true;
}
}
?>
<li class="<?php echo sanitize_title($item->title); ?><?php echo ' menu-item-object-category'; if ($active_class) echo ' current'?>">
<a href="<?php echo $item->url; ?>" class="main-category"<?php if( $item->target) echo ' target="' . $item->target . '"'; ?>><?php echo $item->title ?></a>
<?php if( $item->object == 'category'): ?>
<?php
$sub_categories = get_terms( array('category'), array('child_of' => $item->object_id, 'hide_empty' => 0) );
if (count($sub_categories) <= 4) {
include(locate_template('partials/sub-menu-two-featured.php'));
} else {
include(locate_template('partials/sub-menu-one-featured.php'));
}
?>
<?php endif; ?>
<?php if ($item->title == 'City Guide'): ?>
<?php include(locate_template('partials/sub-menu-city-guide.php')); ?>
<?php endif; ?>
</li>
<?php wp_reset_query(); ?>
<?php endforeach; ?>
<?php endif; ?>
</ul>
</nav>
如何使用在上面的代码中为我的存档页面菜单项添加当前条件将其实现到其中。
我试过了
<?php if ($item->title == 'City Guide'): ?>
但它在所有情况下都没有回声,而不是当菜单处于活动状态时。请帮忙。
一种可能的解决方案是为此使用get_queried_object()
函数。
手札说
如果你在单个帖子上,它将返回帖子对象
如果你在页面上,它将返回页面对象
如果您在存档页面上,它将返回帖子类型对象
如果您在类别存档中,它将返回类别对象
如果您在作者存档中,它将返回作者对象
如果您开始使用$qo = get_queried_object()
则无需使用此代码
if( !empty( $wp_query->query_vars['category_name'] ) ){
$category_name = $wp_query->query_vars['category_name'];
$current_category_object = get_category_by_slug(
$wp_query->query_vars['category_name']
);
}
因为:
如果您在
category-archive
页面中,$qo
将包含类别对象,并且$qo->term_id
和$qo->parent
将可用。如果您在 CPT 存档页面中,则
$qo
将包含 CPT 对象,并且 CPTname
、query_var
、label
等属性将可用。
因此,当您有自定义查询对象并借助一些conditional tags
(如is_tax()
、is_tag()
、is_category()
、is_post_type_archive()
(时,您将能够准确确定您的位置。
附言您必须先检查法典,因为使用get_queried_object()
时有一些优先顺序说明
<?php
$active_class = false;
$this_category = get_queried_object();
$this_category->name;
if ($this_category->name == 'city-guide' ){
$active_class = true;
} ?>
<li class="<?php echo sanitize_title($item->title); ?><?php echo ' menu-item-object-category'; if ($active_class ==1 && sanitize_title($item->title) =='city-guide') echo ' current'; ?>">
这有效,感谢@pgk指出我