Comment récupérer tous les titres de publication d'un type de publication spécifique?

9

Je voudrais utiliser les titres dans un élément de sélection sous une forme que je fais écho au côté client. Quelle serait la meilleure façon de faire cela?

Peter Turner
la source
La question n'est pas très claire. Essayez-vous de renvoyer tous les titres de publication pour toutes les publications sous un type de publication spécifique? Est-ce correct?
Ahmed Fouad
Désolé! Oui exactement, j'ai créé un type de message personnalisé, créé quelques messages de ce type et je veux faire écho à un formulaire avec un élément select qui permet à un utilisateur de sélectionner l'un des titres (ils représentent des projets) à qui faire un don.
Peter Turner

Réponses:

11

Recherchez tous les titres de publication d'un type de publication spécifique

// 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
la source
3
Il s'agit d'une fonction trop complexe pour quelque chose qui peut facilement être effectué à l'aide de l'API fournie par WordPress dans la classe WP_Query. La réponse fournie par @ialocin est bien meilleure. Vous ne devriez pas avoir besoin de $ wpdb pour cela.
somebodysomewhere
Oui et à quoi sert le commentaire? :)
Ahmed Fouad
1
@Brian Qu'en est- far betteril de l'autre réponse? C'est techniquement plus rapide car vous ne récupérez que les données dont vous avez besoin à partir de mysql. L'autre réponse (réponse plus simple) saisit toutes les données en mémoire puis les modifie ensuite en PHP. C'est plus de travail pour PHP. Les deux sont acceptables mais ont chacune leurs points forts. Si vous connaissez mysql, ce n'est pas du tout trop complexe. C'est assez simple.
JoeMoe1984
Je suis d'accord avec @ JoeMoe1984, cette fonction n'est pas aussi simple que l'autre réponse ... MAIS elle est BEAUCOUP plus efficace du point de vue de la mémoire. SQL est un bien meilleur endroit (que wp_list_pluck (...)) pour réduire / extraire les informations précieuses. Oui, c'est un peu plus complexe, mais votre système vous en remerciera ...
mawalker
13

Vous pourriez - et dans mon esprit, devriez - utiliser les fonctions API pour obtenir les données.

// 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
la source
2
+1 pour wp_list_pluck(). J'oublie toujours celui-là ...
FaCE
+1 pour m'avoir initié à la cueillette! Comment n'avais-je pas vu ça avant ??
Chizzle
5

Pour un type de publication hiérarchique , nous avons intégré:

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

qui générera un élément select avec les titres des articles et l' ID de l'article comme valeur d'option.

Exemple:

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

Ce n'est pas clair dans la documentation de wp_dropdown_pages(), mais c'est un wrapper pour get_pages()et supporte également ses arguments d'entrée.

Birgire
la source
0

La façon dont j'ai toujours fait des choses comme ça utilise get_postset foreachaime quelque chose ci-dessous:

// 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
la source
Cela fonctionne bien, merci. J'essaie d'ajouter «sélectionné» à l'option actuellement enregistrée, j'ai essayé beaucoup de bits de code différents et finalement j'y suis arrivé, ce qui me permet de mettre à jour l'option mais le «sélectionné» n'est pas ajouté à la bonne. Des conseils sur ce que je fais mal? `$ str. = '<option'. ($ post == $ value2? 'selected = selected': ''). '>'. $ post-> post_title. '</option>'; `Merci beaucoup pour toutes les suggestions ps Désolé, je ne semble pas ajouter correctement le code, essayez les backticks
Jo_pinkish