Bagaimana cara mengambil semua judul tulisan dari jenis tulisan tertentu?

9

Saya ingin menggunakan judul dalam elemen pilih dalam bentuk yang saya gema ke sisi klien. apa jalan terbaik melakukan ini?

Peter Turner
sumber
Pertanyaannya tidak begitu jelas. Apakah Anda mencoba mengembalikan semua judul posting untuk semua posting di bawah jenis posting tertentu? Apakah itu benar?
Ahmed Fouad
Maaf! Ya persis, saya telah membuat jenis posting khusus, membuat beberapa posting dari jenis ini, dan saya ingin menggemakan formulir dengan elemen pilih yang memungkinkan pengguna untuk memilih salah satu judul (Mereka mewakili proyek) untuk disumbangkan.
Peter Turner

Jawaban:

11

Permintaan semua judul posting dari jenis posting tertentu

// 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
sumber
3
Ini adalah fungsi yang terlalu rumit untuk sesuatu yang dapat dengan mudah dilakukan menggunakan API yang disediakan WordPress di kelas WP_Query. Jawaban yang diberikan oleh @ialocin jauh lebih baik. Anda tidak perlu $ wpdb untuk ini.
somebodysomewhere
Ya dan apa gunanya komentar? :)
Ahmed Fouad
1
@ Brian Apa far betterjawaban yang lain? Ini secara teknis lebih cepat karena Anda hanya mengambil data yang Anda butuhkan dari mysql. Jawaban lainnya (jawaban yang lebih mudah) mengambil semua data ke dalam memori kemudian memodifikasinya setelah itu di PHP. Itu lebih banyak pekerjaan untuk PHP. Keduanya dapat diterima tetapi masing-masing memiliki kekuatan. Jika Anda tahu mysql maka ini tidak terlalu rumit sama sekali. Cukup sederhana.
JoeMoe1984
Saya setuju dengan @ JoeMoe1984, fungsi ini tidak sesederhana jawaban yang lain ... TETAPI BANYAK lebih efisien dari perspektif memori. SQL adalah tempat yang jauh lebih baik (daripada wp_list_pluck (...)) untuk mengurangi / mengekstrak informasi berharga dari. Ya, ini sedikit lebih kompleks, tetapi sistem Anda akan berterima kasih untuk itu ...
mawalker
13

Anda dapat - dan menurut saya, harus - menggunakan fungsi API untuk mendapatkan data.

// 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
sumber
2
+1 untuk wp_list_pluck(). Saya selalu lupa tentang yang itu ...
FaCE
+1 untuk memperkenalkan saya kepada pemetik! Bagaimana saya tidak melihat ini sebelumnya ??
Chizzle
5

Untuk jenis posting hierarkis , kami memiliki bawaan:

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

yang akan menghasilkan elemen pilih dengan judul posting dan ID posting sebagai nilai opsi.

Contoh:

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

Tidak jelas dari dokumentasi untuk wp_dropdown_pages(), tetapi ini adalah pembungkus untuk get_pages()dan juga mendukung argumen inputnya.

birgire
sumber
0

Cara saya selalu melakukan hal-hal seperti ini adalah menggunakan get_postsdan foreachmenyukai sesuatu di bawah ini:

// 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
sumber
Ini bekerja dengan baik, terima kasih. Saya mencoba untuk menambahkan 'terpilih' ke opsi yang saat ini disimpan, saya telah mencoba banyak bit kode yang berbeda dan akhirnya sampai pada ini, yang memungkinkan saya untuk memperbarui opsi tetapi 'terpilih' tidak ditambahkan ke yang benar. Adakah petunjuk tentang apa yang saya lakukan salah? `$ str. = '<option'. ($ post == $ value2? 'selected = selected': ''). '>'. $ post-> post_title. '</option>'; `Terima kasih banyak atas saran ps Maaf saya sepertinya tidak menambahkan kode dengan benar, mencoba backticks
Jo_pinkish