Wie kann ich alle Post-Titel eines bestimmten Post-Typs abrufen?


9

Ich möchte die Titel innerhalb eines ausgewählten Elements in einer Form verwenden, die ich auf der Client-Seite wiedergebe. Was wäre der beste Weg, dies zu tun?


Die Frage ist nicht sehr klar. Versuchen Sie, alle Beitragstitel für alle Beiträge unter einem bestimmten Beitragstyp zurückzugeben? Ist das richtig?
Ahmed Fouad

Es tut uns leid! Ja genau, ich habe einen benutzerdefinierten Beitragstyp erstellt, einige Beiträge dieses Typs erstellt und möchte ein Formular mit einem Auswahlelement wiederholen, mit dem ein Benutzer einen der Titel auswählen kann (sie stellen Projekte dar), für die er spenden möchte.
Peter Turner

Antworten:


11

Fragen Sie alle Beitragstitel eines bestimmten Beitragstyps ab

// 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
Dies ist eine übermäßig komplexe Funktion für etwas, das einfach mit der API ausgeführt werden kann, die WordPress in der WP_Query-Klasse bereitstellt. Die Antwort von @ialocin ist weitaus besser. Sie sollten dafür kein $ wpdb benötigen.
Jemand

Ja und worum geht es in dem Kommentar? :)
Ahmed Fouad

1
@ Brian Was ist far bettermit der anderen Antwort? Dies ist technisch schneller, da Sie nur die Daten abrufen, die Sie von MySQL benötigen. Die andere Antwort (einfachere Antwort) erfasst alle Daten im Speicher und ändert sie anschließend in PHP. Das ist mehr Arbeit für PHP. Beide sind akzeptabel, aber jeder hat seine Stärken. Wenn Sie MySQL kennen, ist dies überhaupt nicht übermäßig komplex. Es ist ziemlich einfach.
JoeMoe1984

Ich stimme @ JoeMoe1984 zu. Diese Funktion ist nicht so einfach wie die andere Antwort ... ABER sie ist aus Speichersicht VIEL effizienter. SQL ist ein weitaus besserer Ort (als wp_list_pluck (...)), um die wertvollen Informationen zu reduzieren / zu extrahieren. Ja, es ist etwas komplexer, aber Ihr System wird es Ihnen danken ...
Mawalker

13

Sie könnten - und sollten es meiner Meinung nach - API-Funktionen verwenden, um die Daten abzurufen.

// 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 für wp_list_pluck(). Ich vergesse das immer ...
FaCE

+1 für die Einführung in den Zupf! Wie hatte ich das noch nie gesehen?
Chizzle

5

Für einen hierarchischen Beitragstyp haben wir Folgendes integriert:

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

Dadurch wird ein Auswahlelement mit Beitragstiteln und der Beitrags-ID als Optionswert generiert .

Beispiel:

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

Es ist nicht klar aus der Dokumentation für wp_dropdown_pages(), aber es ist ein Wrapper für get_pages()und unterstützt auch seine Eingabeargumente.


0

Die Art und Weise, wie ich solche Dinge immer gemacht habe, ist, etwas wie das Folgende zu verwenden get_postsund zu foreachmögen:

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

Das funktioniert gut, danke. Ich versuche, der aktuell gespeicherten Option 'ausgewählt' hinzuzufügen. Ich habe viele verschiedene Codebits ausprobiert und bin schließlich dazu gekommen, wodurch ich die Option aktualisieren kann, aber die 'ausgewählte' nicht hinzugefügt wird zum richtigen. Irgendwelche Hinweise darauf, was ich falsch mache? `$ str. = '<Option'. ($ post == $ value2? 'selected = selected': ''). '>'. $ post-> post_title. '</ option>'; `Vielen Dank für alle Vorschläge ps Entschuldigung, ich scheine den Code nicht richtig hinzuzufügen, versuchte Backticks
Jo_pinkish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.