¿Cómo recuperar todos los títulos de publicaciones de un tipo de publicación específico?

9

Me gustaría usar los títulos dentro de un elemento select en una forma que estoy haciendo eco en el lado del cliente. Cuál sería la mejor forma de hacer esto?

Peter Turner
fuente
La pregunta no es muy clara. ¿Estás tratando de devolver todos los títulos de publicaciones para todas las publicaciones bajo un tipo de publicación específico? ¿Está bien?
Ahmed Fouad
¡Lo siento! Sí, exactamente, hice un tipo de publicación personalizado, creé algunas publicaciones de este tipo, y quiero hacer eco de un formulario con un elemento de selección que permita al usuario seleccionar uno de los títulos (que representan proyectos) para donar.
Peter Turner

Respuestas:

11

Consultar todos los títulos de publicaciones de un tipo de publicación específico

// 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
fuente
3
Esta es una función demasiado compleja para algo que se puede hacer fácilmente usando la API que WordPress proporciona en la clase WP_Query. La respuesta proporcionada por @ialocin es mucho mejor. No debería necesitar $ wpdb para esto.
somebodysomewhere
Sí y cuál es el punto del comentario? :)
Ahmed Fouad
1
@Brian ¿Qué hay far betterde la otra respuesta? Esto es técnicamente más rápido ya que solo está obteniendo los datos que necesita de mysql. La otra respuesta (respuesta más fácil) toma todos los datos en la memoria y luego los modifica en PHP. Eso es más trabajo para PHP. Ambos son aceptables pero cada uno tiene sus puntos fuertes. Si conoce mysql, entonces esto no es demasiado complejo en absoluto. Es muy simple.
JoeMoe1984
Estoy de acuerdo con @ JoeMoe1984, esta función no es tan simple como la otra respuesta ... PERO es MUCHO más eficiente desde una perspectiva de memoria. SQL es un lugar MUCHO mejor (que wp_list_pluck (...)) para reducir / extraer la información valiosa. Sí, es un poco más compleja, pero su sistema gracias por eso ...
mawalker
13

Podrías, y en mi opinión, deberías, usar las funciones de API para obtener los datos.

// 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
fuente
2
+1 para wp_list_pluck(). Siempre me olvido de eso ...
FaCE
¡+1 por presentarme al desplume! ¿Cómo no había visto esto antes?
Chizzle
5

Para un tipo de publicación jerárquica , tenemos incorporado:

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

eso generará un elemento de selección con títulos de publicaciones y el ID de la publicación como valor de la opción.

Ejemplo:

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

No está claro en la documentación de wp_dropdown_pages(), pero es un contenedor get_pages()y también admite sus argumentos de entrada.

Birgire
fuente
0

La forma en que siempre he hecho cosas como esta es usando get_postsy foreachcomo algo a continuación:

// 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
fuente
Esto funciona bien, gracias. Estoy intentando agregar 'seleccionado' a la opción actualmente guardada, he intentado con muchos bits diferentes de código y finalmente he llegado a esto, lo que me permite actualizar la opción pero no se agrega el 'seleccionado' a la correcta ¿Alguna sugerencia sobre lo que estoy haciendo mal? `$ str. = '<opción'. ($ post == $ value2? 'selected = selected': ''). '>'. $ post-> post_title. '</option>'; `Muchas gracias por cualquier sugerencia ps Lo siento, parece que no estoy agregando código correctamente, intenté
backticks