Jak pobrać wszystkie tytuły postów określonego typu postów?

9

Chciałbym używać tytułów w elemencie select w formie, którą odbijam po stronie klienta. Jaki byłby najlepszy sposób to zrobić?

Peter Turner
źródło
Pytanie nie jest bardzo jasne. Czy próbujesz zwrócić wszystkie tytuły postów dla wszystkich postów określonego typu? Czy to prawda?
Ahmed Fouad,
Przepraszam! Tak, właśnie stworzyłem niestandardowy typ postu, utworzyłem kilka tego typu postów i chcę powtórzyć formularz z elementem select, który pozwala użytkownikowi wybrać jeden z tytułów (Reprezentują projekty), na które można przekazać darowiznę.
Peter Turner,

Odpowiedzi:

11

Zapytaj o wszystkie tytuły postów określonego typu

// Function that returns post titles from specific post type as form select element
// returns null if found no results.

function output_projects_list() {
    global $wpdb;

    $custom_post_type = 'page'; // define your custom post type slug here

    // A sql query to return all post titles
    $results = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = %s and post_status = 'publish'", $custom_post_type ), ARRAY_A );

    // Return null if we found no results
    if ( ! $results )
        return;

    // HTML for our select printing post titles as loop
    $output = '<select name="project" id="project">';

    foreach( $results as $index => $post ) {
        $output .= '<option value="' . $post['ID'] . '">' . $post['post_title'] . '</option>';
    }

    $output .= '</select>'; // end of select element

    // get the html
    return $output;
}

// Then in your project just call the function
// Where you want the select form to appear
echo output_projects_list();
Ahmed Fouad
źródło
3
Jest to zbyt złożona funkcja, którą można łatwo wykonać za pomocą interfejsu API zapewnianego przez WordPress w klasie WP_Query. Odpowiedź udzielona przez @ialocin jest znacznie lepsza. Nie potrzebujesz do tego $ wpdb.
somebodysomewhere
Tak i jaki jest sens komentarza? :)
Ahmed Fouad
1
@Brian Co jest na far bettertemat innej odpowiedzi? Jest to technicznie szybsze, ponieważ pobierasz tylko potrzebne dane z mysql. Druga odpowiedź (łatwiejsza odpowiedź) pobiera wszystkie dane do pamięci, a następnie modyfikuje je w PHP. To więcej działa dla PHP. Oba są dopuszczalne, ale każdy ma swoje zalety. Jeśli znasz mysql, to wcale nie jest to zbyt skomplikowane. To całkiem proste.
JoeMoe1984
Zgadzam się z @ JoeMoe1984, Ta funkcja nie jest tak prosta jak druga odpowiedź ... ALE jest O wiele wydajniejsza z punktu widzenia pamięci. SQL jest o wiele lepszym miejscem (niż wp_list_pluck (...)) do zmniejszania / wydobywania cennych informacji. Tak, jest nieco bardziej skomplikowany, ale twój system będzie ci za to podziękować ...
mawalker
13

Mógłbyś - i moim zdaniem powinien - użyć funkcji API, aby uzyskać dane.

// query for your post type
$post_type_query  = new WP_Query(  
    array (  
        'post_type'      => 'your-post-type',  
        'posts_per_page' => -1  
    )  
);   
// we need the array of posts
$posts_array      = $post_type_query->posts;   
// create a list with needed information
// the key equals the ID, the value is the post_title
$post_title_array = wp_list_pluck( $posts_array, 'post_title', 'ID' );
Nicolai
źródło
2
+1 dla wp_list_pluck(). Zawsze o tym zapominam ...
FaCE
+1 za zapoznanie mnie z przynętą! Jak mogłem tego wcześniej nie zobaczyć?
Chizzle,
5

W przypadku hierarchicznego typu postu mamy wbudowane:

wp_dropdown_pages( 
    [ 
        'post_type' => 'page',
        'echo'      => 1, 
        'name'      => 'wpse_titles', 
        'id'        => 'wpse-titles' 
    ] 
);

który wygeneruje element select z tytułami postów i ID posta jako wartością opcji.

Przykład:

<select name='wpse_titles' id='wpse-titles'>
    <option class="level-0" value="1">AAA</option>
    <option class="level-0" value="2">BBB</option>
    <option class="level-1" value="3">&nbsp;&nbsp;&nbsp;CCC</option>
</select>

Nie jest jasne z dokumentacją dla wp_dropdown_pages(), ale to wrapper dla get_pages()a także wspierać je w argumenty wejściowe.

birgire
źródło
0

Sposób, w jaki zawsze to robiłem, to używanie get_postsi foreachlubię coś poniżej:

// Create our arguments for getting our post
$args = [
  'post_type'=>'custom-slug'
];

// we get an array of posts objects
$posts = get_posts($args);

// start our string
$str = '<select>';
// then we create an option for each post
foreach($posts as $key=>$post){
  $str .= '<option>'.$post->post_title.'</option>';
}
$str .= '</select>';
echo $str;
Tim Roberts
źródło
To działa dobrze, dziękuję. Próbuję dodać „wybrane” do aktualnie zapisanej opcji, wypróbowałem wiele różnych bitów kodu i wreszcie doszedłem do tego, co pozwala mi zaktualizować opcję, ale „wybrane” nie jest dodawane do poprawnego. Jakieś wskazówki na temat tego, co robię źle? `$ str. = '<opcja'. ($ post == $ wartość2? 'wybrana = wybrana': ''). '>'. $ post-> post_title. '</option>'; `Bardzo dziękuję za wszelkie sugestie ps Niestety nie wydaje mi się, aby poprawnie dodawać kod, próbowałem backticks
Jo_pinkish