Opened 2 years ago

Last modified 7 months ago

#17590 new defect (bug)

wp_list_pages() not setting "current_page_item" classes on custom post types

Reported by: tobiasn Owned by:
Priority: normal Milestone: Future Release
Component: Themes Version: 3.1
Severity: normal Keywords: has-patch
Cc: ben@…, daveleeone

Description (last modified by SergeyBiryukov)

wp_list_pages() don't set the correct css for a hierarchical custom post type.

To reproduce this bug do this:
<?php wp_list_pages("title_li=&post_type=custom_post_type_name"); ?>

and compare the html output to normal pages:
<?php wp_list_pages(); ?>

The problem seems to be this row in wp_list_pages():

if ( is_page() || is_attachment() || $wp_query->is_posts_page )

In the following patch i've changed it to

if ( is_page() || is_attachment() || $wp_query->is_posts_page || ($wp_query->query_vars['post_type'] != 'post' && is_single()) )

(If this is not the intended behavoir please let me know. )

Attachments (3)

post-template.diff (640 bytes) - added by tobiasn 2 years ago.
wp_list_pages() css patch for custom post types
17590.patch (612 bytes) - added by SergeyBiryukov 10 months ago.
17590.2.patch (913 bytes) - added by SergeyBiryukov 7 months ago.

Download all attachments as: .zip

Change History (17)

tobiasn2 years ago

wp_list_pages() css patch for custom post types

comment:1 follow-up: ↓ 3   husobj22 months ago

  • Cc ben@… added

As a temporary measure you can hook into to add selected classes like this:

function my_page_css_class( $css_class, $page ) {
	global $post;
	if ( $post->ID == $page->ID ) {
		$css_class[] = 'current_page_item';
	}
	return $css_class;
}
add_filter( 'page_css_class', 'my_page_css_class', 10, 2 );
  • Description modified (diff)

Corrected markup.

comment:3 in reply to: ↑ 1   tobiasn22 months ago

Nice quickfix, however i would prefer pinpointing custom post types.

Replying to husobj:

As a temporary measure you can hook into to add selected classes like this:

function my_page_css_class( $css_class, $page ) {
	global $post;
	if ( $post->ID == $page->ID ) {
		$css_class[] = 'current_page_item';
	}
	return $css_class;
}
add_filter( 'page_css_class', 'my_page_css_class', 10, 2 );

Thanks for the fix with the hook guys.
However I really wonder why it is still not fixed after 9 months.

  • Cc daveleeone added
  • Type changed from defect (bug) to feature request

Thanks for the very useful hook, but how can I highlight the parent page? At the moment I use Jquery for this.

Any Ideas?

Thanks, Davelee

  • Type changed from feature request to defect (bug)

Hi dave! I haven't noticed the parent page-thing, guess that's a bug in the Walker class. How do I recreate it?

comment:8 follow-up: ↓ 9   daveleeone14 months ago

Hi Tobias, thanks for reply.
I have not seen, unfortunately, you've written back to me.

here is my code in the template:

function file:

function my_page_css_class( $css_class, $page ) {
	global $post;
	if ( $post->ID == $page->ID ) {
		$css_class[] = 'current_page_item';
	}
	return $css_class;
}
add_filter( 'page_css_class', 'my_page_css_class', 10, 2 );

template file:

<?php
// create a ID of parent page to use the wp_list_page as submenu
			if ($post->post_parent)	{
				$ancestors=get_post_ancestors($post->ID);
				$root=count($ancestors)-1;
				$parent = $ancestors[$root];
			} else {
				$parent = $post->ID;
			}

?>	

<ul class="submenu">
<?php 
// create a Submenu for CPT's 

	$args = array(
	'post_type'	=>	'event',
	'child_of'	=>	$parent,
	'title_li'	=>	__('')
);
wp_list_pages( $args ); 
?> 
</ul>

jquery file

 $(document).ready(function(){
	$('.submenu li:has(li.current_page_item)').addClass('parent_page_item');	

});

I hope it helps.
if you make it I'll pay you a beer :)

Version 0, edited 14 months ago by daveleeone (next)

comment:9 in reply to: ↑ 8   tobiasn14 months ago

Hi Dave! This has nothing to do with the trac bug. Could you please remove the comment here and repost it in the support forum? I'll answer you there.

Hi,

I was wondering if this had been looked at ?

it seems like this would be quite useful now that CPT are used so often by the wp community

thanks

Closed #21525 as a duplicate.

  • Milestone changed from Awaiting Review to 3.5

17590.2.patch does a hierarchical check, as suggested during the bug scrub.

is_attachment() was added in [10947] (for #9472), so I've kept it.

  • Milestone changed from 3.5 to Future Release

get('post_type') could be an array.

Note: See TracTickets for help on using tickets.