Active sub-menu item not displaying on Wordpress with Bootstrap - php

Really struggling with this regarding sub-menus. I've made a custom theme for Wordpress using Bootstrap. I successfully managed to get to make my main nav menu dynamic with drop down sub menu links using wp_bootstrap_navwalker.
I've also made a nav-pills menu to display as a dynamic sub menu just below the main site nav menu and the page header. It shows all the child pages, of that particular parent.
My issue however, is that when you go on to a page with this menu, the active item on the menu does not display as active.
Here is my HTML/PHP:
<div class="nav-grey-band">
<?php
$args = array(
'menu' => 'primary',
'theme_location' => 'primary',
'submenu' => 'The Team',
'container_class' => 'centered-pills',
'menu_class' => 'nav nav-pills'
);
wp_nav_menu( $args );
?>
</div>
Here is what's in my functions.php:
// Register Custom Navigation Walker
require_once('wp_bootstrap_navwalker.php');
add_filter( 'wp_nav_menu_objects', 'submenu_limit', 10, 2 );
function submenu_limit( $items, $args ) {
if ( empty( $args->submenu ) ) {
return $items;
}
$ids = wp_filter_object_list( $items, array( 'title' => $args->submenu ), 'and', 'ID' );
$parent_id = array_pop( $ids );
$children = submenu_get_children_ids( $parent_id, $items );
foreach ( $items as $key => $item ) {
if ( ! in_array( $item->ID, $children ) ) {
unset( $items[$key] );
}
}
return $items;
}
function submenu_get_children_ids( $id, $items ) {
$ids = wp_filter_object_list( $items, array( 'menu_item_parent' => $id ), 'and', 'ID' );
foreach ( $ids as $id ) {
$ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) );
}
return $ids;
}

Related

Modal on wp menu link

I'm trying to learn some new stuff but I stuck to something easy.
I managed to manipulate a link from wp menu using this code
add_filter( 'nav_menu_link_attributes', 'menu_item_data_toggle', 10, 2 );
function menu_item_data_toggle( $atts, $item) {
// Manipulate attributes
if ( 74 == $item -> ID )
$atts['data-toggle'] = 'modal';
return $atts;
}
but I need to use this modal with "if" attribute for login user and I can't figure how to.
The code for this modal I want to use is from a button
<?php
if( is_user_logged_in() ){
$account_manage = ''.classifieds_get_option( 'my_profile_looks' ).'';
$submit_ad = add_query_arg( array( $classifieds_slugs['subpage'] => 'submit_ad' ), classifieds_get_permalink_by_tpl('page-tpl_my_profile') );
$modal = '';
}
else{
$account_manage = ''.classifieds_get_option( 'login_looks' ).'';
$submit_ad = '#register';
$modal = 'data-toggle="modal"';
}
$locations = get_nav_menu_locations();
if ( isset( $locations[ 'top-navigation' ] ) ) {
wp_nav_menu( array(
'theme_location' => 'top-navigation',
'menu_class' => 'nav navbar-nav clearfix',
'container' => false,
'echo' => true,
'items_wrap' => '<ul class="%2$s">%3$s',
'depth' => 10,
'walker' => new classifieds_walker,
) );
}
if(get_option('users_can_register')){
echo '<li>'.$account_manage.'</li><li class="submit-add">'.esc_html__( 'SUBMIT AD', 'classifieds' ).'</li></ul>';
}
?>
Can you please me give me a hint to figure it out and use that menu link with this modal attributes?
Thank you!

Function and Local variable doesn't work inside another function

Something is really strange or am I doing something wrong, I can't figure it out. When I add the variable $submenu in the wp_nav_menu args it doesn't work. See the examples below.
Error Message
Strict Standards: Only variables should be passed by reference in
This Works
$args = array(
'menu_id' => 'sidebar-menu',
'theme_location' => 'primary',
'submenu' => 'About Us'
);
wp_nav_menu( $args );
This doesn't work
$args = array(
'menu_id' => 'sidebar-menu',
'theme_location' => 'primary',
'submenu' => get_top_level_title()
);
wp_nav_menu( $args );
This function gets the top most parent title nothing fancy.
function get_top_level_title(){
global $post;
$category = get_the_category( $post->ID );
$parent_title = get_the_title( navz_top_most_parent_page_id() );
if( is_single() ){
$category = get_the_category( $post->ID );
$post->post_parent = $category[0]->term_id;
return get_cat_name($category[0]->category_parent);
} else if( $parent_title and !is_category() ){
return $parent_title;
} else {
$cat_obj = get_category( get_query_var( 'cat' ) );
$parent = $cat_obj->parent;
return get_cat_name($parent);
}
}
This code gets the function above into a local variable and passess it to the wp_nav_menu to get the submenu.
$submenu = get_top_level_title();
$args = array(
'menu_id' => 'sidebar-menu',
'theme_location' => 'primary',
'submenu' => $submenu
);
wp_nav_menu( $args );

How can I list the siblings of the current page/post based on a menu structure in wordpress

