Dropdown list of a custom post type

I have a custom post type, Doctors, that I need to create a dropdown nav for. I just want it to populate a select list with all the posts of that CPT and navigate to that post on selection.

I’m doing a couple other dropdowns with wp_dropdown_categories, but I guess there’s no built in function for listing a post type?

Related posts

Leave a Reply

3 comments

  1. You’ll need to use get_posts and roll your own drop down.

    Something like this (somewhere in functions.php):

    <?php
    function wpse34320_type_dropdown( $post_type )
    {
        $posts = get_posts(
            array(
                'post_type'  => $post_type,
                'numberposts' => -1
            )
        );
        if( ! $posts ) return;
    
        $out = '<select id="wpse34320_select"><option>Select a Doctor</option>';
        foreach( $posts as $p )
        {
            $out .= '<option value="' . get_permalink( $p ) . '">' . esc_html( $p->post_title ) . '</option>';
        }
        $out .= '</select>';
        return $out;
    }
    

    Then in your template…

    <?php echo wpse34320_type_dropdown( 'doctors' ); ?>
    
  2. This function behaves more like wp_dropdown_categories

    function

    public function wpse34320_get_dropdown_posts( $args = array( 'post_type' => 'post', 'show_option_none'  => 'Select a post', 'name' => null, 'selected' => '', 'echo' => true ) ){
    
        $posts = get_posts(
            array(
                'post_type'  => $args['post_type'],
                'numberposts' => -1
            )
        );
    
        $dropdown = '';
    
        if( $posts ){
    
            if( !is_string($args['name']) ){
    
                $args['name'] = $args['post_type'].'_select';
            }
    
            $dropdown .= '<select id="'.$args['name'].'" name="'.$args['name'].'">';
    
                $dropdown .= '<option value="-1">'.$args['show_option_none'].'</option>';
    
                $args['selected'] = intval($args['selected']);
    
                foreach( $posts as $p ){
    
                    $selected = '';
                    if( $p->ID == $args['selected'] ){
    
                        $selected = ' selected';
                    }
    
                    $dropdown .= '<option value="' . $p->ID . '"'.$selected.'>' . esc_html( $p->post_title ) . '</option>';
                }
    
            $dropdown .= '</select>';           
        }
    
        if($args['name'] === false){
    
            return $dropdown;
        }
        else{
    
            echo $dropdown;
        }
    }
    

    use

       $args=array(
    
                'show_option_none'  => 'Select a custom post type',
                'post_type'         => $post_type,
                'name'              => $name,
                'selected'          => $selected_id,
                'echo'              => true
       );
    
        wpse34320_get_dropdown_posts($args);    
    
  3. I’ve added a javascript line to ‘Jump’ directly to the selection.

    Before:

    $out = '<select id="wpse34320_select"><option>Select a Doctor</option>';
    

    After:

    $out = '<form name="jump1"><select name="jump2" id="wpse34320_select" OnChange="location.href=jump1.jump2.options[selectedIndex].value">><option>Select a doctor</option>';