Lista wyboru (select) wpisów własnego typu (custom post type)

WordPress daje bardzo fajne narzędzie pozwalające na szybkie i sprawne tworzenie panelu zarządzania szablonem po stronie admina z możliwością wyboru istniejących stron w formularzach. Jeżeli potrzebna jest możliwość wyboru istniejącej strony w formularzu, możemy skorzystać z funkcji wp_dropdown_page(). Aby wyświetlić taką listę w formularz wystarczy następująca forma: <?php $args = array( 'depth' => 0, 'child_of' => 0, 'selected' => 0, 'echo' => 1, 'name' => 'page_id', 'id' => null, // string 'show_option_none' => null, // string 'show_option_no_change' => null, // string 'option_none_value' => null, // string ); wp_dropdown_pages( $args ); ?> Najważniejsze argumenty funkcji mają następujące znaczenie: child_of – określa rodzica dla listowanych stron, selected – wybrana opcja dla rozwijanej listy, echo – wyświetlanie lista (w przeciwnym razie można ją zapisać do zmiennej), name – nazwa zmiennej / pola formularza. Dla standardowych stron utworzonych na WordPressie jest to doskonałe rozwiązanie. Problem pojawia się jednak wówczas, gdy chcemy wyświetlić listę wyboru wpisów własnego typu, czyli custom_post_type. Aby stworzyć sobie wygodne rozwiązanie tego problemu, można skorzystać z poniższej funkcji: <?php function custom_post_select($select_id, $post_type, $selected = 0) { $post_type_object = get_post_type_object($post_type); $label = $post_type_object->label; $posts = get_posts(array('post_type'=> $post_type, 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1)); echo '<select name="'. $select_id .'" id="'.$select_id.'">'; echo '<option value = "" >'.$label.' </option>'; foreach ($posts as $post) { echo '<option value="', $post->ID, '"', $selected == $post->ID ? ' selected="selected"' : '', '>', $post->post_title, '</option>'; } echo '</select>'; } ?> Dzięki temu, jeżeli tylko chcemy umieścić w formularzu rozwijaną listę wyboru własnego typu wpisów (custom post type), wystarczy wywołać funkcję na przykład: <?php custom_post_select('product_id','product');...