Come recuperare tutti i titoli dei post di un tipo di post specifico?


9

Vorrei usare i titoli all'interno di un elemento selezionato in una forma che sto facendo eco al lato client. Quale sarebbe il modo migliore per farlo?


La domanda non è molto chiara. Stai cercando di restituire tutti i titoli dei post per tutti i post con un tipo di post specifico? È giusto?
Ahmed Fouad,

Scusate! Sì, esattamente, ho creato un tipo di post personalizzato, creato alcuni post di questo tipo e desidero fare eco a un modulo con un elemento select che consente a un utente di selezionare uno dei titoli (rappresentano progetti) a cui donare.
Peter Turner,

Risposte:


11

Interroga tutti i titoli dei post di un tipo di post specifico

// 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
Questa è una funzione eccessivamente complessa per qualcosa che può essere fatto facilmente usando l'API fornita da WordPress nella classe WP_Query. La risposta fornita da @ialocin è di gran lunga migliore. Non dovresti aver bisogno di $ wpdb per questo.
Somebodysomewhere

Sì e qual è il punto del commento? :)
Ahmed Fouad,

1
@Brian Cos'è far betterl'altra risposta? Questo è tecnicamente più veloce in quanto stai acquisendo solo i dati di cui hai bisogno da mysql. L'altra risposta (risposta più semplice) prende tutti i dati in memoria e li modifica successivamente in PHP. Questo è più lavoro per PHP. Entrambi sono accettabili ma ognuno ha i suoi punti di forza. Se conosci mysql, questo non è affatto troppo complesso. È piuttosto semplice.
JoeMoe1984,

Sono d'accordo con @ JoeMoe1984, questa funzione non è così semplice come l'altra risposta ... MA è MOLTO più efficiente dal punto di vista della memoria. SQL è un posto FAR migliore (rispetto a wp_list_pluck (...)) per ridurre / estrarre le informazioni preziose da. Sì, è leggermente più complesso, ma il tuo sistema ti ringrazierà per questo ...
mawalker

13

Potresti - e secondo me, dovresti - utilizzare le funzioni API per ottenere i dati.

// 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 per wp_list_pluck(). Mi dimentico sempre di quello ...
FaCE,

+1 per avermi fatto conoscere il pluck! Come non l'avevo mai visto prima ??
Chizzle

5

Per un tipo di post gerarchico , abbiamo incorporato:

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

che genererà un elemento select con i titoli dei post e l' ID post come valore dell'opzione.

Esempio:

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

Non è chiaro dalla documentazione per wp_dropdown_pages(), ma è un wrapper per get_pages()e supporta anche i suoi argomenti di input.


0

Il modo in cui ho sempre fatto cose come questa è usare get_postse foreachcome qualcosa di seguito:

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

Funziona bene, grazie. Sto tentando di aggiungere "selezionato" all'opzione attualmente salvata, ho provato molti bit di codice diversi e finalmente sono arrivato a questo, il che mi sta permettendo di aggiornare l'opzione ma "selezionato" non viene aggiunto a quello corretto. Qualche suggerimento su cosa sto facendo di sbagliato? `$ str. = '<opzione'. ($ post == $ value2? 'selezionato = selezionato': ''). '>'. $ post-> post_title. '</option>'; `` Mille grazie per eventuali suggerimenti ps Mi dispiace non sembra aggiungere correttamente il codice,
ho
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.