Come recuperare tutti i titoli dei post di uno specifico tipo di contenuto?

21 set 2016, 13:07:34
Visualizzazioni: 26.8K
Voti: 11

Vorrei utilizzare i titoli all'interno di un elemento select in un form che sto mostrando lato client. Qual è il modo migliore per farlo?

2
Commenti

La domanda non è molto chiara. Stai cercando di restituire tutti i titoli dei post per tutti i post sotto un tipo di post specifico? È corretto?

Ahmed Fouad Ahmed Fouad
21 set 2016 13:11:41

Scusa! Sì esatto, ho creato un custom post type, ho creato alcuni post di questo tipo e voglio visualizzare un form con un elemento select che permetta all'utente di selezionare uno dei titoli (che rappresentano progetti) a cui donare.

Peter Turner Peter Turner
21 set 2016 13:12:57
Tutte le risposte alla domanda 4
7
17

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

// query per il tuo post type
$post_type_query  = new WP_Query(  
    array (  
        'post_type'      => 'your-post-type',  
        'posts_per_page' => -1  
    )  
);   
// abbiamo bisogno dell'array dei post
$posts_array      = $post_type_query->posts;   
// crea una lista con le informazioni necessarie
// la chiave equivale all'ID, il valore è il post_title
$post_title_array = wp_list_pluck( $posts_array, 'post_title', 'ID' );
21 set 2016 13:43:38
Commenti

+1 per wp_list_pluck(). Continuo a dimenticarmi di questa funzione...

FaCE FaCE
21 set 2016 13:58:33

+1 per avermi fatto scoprire il pluck! Come ho fatto a non vederlo prima??

Chizzle Chizzle
8 set 2017 04:36:09

+1 per la one-liner... Le one-liner sono sempre fantastiche!

Muhammad Osama Muhammad Osama
18 set 2021 18:23:45

Attenzione, questo sovraccaricherà facilmente i siti con molti articoli. Eseguire WP_Query con 'posts_per_page' => -1 senza filtri sufficientemente restrittivi è un modo semplice per far crashare un sito o esaurire le risorse del server.

Bence Szalai Bence Szalai
22 ago 2022 12:55:55

Non hai torto @sbnc.eu ma la domanda era come ottenere tutti i titoli.

Nicolai Grossherr Nicolai Grossherr
26 ago 2022 15:10:58

Esatto, e quello che sto dicendo è che questo metodo è valido solo per siti piccoli. Se ci sono molti articoli, una query personalizzata è obbligatoria. La differenza in termini di prestazioni e consumo di memoria può essere troppo grande per essere ignorata.

Bence Szalai Bence Szalai
26 ago 2022 19:44:41

@sbnc.eu Grazie – sentiti libero di pubblicare una soluzione per questo.

Nicolai Grossherr Nicolai Grossherr
7 set 2022 09:53:14
Mostra i restanti 2 commenti
4
11

Query per ottenere tutti i titoli dei post di un tipo specifico

// Funzione che restituisce i titoli dei post di un tipo specifico come elemento select di un form
// restituisce null se non trova risultati

function output_projects_list() {
    global $wpdb;

    $custom_post_type = 'page'; // definisci qui lo slug del tuo custom post type

    // Query SQL per restituire tutti i titoli dei post
    $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 );

    // Restituisce null se non trova risultati
    if ( ! $results )
        return;

    // HTML per il nostro select che stampa i titoli dei post in un loop
    $output = '<select name="project" id="project">';

    foreach( $results as $index => $post ) {
        $output .= '<option value="' . $post['ID'] . '">' . $post['post_title'] . '</option>';
    }

    $output .= '</select>'; // fine dell'elemento select

    // restituisce l'html
    return $output;
}

// Poi nel tuo progetto basta chiamare la funzione
// nel punto in cui vuoi che appaia il form select
echo output_projects_list();
21 set 2016 13:21:45
Commenti

Questa è una funzione eccessivamente complessa per qualcosa che può essere facilmente fatto utilizzando l'API che WordPress fornisce nella classe WP_Query. La risposta fornita da @ialocin è molto migliore. Non dovresti aver bisogno di $wpdb per questo.

somebodysomewhere somebodysomewhere
22 set 2016 22:07:38

Sì e qual è lo scopo del commento? :)

Ahmed Fouad Ahmed Fouad
22 set 2016 23:19:07

@Brian Cosa c'è di molto migliore nell'altra risposta? Tecnicamente questa è più veloce in quanto stai recuperando solo i dati di cui hai bisogno da mysql. L'altra risposta (più semplice) recupera tutti i dati in memoria e poi li modifica successivamente in PHP. Questo significa più lavoro per PHP. Entrambe sono accettabili ma ognuna ha i suoi punti di forza. Se conosci mysql allora questa non è affatto eccessivamente complessa. È piuttosto semplice.

JoeMoe1984 JoeMoe1984
5 gen 2018 22:21:10

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

mawalker mawalker
15 mar 2018 11:31:02
0

Per un tipo di post gerarchico, abbiamo la funzione integrata:

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 del 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 di wp_dropdown_pages(), ma è un wrapper per get_pages() e supporta anche i suoi argomenti di input.

21 set 2016 14:02:53
1

Il modo in cui ho sempre gestito operazioni di questo tipo è utilizzando get_posts e foreach come nell'esempio seguente:

// Creiamo gli argomenti per ottenere i nostri post
$args = [
  'post_type'=>'custom-slug'
];

// Otteniamo un array di oggetti post
$posts = get_posts($args);

// Iniziamo la nostra stringa
$str = '<select>';
// Poi creiamo un'opzione per ogni post
foreach($posts as $key=>$post){
  $str .= '<option>'.$post->post_title.'</option>';
}
$str .= '</select>';
echo $str;
29 set 2016 05:45:04
Commenti

Sta funzionando bene, grazie. Sto cercando di aggiungere 'selected' all'opzione attualmente salvata, ho provato molti frammenti di codice diversi e alla fine sono arrivato a questo, che mi permette di aggiornare l'opzione ma 'selected' non viene aggiunto a quello corretto. Qualche suggerimento su cosa sto sbagliando?

$str .= '<option '. ($post == $value2 ? 'selected=selected' : '') .'>'. $post->post_title .'</option>';

Grazie mille per qualsiasi suggerimento

p.s. Scusa se non riesco ad aggiungere correttamente il codice, ho provato con i backtick

Jo_pinkish Jo_pinkish
26 ago 2017 15:44:10