Skip to content

Instantly share code, notes, and snippets.

@jenheilemann
Last active September 18, 2017 15:37
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save jenheilemann/3853924 to your computer and use it in GitHub Desktop.
Controlled through the Widget menus. It adds sub-page navigation automatically
<?php
/*
Sub-Page Navigation Widget
Controlled through the Widget menus.
It adds sub-page navigation automatically.
It has no options.
*/
class SubPage_Navigation_Widget extends WP_Widget {
// Constructor
function SubPage_Navigation_Widget() {
$sw_opts = array(
'classname' => 'subpage_navigation_widget',
'description' => 'Sub-navigation for pages that have child pages'
);
$control_opts = array( 'id_base' => 'subpage_navigation_widget' );
$this->WP_Widget('subpage_navigation_widget', 'Page Sub-Navigation', $sw_opts, $control_opts );
}
// Outputting our Widget
function widget($args, $instance) {
extract( $args );
// Set up our initial variables.
global $post;
$nav = '';
// If we're not on a page that has a post (empty serch page?), let's just stop.
if ( empty($post) )
return;
if ( is_category() || is_tag() || is_archive() || is_search() || is_home() || is_single() )
{
$title = 'Categories:';
// Create a list of categories
$args = array(
'title_li' => '',
'echo' => 0
);
$nav = wp_list_categories( $args );
} else {
// Where are we?
$parent_id = $this->get_parent_id($post);
$title = get_the_title($parent_id);
$link = get_permalink($parent_id);
$title = "<a href='$link' title='$title'>$title:</a>";
if ( !empty($parent_id) ) {
$args = array(
'title_li' => '',
'child_of' => $parent_id,
'echo' => 0,
'sort_column' => 'menu_order'
);
$nav = wp_list_pages($args);
}
}
// Let's hide this if there aren't any sub-pages or sibling pages... it tends to break.
if ( !empty($nav) ) {
// Before widget //
echo $before_widget;
// Output widget //
if ( !empty($title) ) { echo $before_title . $title . $after_title; }
echo "\n\t\t\t<ul id=\"sidebar-subnav\">\n";
echo $nav;
echo "\n\t\t\t</ul>";
// After widget //
echo $after_widget;
}
}
// Update settings
function update($new_instance, $old_instance) {
$instance = $new_instance;
return $instance;
}
// Widget Control Panel //
function form( $instance ) {
$defaults = array( );
$instance = wp_parse_args( (array) $instance, $defaults );
// Build the widget form
?>
<p>No options for this widget. It will automatically build a navigation list based on the sub-pages of the top-level page.</p>
<?php
}
// Helper to find the base ancestor of a page that's not the home page //
function get_parent_id($post) {
if ( $post->post_parent ) {
$ancestors = get_post_ancestors($post->ID);
$root = count($ancestors)-1;
$parent = get_post($ancestors[$root]);
} else {
$parent = $post;
}
return $parent->ID;
} // end get_parent_id
}
add_action('widgets_init', create_function('', 'return register_widget("SubPage_Navigation_Widget");'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment