Como recuperar todos os títulos de postagem de um tipo de postagem específico?

9

Gostaria de usar os títulos em um elemento select de uma forma que estou ecoando para o lado do cliente. Qual seria a melhor forma de fazer isso?

Peter Turner
fonte
A questão não é muito clara. Você está tentando retornar todos os títulos de postagens para todas as postagens sob um tipo de postagem específico? Isso está certo?
Ahmed Fouad
Desculpa! Sim, exatamente, eu criei um tipo de postagem personalizado, criei algumas postagens desse tipo e desejo ecoar um formulário com um elemento select que permita ao usuário selecionar um dos títulos (eles representam projetos) para doação.
Peter Turner

Respostas:

11

Consultar todos os títulos de postagem de um tipo de postagem 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
fonte
3
Essa é uma função excessivamente complexa para algo que pode ser feito facilmente usando a API que o WordPress fornece na classe WP_Query. A resposta fornecida pelo @ialocin é muito melhor. Você não deve precisar de $ wpdb para isso.
somebodysomewhere
Sim e qual é o objetivo do comentário? :)
Ahmed Fouad
11
@ Brian Qual é far bettera outra resposta? Isso é tecnicamente mais rápido, pois você está pegando apenas os dados necessários do mysql. A outra resposta (resposta mais fácil) captura todos os dados na memória e depois os modifica no PHP. Isso é mais trabalho para PHP. Ambos são aceitáveis, mas cada um tem seus pontos fortes. Se você conhece o mysql, isso não é muito complexo. É bem simples.
precisa saber é o seguinte
Concordo com JoeMoe1984. Esta função não é tão simples quanto a outra resposta ... MAS É MUITO MAIS eficiente do ponto de vista da memória. O SQL é um local MUITO melhor (do que wp_list_pluck (...)) para reduzir / extrair informações valiosas. Sim, é um pouco mais complexo, mas o seu sistema vai agradecer por isso ...
mawalker
13

Você poderia - e na minha opinião, deveria - usar funções da API para obter os dados.

// 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
fonte
2
+1 para wp_list_pluck(). Eu sempre esqueço esse ...
FaCE
+1 por me apresentar o jogo! Como eu não tinha visto isso antes?
Chizzle
5

Para um tipo hierárquico de postagem, temos o built-in:

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

que gerará um elemento de seleção com títulos de postagem e o ID da postagem como o valor da opção.

Exemplo:

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

Não está claro na documentação para wp_dropdown_pages(), mas é um invólucro get_pages()e também suporta seus argumentos de entrada.

Birgire
fonte
0

A maneira como sempre fiz coisas assim está usando get_postse foreachcomo algo abaixo:

// 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
fonte
Isso está funcionando bem, obrigado. Estou tentando adicionar 'selecionado' à opção salva atualmente, tentei vários bits de código diferentes e finalmente cheguei a isso, o que me permite atualizar a opção, mas o 'selecionado' não está sendo adicionado para o correto. Alguma dica sobre o que estou fazendo de errado? `$ str. = '<opção'. ($ post == $ value2? 'selected = selected': ''). '>'. backticks `Muito obrigado por todas as sugestões ps Desculpe, eu não parecem estar adicionando código corretamente, tentaram; $ post-> post_title '</ option>'.
Jo_pinkish