Cum să preluăm toate titlurile pentru un anumit tip de postare?

21 sept. 2016, 13:07:34
Vizualizări: 26.8K
Voturi: 11

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?

2
Comentarii

Întrebarea nu este foarte clară. Încerci să returnezi toate titlurile postărilor pentru toate postările dintr-un anumit tip de postare? Este corect?

Ahmed Fouad Ahmed Fouad
21 sept. 2016 13:11:41

Scuze! Da, exact, am creat un tip de postare personalizat, am creat câteva postări de acest tip și vreau să afișez un formular cu un element select care permite utilizatorului să aleagă unul dintre titluri (acestea reprezintă proiecte) pentru a dona.

Peter Turner Peter Turner
21 sept. 2016 13:12:57
Toate răspunsurile la întrebare 4
7
17

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' );
21 sept. 2016 13:43:38
Comentarii

+1 pentru wp_list_pluck(). Uit mereu de această funcție...

FaCE FaCE
21 sept. 2016 13:58:33

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

Chizzle Chizzle
8 sept. 2017 04:36:09

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

Muhammad Osama Muhammad Osama
18 sept. 2021 18:23:45

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.

Bence Szalai Bence Szalai
22 aug. 2022 12:55:55

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

Nicolai Grossherr Nicolai Grossherr
26 aug. 2022 15:10:58

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

Bence Szalai Bence Szalai
26 aug. 2022 19:44:41

@sbnc.eu Mulțumesc – nu ezita să postezi o soluție pentru aceasta.

Nicolai Grossherr Nicolai Grossherr
7 sept. 2022 09:53:14
Arată celelalte 2 comentarii
4
11

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();
21 sept. 2016 13:21:45
Comentarii

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.

somebodysomewhere somebodysomewhere
22 sept. 2016 22:07:38

Da și care este rostul comentariului? :)

Ahmed Fouad Ahmed Fouad
22 sept. 2016 23:19:07

@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ă.

JoeMoe1984 JoeMoe1984
5 ian. 2018 22:21:10

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

mawalker mawalker
15 mar. 2018 11:31:02
0

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">&nbsp;&nbsp;&nbsp;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.

21 sept. 2016 14:02:53
1

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;
29 sept. 2016 05:45:04
Comentarii

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

Jo_pinkish Jo_pinkish
26 aug. 2017 15:44:10