I have been strubbling with this menu problem for a while now and can't seem to get the answer I am looking for. I would like to display all the "sibling" menu items only on the sidebar. So if I have the following menu structure;
- 1
-- 1.1
-- 1.2
-- 1.3
-- 1.4
-- 1.5
- 2
-- 2.1 .......
-- 2.5
- 3
if the user is on the page/post 1.3, I would like to list
1.1
1.2
1.3
1.4
1.5
..only. Currently, I am able to list the siblings with a function I have, but only if I hard-code the title of the page 1 which is the ancestor of 1.3. I would like to get the name of the ancestor of 1.3 dynamically and not have to hard-code it. How can I ;
dynamically get the immediate ancestor of the page I am in?
2.If question 1 is not possible, how can i get the siblings Only?
Below is the code I have;
This code goes to the functions.php in wordpress;
<?php
add_filter( 'wp_nav_menu_objects', 'submenu_limit', 10, 2 );
function submenu_limit( $items, $args ) {
if ( empty($args->submenu) )
return $items;
$arguments = wp_filter_object_list( $items, array( 'title' => $args->submenu ), 'and', 'ID' );
$parent_id = array_pop( $arguments );
$children = submenu_get_children_ids( $parent_id, $items );
foreach ( $items as $key => $item ) {
if ( ! in_array( $item->ID, $children ) )
unset($items[$key]);
}
return $items;
}
function submenu_get_children_ids( $id, $items ) {
$ids = wp_filter_object_list( $items, array( 'menu_item_parent' => $id ), 'and', 'ID' );
foreach ( $ids as $id ) {
$ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) );
}
return $ids;
}
?>
Then below is the function I am using to get the submenuitems. As you can see, I have hard-coded the parent/ancestor ('Business & Commercial') of my current post as is in the menu named "Topest Menu";
<?php
//code that goes to the sidebar.php
$args = array(
'menu' => 'Topest menu',
'submenu' => 'Business & Commercial',
);
wp_nav_menu( $args );
?>

Blog menu link is set to current page when on Tag or Archive page

I have a menu defined that appears in my header. It contains a link to the Blog listing page.
When I navigate to the Blog Archive or Tag Archive, this menu item is set to the current page.
Why is it doing this?
Is there a way to stop it?
I know I can add conditional CSS to stop the item being highlighted by my CSS, but I'd like to know the reason why the current page class is added and if it can be changed.
Menu Defined in Functions.php
function register_my_menu() {
register_nav_menu('header-menu',__( 'Header Menu' ));
}
add_action( 'init', 'register_my_menu' );
Menu displayed in template:
$menu = wp_nav_menu(array(
'container' => '',
'echo' => false,
'theme_location' => 'header-menu',
'items_wrap' => '<ul id="%1$s" class="%2$s list-inline">%3$s</ul>',
));
$menu = str_replace("\n", "", $menu);
$menu = str_replace("\r", "", $menu);
echo $menu;
Try the below code and replace my-cat-tax, my-post-type with your blog`s taxonomy and post type
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 );

wp_nav_menu exclude pages from menu

I am trying to exclude pages from wp_nav_menu
Here is the function to exclude pages from menu
Works well when
<?php $page = get_page_by_title('my title' );
wp_nav_menu( array( 'theme_location' => 'menu-2', 'exclude' => $page->ID ) ); ?>
Works properly
BUt when using
<?php $page = get_page_by_title('my title' );
$pag1 = get_page_by_title('my title 1' );
$pag2 = get_page_by_title('my title2' );
wp_nav_menu( array( 'theme_location' => 'menu-2', 'exclude' => $page->ID,$pag1->ID,$pag2->ID ) ); ?>
Doesn't work properly.
try this
wp_nav_menu( array( 'theme_location' => 'menu-2', 'exclude' => '".$page->ID.",".$pag1->ID.",".$pag2->ID."' ) );
checkout this tutorial
Here is the correct solution
I hope it helps some other people
<?php
$page = get_page_by_title('my title' );
$pag1 = get_page_by_title('my title 1' );
$pag2 = get_page_by_title('my title2' );
$ids = "{$page->ID},{$pag1->ID},{$pag2->ID}";
wp_nav_menu( array( 'theme_location' => 'menu-2', 'exclude' => $ids ) );
?>
Managed it using the exclude method, but exclude by page id:
wp_nav_menu(
array(
'theme_location' => 'menu-2',
'exclude' => '599, 601'
)
);
(599 & 601 are page id's)
which is written here:
http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/wordpress-tip-how-to-exclude-pages-from-wp_nav_menu-function/
and finding the page id manually is written here:
http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-find-tag-page-post-link-category-id-in-wordpress/
It should work if you put the pages that you want to exclude into an array.
Check out this: http://ehsanis.me/2010/11/30/wordpress-wp_nav_menu-to-exclude-pages/
You can use a Custom Walker Function to just skip the rendering of the menu item.
wp_nav_menu( array(
'theme_location' => 'menu-2',
'walker' => new custom_navigation
) );
class custom_navigation extends Walker_Nav_Menu {
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
parent::start_el($item_html, $item, $depth, $args);
$exclude = array();
$exclude[] = get_page_by_title( 'my title' );
$exclude[] = get_page_by_title( 'my title 1' );
$exclude[] = get_page_by_title( 'my title2' );
if ( ! in_array( $item->object_id, $exclude ) ) {
// add your menu item html to the $output variable
}
}
}

Categories