Changeset 3573

Show
Ignore:
Timestamp:
02/28/06 03:57:08 (3 years ago)
Author:
ryan
Message:

wp_dropdown_pages() and walk_page_tree()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-includes/functions.php

    r3570 r3573  
    744744        return $_page; 
    745745    } 
     746} 
     747 
     748function walk_page_tree($pages, $to_depth, $start_element_callback, $end_element_callback = '', $start_level_callback = '', $end_level_callback = '') { 
     749    $args = array_slice(func_get_args(), 6); 
     750    $parents = array(); 
     751    $depth = 0; 
     752    $previous_page = ''; 
     753    $output = ''; 
     754 
     755    $last_page->post_parent = 0; 
     756    $last_page->post_id = 0; 
     757    $pages[] = $last_page; 
     758 
     759    foreach ( $pages as $page ) { 
     760        if ( !empty($previous_page) && ($page->post_parent == $previous_page->ID) ) { 
     761            // Previous page is my parent. Descend a level. 
     762            array_unshift($parents, $page); 
     763            $depth++; 
     764            if ( !$to_depth || ($depth < $to_depth) ) 
     765                if ( !empty($start_level_callback) ) { 
     766                    $cb_args = array_merge( array($output, $depth), $args); 
     767                    $output = call_user_func_array($start_level_callback, $cb_args); 
     768                } 
     769        } else if ( $depth && ($page->post_parent == $parents[0]->ID) ) { 
     770            // On the same level as previous page. 
     771            if ( !$to_depth || ($depth < $to_depth) ) { 
     772                if ( !empty($end_element_callback) ) { 
     773                    $cb_args = array_merge( array($output, $previous_page, $depth), $args); 
     774                    $output = call_user_func_array($end_element_callback, $cb_args); 
     775                } 
     776            } 
     777        } else if ( $depth ) { 
     778            // Ascend one or more levels. 
     779            if ( !$to_depth || ($depth < $to_depth) ) { 
     780                if ( !empty($end_element_callback) ) { 
     781                    $cb_args = array_merge( array($output, $previous_page, $depth), $args); 
     782                    $output = call_user_func_array($end_element_callback, $cb_args); 
     783                } 
     784            } 
     785 
     786            while ( $parent = array_shift($parents)) { 
     787                $depth--; 
     788                if ( !$to_depth || ($depth < $to_depth) ) { 
     789                    if ( !empty($end_level_callback) ) { 
     790                        $cb_args = array_merge( array($output, $depth), $args); 
     791                        $output = call_user_func_array($end_level_callback, $cb_args); 
     792                    } 
     793                    if ( !empty($end_element_callback) ) { 
     794                        $cb_args = array_merge( array($output, $parent, $depth), $args); 
     795                        $output = call_user_func_array($end_element_callback, $cb_args); 
     796                    } 
     797                } 
     798                if ( $page->post_parent == $parent->ID ) { 
     799                    break; 
     800                } 
     801            } 
     802        } else if ( !empty($previous_page) ) { 
     803            // Close off previous page. 
     804            if ( !$to_depth || ($depth < $to_depth) ) { 
     805                if ( !empty($end_element_callback) ) { 
     806                    $cb_args = array_merge( array($output, $previous_page, $depth), $args); 
     807                    $output = call_user_func_array($end_element_callback, $cb_args); 
     808                } 
     809            } 
     810        } 
     811 
     812        // Start the page. 
     813        if ( !$to_depth || ($depth < $to_depth) ) { 
     814            if ( !empty($start_element_callback) && ($page->ID != 0) ) { 
     815                $cb_args = array_merge( array($output, $page, $depth), $args); 
     816                $output = call_user_func_array($start_element_callback, $cb_args); 
     817            } 
     818        } 
     819 
     820        $previous_page = $page; 
     821    } 
     822 
     823    return $output; 
    746824} 
    747825 
  • trunk/wp-includes/template-functions-post.php

    r3558 r3573  
    296296function &get_pages($args = '') { 
    297297    global $wpdb; 
    298  
    299298    parse_str($args, $r); 
    300299 
     
    305304    if ( !isset($r['sort_order']) ) 
    306305        $r['sort_order'] = 'ASC'; 
     306    if ( !isset($r['hierarchical']) ) 
     307        $r['hierarchical'] = 1; 
    307308 
    308309    $exclusions = ''; 
     
    328329    update_page_cache($pages); 
    329330 
    330     if ( $r['child_of']
     331    if ( $r['child_of'] || $r['hierarchical']
    331332        $pages = & get_page_children($r['child_of'], $pages); 
    332333 
     
    334335} 
    335336 
     337function wp_dropdown_pages($args = '') { 
     338    parse_str($args, $r); 
     339    if ( !isset($r['depth']) ) 
     340        $r['depth'] = 0; 
     341    if ( !isset($r['child_of']) ) 
     342        $r['child_of'] = 0; 
     343    if ( !isset($r['echo']) ) 
     344        $r['echo'] = 1; 
     345    if ( !isset($r['selected']) ) 
     346        $r['selected'] = 0; 
     347 
     348    extract($r); 
     349 
     350    $pages = get_pages($args); 
     351    $output = ''; 
     352 
     353    if ( ! empty($pages) ) { 
     354        $output = "<select name='page_id'>\n"; 
     355        $output .= walk_page_tree($pages, $depth, '_page_dropdown_element', '', '', '', $selected); 
     356        $output .= "</select>\n"; 
     357    } 
     358 
     359    $output = apply_filters('wp_dropdown_pages', $output); 
     360 
     361    if ( $echo ) 
     362        echo $output; 
     363 
     364    return $output; 
     365} 
     366 
     367function _page_dropdown_element($output, $page, $depth, $selected) { 
     368    $pad = str_repeat('&nbsp;', $depth * 3); 
     369 
     370    $output .= "\t<option value=\"$page->ID\""; 
     371    if ( $page->ID == $selected ) 
     372        $output .= ' selected="selected"'; 
     373    $output .= '>'; 
     374    $title = wp_specialchars($page->post_title); 
     375    $output .= "$pad$title"; 
     376    $output .= "</option>\n"; 
     377 
     378    return $output; 
     379} 
    336380 
    337381function wp_list_pages($args = '') { 
     
    341385    if ( !isset($r['show_date']) ) 
    342386        $r['show_date'] = ''; 
     387    if ( !isset($r['date_format']) ) 
     388        $r['date_format'] = get_settings('date_format'); 
    343389    if ( !isset($r['child_of']) ) 
    344390        $r['child_of'] = 0; 
     
    351397 
    352398    // Query pages. 
    353     $pages = & get_pages($args); 
    354     if ( $pages ) { 
    355  
     399    $pages = get_pages($args); 
     400 
     401    if ( !empty($pages) ) { 
    356402        if ( $r['title_li'] ) 
    357403            $output .= '<li class="pagenav">' . $r['title_li'] . '<ul>'; 
    358404 
    359         // Now loop over all pages that were selected 
    360         $page_tree = Array(); 
    361         foreach ( $pages as $page ) { 
    362             // set the title for the current page 
    363             $page_tree[$page->ID]['title'] = $page->post_title; 
    364             $page_tree[$page->ID]['name'] = $page->post_name; 
    365  
    366             // set the selected date for the current page 
    367             // depending on the query arguments this is either 
    368             // the createtion date or the modification date 
    369             // as a unix timestamp. It will also always be in the 
    370             // ts field. 
    371             if ( !empty($r['show_date']) ) { 
    372                 if ( 'modified' == $r['show_date'] ) 
    373                     $page_tree[$page->ID]['ts'] = $page->post_modified; 
    374                 else 
    375                     $page_tree[$page->ID]['ts'] = $page->post_date; 
    376             } 
    377  
    378             // The tricky bit!! 
    379             // Using the parent ID of the current page as the 
    380             // array index we set the curent page as a child of that page. 
    381             // We can now start looping over the $page_tree array 
    382             // with any ID which will output the page links from that ID downwards. 
    383             if ( $page->post_parent != $page->ID) 
    384                 $page_tree[$page->post_parent]['children'][] = $page->ID; 
    385         } 
    386         // Output of the pages starting with child_of as the root ID. 
    387         // child_of defaults to 0 if not supplied in the query. 
    388         $output .= _page_level_out($r['child_of'],$page_tree, $r, 0, false); 
     405        global $wp_query; 
     406        $current_page = $wp_query->get_queried_object_id(); 
     407        $output .= walk_page_tree($pages, $depth, '_page_list_element_start', '_page_list_element_end', '_page_list_level_start', '_page_list_level_end', $current_page, $r['show_date'], $r['date_format']); 
     408 
    389409        if ( $r['title_li'] ) 
    390410            $output .= '</ul></li>'; 
     
    399419} 
    400420 
    401  
    402 function _page_level_out($parent, $page_tree, $args, $depth = 0, $echo = true) { 
    403     global $wp_query; 
    404     $queried_obj = $wp_query->get_queried_object(); 
    405     $output = ''; 
    406  
     421function _page_list_level_start($output, $depth) { 
     422    $indent = str_repeat("\t", $depth); 
     423    $output .= "$indent<ul>\n"; 
     424    return $output; 
     425
     426 
     427function _page_list_level_end($output, $depth) { 
     428    $indent = str_repeat("\t", $depth); 
     429    $output .= "$indent</ul>\n"; 
     430    return $output; 
     431
     432 
     433function _page_list_element_start($output, $page, $depth, $current_page, $show_date, $date_format) { 
    407434    if ( $depth ) 
    408435        $indent = str_repeat("\t", $depth); 
    409         //$indent = join('', array_fill(0,$depth,"\t")); 
    410  
    411     if ( !is_array($page_tree[$parent]['children']) ) 
    412         return false; 
    413  
    414     foreach ( $page_tree[$parent]['children'] as $page_id ) { 
    415         $cur_page = $page_tree[$page_id]; 
    416         $title = $cur_page['title']; 
    417  
    418         $css_class = 'page_item'; 
    419         if ( $page_id == $queried_obj->ID ) 
    420             $css_class .= ' current_page_item'; 
    421  
    422         $output .= $indent . '<li class="' . $css_class . '"><a href="' . get_page_link($page_id) . '" title="' . wp_specialchars($title) . '">' . $title . '</a>'; 
    423  
    424         if ( isset($cur_page['ts']) ) { 
    425             $format = get_settings('date_format'); 
    426             if ( isset($args['date_format']) ) 
    427                 $format = $args['date_format']; 
    428             $output .= " " . mysql2date($format, $cur_page['ts']); 
    429         } 
    430  
    431         if ( isset($cur_page['children']) && is_array($cur_page['children']) ) { 
    432             $new_depth = $depth + 1; 
    433  
    434             if ( !$args['depth'] || $depth < ($args['depth']-1) ) { 
    435                 $output .= "$indent<ul>\n"; 
    436                 $output .= _page_level_out($page_id, $page_tree, $args, $new_depth, false); 
    437                 $output .= "$indent</ul>\n"; 
    438             } 
    439         } 
    440         $output .= "$indent</li>\n"; 
    441     } 
    442     if ( $echo ) 
    443         echo $output; 
    444     else 
    445         return $output; 
     436 
     437    $css_class = 'page_item'; 
     438    if ( $page->ID == $current_page ) 
     439        $css_class .= ' current_page_item'; 
     440 
     441    $output .= $indent . '<li class="' . $css_class . '"><a href="' . get_page_link($page->ID) . '" title="' . wp_specialchars($page->post_title) . '">' . $page->post_title . '</a>'; 
     442 
     443    if ( !empty($show_date) ) { 
     444        if ( 'modified' == $show_date ) 
     445            $time = $page->post_modified; 
     446        else 
     447            $time = $page->post_date; 
     448 
     449        $output .= " " . mysql2date($date_format, $time); 
     450    } 
     451 
     452    return $output; 
     453
     454 
     455function _page_list_element_end($output, $page, $depth) { 
     456    $output .= "</li>\n"; 
     457 
     458    return $output; 
    446459} 
    447460