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?


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();

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' );

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.


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;

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.