Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roytanck/3972598 to your computer and use it in GitHub Desktop.
Save roytanck/3972598 to your computer and use it in GitHub Desktop.
This walker for WordPress gives you the ability to only show the items that are selected
<?php
/**
* Create HTML list of pages.
*
* @package WordPress
* @since 2.1.0
* @uses Walker
*/
class Walker_Page_Parent_Only extends Walker {
private $show_lvl = true;
/**
* @see Walker::$tree_type
* @since 2.1.0
* @var string
*/
var $tree_type = 'page';
/**
* @see Walker::$db_fields
* @since 2.1.0
* @todo Decouple this.
* @var array
*/
var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID');
/**
* @see Walker::start_lvl()
* @since 2.1.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param int $depth Depth of page. Used for padding.
* @param array $args
*/
function start_lvl( &$output, $depth = 0, $args = array() ) {
if( ! $this->show_lvl )
return;
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class='children'>\n";
}
/**
* @see Walker::end_lvl()
* @since 2.1.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param int $depth Depth of page. Used for padding.
* @param array $args
*/
function end_lvl( &$output, $depth = 0, $args = array() ) {
if( ! $this->show_lvl )
return;
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
/**
* @see Walker::start_el()
* @since 2.1.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $page Page data object.
* @param int $depth Depth of page. Used for padding.
* @param int $current_page Page ID.
* @param array $args
*/
function start_el( &$output, $page, $depth, $args, $current_page = 0 ) {
if ( $depth )
$indent = str_repeat("\t", $depth);
else
$indent = '';
extract($args, EXTR_SKIP);
if( isset( $filter_selected ) && $filter_selected ) {
if( $depth == 0 ) {
$this->show_lvl = true;
}
if( ! $this->show_lvl )
return;
}
$css_class = array('page_item', 'page-item-'.$page->ID);
if ( !empty($current_page) ) {
$_current_page = get_post( $current_page );
if ( in_array( $page->ID, $_current_page->ancestors ) )
$css_class[] = 'current_page_ancestor';
if ( $page->ID == $current_page )
$css_class[] = 'current_page_item';
elseif ( $_current_page && $page->ID == $_current_page->post_parent )
$css_class[] = 'current_page_parent';
else if ( ! in_array( $page->ID, $_current_page->ancestors ) )
$do_filter_selected = true;
} elseif ( $page->ID == get_option('page_for_posts') ) {
$css_class[] = 'current_page_parent';
}
else {
$do_filter_selected = true;
}
if ( isset( $filter_selected, $do_filter_selected ) && $filter_selected ) {
if( $depth == 0 )
$this->show_lvl = false;
}
$css_class = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );
$output .= $indent . '<li class="' . $css_class . '"><a href="' . get_permalink($page->ID) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';
if ( !empty($show_date) ) {
if ( 'modified' == $show_date )
$time = $page->post_modified;
else
$time = $page->post_date;
$output .= " " . mysql2date($date_format, $time);
}
}
/**
* @see Walker::end_el()
* @since 2.1.0
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $page Page data object. Not used.
* @param int $depth Depth of page. Not Used.
* @param array $args
*/
function end_el( &$output, $page, $depth = 0, $args = array() ) {
if( ! $this->show_lvl )
return;
$output .= "</li>\n";
}
}
@roytanck
Copy link
Author

Forked this for future reference. Thanks again Marko! :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment