Cum să preluăm toate titlurile pentru un anumit tip de postare?
Aș dori să folosesc titlurile într-un element select într-un formular pe care îl afișez în partea client. Care ar fi cea mai bună modalitate de a face acest lucru?

Ați putea - și în opinia mea, ar trebui - să folosiți funcțiile API pentru a obține datele.
// interogare pentru tipul tău de postare
$post_type_query = new WP_Query(
array (
'post_type' => 'your-post-type',
'posts_per_page' => -1
)
);
// avem nevoie de array-ul cu postări
$posts_array = $post_type_query->posts;
// creăm o listă cu informațiile necesare
// cheia este egală cu ID-ul, valoarea este post_title
$post_title_array = wp_list_pluck( $posts_array, 'post_title', 'ID' );

+1 pentru că mi-ai prezentat funcția pluck! Cum de n-am văzut-o până acum??

+1 pentru one-liner.... One-linerele sunt întotdeauna grozave!

Atenție, acest lucru poate supraîncărca ușor site-urile cu multe articole. Executarea WP_Query cu 'posts_per_page' => -1
fără filtre suficient de restrictive este o modalitate ușoară de a bloca un site sau de a epuiza resursele serverului.

Nu greșești @sbnc.eu, dar întrebarea era cum să obții toate titlurile.

Corect, și ceea ce spun eu este că această metodă este viabilă doar pentru site-uri mici. Dacă există multe articole, o interogare personalizată este obligatorie. Diferența de performanță și consum de memorie poate fi prea mare pentru a fi ignorată.

Interoghează toate titlurile postărilor dintr-un anumit tip de postare
// Funcție care returnează titlurile postărilor dintr-un anumit tip de postare ca element select de formular
// returnează null dacă nu găsește rezultate.
function output_projects_list() {
global $wpdb;
$custom_post_type = 'page'; // definește aici slug-ul tipului tău de postare personalizat
// O interogare SQL pentru a returna toate titlurile postărilor
$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 );
// Returnează null dacă nu s-au găsit rezultate
if ( ! $results )
return;
// HTML pentru selectul nostru care afișează titlurile postărilor în buclă
$output = '<select name="project" id="project">';
foreach( $results as $index => $post ) {
$output .= '<option value="' . $post['ID'] . '">' . $post['post_title'] . '</option>';
}
$output .= '</select>'; // sfârșitul elementului select
// returnează HTML-ul
return $output;
}
// Apoi în proiectul tău apelează funcția
// Unde vrei să apară formularul select
echo output_projects_list();

Aceasta este o funcție excesiv de complexă pentru ceva care poate fi realizat cu ușurință folosind API-ul pe care WordPress îl oferă prin clasa WP_Query. Răspunsul oferit de @ialocin este mult mai bun. Nu ar trebui să ai nevoie de $wpdb pentru asta.

@Brian Ce anume este mult mai bun
la celălalt răspuns? Din punct de vedere tehnic, această soluție este mai rapidă deoarece extragi doar datele de care ai nevoie direct din mysql. Celălalt răspuns (varianta mai ușoară) încarcă toate datele în memorie și apoi le modifică ulterior în PHP. Asta înseamnă mai multă muncă pentru PHP. Ambele sunt acceptabile, dar fiecare are punctele sale forte. Dacă cunoști mysql, atunci această soluție nu este deloc excesiv de complexă. Este destul de simplă.

Sunt de acord cu @JoeMoe1984, această funcție nu este la fel de simplă ca celelalte răspunsuri... DAR este MULT mai eficientă din punct de vedere al utilizării memoriei. SQL este un loc MULT mai bun (decât wp_list_pluck(...)) pentru a reduce/extrage informațiile valoroase. Da, este puțin mai complexă, dar sistemul tău îți va mulțumi pentru asta...

Pentru un tip de post ierarhic, avem funcția încorporată:
wp_dropdown_pages(
[
'post_type' => 'page',
'echo' => 1,
'name' => 'wpse_titles',
'id' => 'wpse-titles'
]
);
care va genera un element select cu titlurile posturilor și ID-ul postului ca valoare a opțiunii.
Exemplu:
<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"> CCC</option>
</select>
Nu este clar din documentația pentru wp_dropdown_pages()
, dar aceasta este un wrapper pentru get_pages()
și, de asemenea, acceptă argumentele de intrare ale acesteia.

Modul în care am făcut întotdeauna astfel de lucruri este prin utilizarea funcțiilor get_posts
și foreach
, similar cu exemplul de mai jos:
// Creăm argumentele pentru obținerea postărilor
$args = [
'post_type'=>'custom-slug'
];
// obținem un array de obiecte post
$posts = get_posts($args);
// începem construcția string-ului
$str = '<select>';
// apoi creăm o opțiune pentru fiecare post
foreach($posts as $key=>$post){
$str .= '<option>'.$post->post_title.'</option>';
}
$str .= '</select>';
echo $str;

Aceasta funcționează bine, mulțumesc. Încerc să adaug 'selected' la opțiunea salvată în prezent, am încercat o mulțime de fragmente de cod diferite și am ajuns în final la aceasta, care îmi permite să actualizez opțiunea, dar 'selected' nu este adăugat la cea corectă. Aveți sugestii despre ce fac greșit?
$str .= '<option '. ($post == $value2 ? 'selected=selected' : '') .'>'. $post->post_title .'</option>';
Mulțumesc mult pentru orice sugestii
p.s. Îmi pare rău că nu par să adaug codul corect, am încercat backticks
