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
}
}
}
Related
I have created a template on wordpress where I want to output the child posts of certain parent posts. It will output 5 child posts to the corresponding parent post.
Parent post
Child Post
Child Post
Child Post
The code for this, looks like this:
function vd_list_child_pages( $atts = array() ) {
$atts = shortcode_atts( array(
'id' => 0,
'slug' => '',
), $atts );
$post_id = absint( $atts['id'] );
$post = get_post( $post_id ); // WP_Post on success.
$childpages = '';
if ( $post && is_post_type_hierarchical( 'page' ) ) {
$childpages = wp_list_pages( array(
'child_of' => $post->ID,
'title_li' => '',
'echo' => 0,
'depth' => 1,
'link_before' => '<i class="far fa-file-alt"></i>',
'walker' => '',
) );
}
if ( $childpages ) {
$childpages = '<ul class="child-posts-content">' . $childpages . '</ul>';
}
return $childpages;
}
add_shortcode( 'vd_childpages', 'vd_list_child_pages' );
However, I need the code in the template more often, with different "post_parent" ID's. Do I have to use the code everywhere like this, or can I create a "function", or which option is correct here?
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!
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 );
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;
}
How do I get rid of the 'Home' link from appearing at the top of my links when using <?php wp_nav_menu( array('menu' => 'news', 'show_home' => false)); ?>
I tried 'show_home' => false and 'show_home=0' but neither worked.
This should be in your functions.php
function page_menu_args( $args ) {
$args['show_home'] = FALSE;
return $args;
}
add_filter( 'wp_page_menu_args', 'page_menu_args' );
EDIT: Dont forget to add this to wherever your menu is supposed to print out:
wp_nav_menu( array('echo'=>true));
The following worked for me:
_nav_menu( array( 'container_id' => 'topmenu', 'depth' => 0, 'menu_class' => 'sf-menu', 'theme_location' => 'topmenu' ) );
And I add
function page_menu_args( $args ) {
$args['show_home'] = FALSE;
return $args;
}
add_filter( 'wp_page_menu_args', 'page_menu_args' );
In the functions.php file.
If you are like me looking to remove the 'home' link from the default wordpress menu (wp_page_menu) and the home is a page (not blogposts), this is one way to solve it:
in functions.php:
function getPageBySlugname($slugname) {
$args = array(
'post_type' => 'page',
'hierarchical' => 0,
'post_status' => 'publish'
);
$pages = get_pages($args);
foreach ($pages as $page) {
if ($page->post_name == $slugname) {
return $page->ID;
}
}
}
in header.php
wp_page_menu(array(
'container' => 'div',
'show_home' => false, // Not sure what this is hiding, maybe if you have blogposts as home??
'echo' => true,
'exclude' => getPageBySlugname('homepage-slugname'), // change this to your slugname
));
You're making it way too hard! Instead, use CSS display: none for that particular .home item of a custom menu. It works like a charm. Example:
menu-blogroll .home {display:none !important;}
I used jquery to fix the same.
$("div.menu > ul li:first-child").css("display","none");