Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

How do i get the list of categories as wp_list_categories does but using get_categories and then displaying the links in a foreach loop. The reason is i want the links to point to the current page with [?search-type=normal&s=cat_name; ] instead on pointing to the category url.

This will then filter the results when clicked on the same page.

<?php 

            $categories = get_categories(array('hide_empty' => 0, depth => 0, 'hierarchical' => false));

            echo '<ul>';

            foreach($categories as $category) {

                echo '<li><a href="?search-type=normal&s='.$category->term_id.'">'.$category->name.'</a></li>';


                    $sub_categories = get_categories(array('hide_empty' => 0, 'parent' => $category->term_id, 'hierarchical' => true));

                    if(!$sub_categories) {


                    } else {

                         foreach ($sub_categories as $sub_category) {

                             echo '<ul>';
                             echo '<li><a href="?search-type=normal&s='.$sub_category->term_id.'">'.$sub_category->name.'</a></li>';
                             echo '</ul>';
                         }
                    }

            }

            echo '</ul>';
        ?>
share|improve this question

1 Answer 1

up vote 0 down vote accepted

get_categories() is handy function to get list of categories with all information such as id & name of each category etc.

This code might work. The $category->term_id will return the unique id for each category and $category->name will return the name to display to user.

<?php 
$args=array(
  'orderby' => 'name',
  'order' => 'ASC'
  );
$categories=get_categories($args);
foreach($categories as $category) {
echo '<a href="?search-type=normal&s='.$category->term_id.'">'.$category->name.'</a>';
}
?>

Update -

Here is code which uses custom Wordpress walker class to edit the links. Put this into your themes functions.php

 //usage  wp_list_categories( array('walker' => new wpse_59862_walker() ) ) 

class wpse_59862_walker extends Walker_Category {

    // copied function from /inlcude/category-template.php and edited as per requirements
    function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        extract($args);

        $cat_name = esc_attr( $category->name );
        $cat_name = apply_filters( 'list_cats', $cat_name, $category );
        $my_blog_link = site_url('/'); //this is to return blog url

        //here I edited the link to meet your requirments.
        $link = '<a href="'.$my_blog_link.'?search-type=normal&s='.$category->term_id.'" ';

        if ( $use_desc_for_title == 0 || empty($category->description) )
            $link .= 'title="' . esc_attr( sprintf(__( 'View all posts filed under %s' ), $cat_name) ) . '"';
        else
            $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';
        $link .= '>';
        $link .= $cat_name . '</a>';

        if ( !empty($feed_image) || !empty($feed) ) {
            $link .= ' ';

            if ( empty($feed_image) )
                $link .= '(';

            $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $feed_type ) ) . '"';

            if ( empty($feed) ) {
                $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
            } else {
                $title = ' title="' . $feed . '"';
                $alt = ' alt="' . $feed . '"';
                $name = $feed;
                $link .= $title;
            }

            $link .= '>';

            if ( empty($feed_image) )
                $link .= $name;
            else
                $link .= "<img src='$feed_image'$alt$title" . ' />';

            $link .= '</a>';

            if ( empty($feed_image) )
                $link .= ')';
        }

        if ( !empty($show_count) )
            $link .= ' (' . intval($category->count) . ')';

        if ( 'list' == $args['style'] ) {
            $output .= "\t<li";
            $class = 'cat-item cat-item-' . $category->term_id;
            if ( !empty($current_category) ) {
                $_current_category = get_term( $current_category, $category->taxonomy );
                if ( $category->term_id == $current_category )
                    $class .=  ' current-cat';
                elseif ( $category->term_id == $_current_category->parent )
                    $class .=  ' current-cat-parent';
            }
            $output .=  ' class="' . $class . '"';
            $output .= ">$link\n";
        } else {
            $output .= "\t$link<br />\n";
        }
    }

}
share|improve this answer
    
Thanks for your answer @amit, however, would like to be able to display the parent and child relationship aswell. I can display all categories fine as <li> but i want to add <li>Parent<ul><li>Child</li></ul></li> –  Loxzibit Jul 27 '12 at 13:31
    
is the code you are updated in question is working or not ? –  amit Jul 28 '12 at 19:38
    
hey, I'd use wp_list_categories() instead using get_categories() to list categories and use a action hook to replace the url. that'd be lot easier. –  amit Jul 28 '12 at 19:57
    
Ok, thnaks @amit for your assistance, if you could show me how i would write the action hook to replace the url, i would so much appreciate it. I'm still new to Wordpress and 'm still getting my head around filters,hooks, add_action and so forth. –  Loxzibit Jul 30 '12 at 9:41
    
updated answer with new code which uses wordpress walker class to edit the links –  amit Jul 30 '12 at 17:01

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.