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ć?


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();

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' );

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.


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;

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.