特定の投稿タイプのすべての投稿タイトルを取得するにはどうすればよいですか?


9

クライアント側にエコーするフォームで、select要素内のタイトルを使用したいと思います。これを行う最善の方法は何でしょうか?


質問はあまり明確ではありません。特定の投稿タイプのすべての投稿のすべての投稿タイトルを返そうとしていますか?そうですか?
Ahmed Fouad 2016

ごめんなさい!はい、正確に、カスタム投稿タイプを作成し、このタイプの投稿をいくつか作成しました。ユーザーが寄付するタイトル(プロジェクトを表す)の1つを選択できるようにするselect要素を使用してフォームをエコーし​​ます。
Peter Turner

回答:


11

特定の投稿タイプのすべての投稿タイトルをクエリする

// 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
これは、WordPressがWP_Queryクラスで提供するAPIを使用して簡単に実行できる何かのための過度に複雑な関数です。@ialocinが提供する答えははるかに優れています。これには$ wpdbは必要ありません。
誰か

はい、コメントのポイントは何ですか?:)
Ahmed Fouad

1
@ブライアンfar better他の答えはどうですか?mysqlから必要なデータのみを取得するため、これは技術的に高速です。他の答え(簡単な答え)は、すべてのデータをメモリに取り込み、その後PHPで変更します。これは、PHPではより効果的です。どちらも許容範囲ですが、それぞれに長所があります。mysqlを知っていれば、これはそれほど複雑ではありません。とてもシンプルです。
JoeMoe1984

@ JoeMoe1984に同意します。この関数は他の答えほど単純ではありません...しかし、メモリの観点からははるかに効率的です。SQLは、(wp_list_pluck(...)よりも)FARの方が貴重な情報を減らしたり抽出したりするのに適しています。はい、少し複雑ですが、システムはそれを感謝します...
mawalker

13

私の考えでは、API関数を使用してデータを取得できます。

// 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 wp_list_pluck()。私はいつもそのことを忘れています...
FaCE

抜粋を紹介してくれた+1!どうしてこれまで見なかったのですか?
Chizzle 2017

5

以下のための階層ポストタイプ、我々は内蔵されています:

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

これにより、投稿のタイトル投稿IDをオプション値として持つselect要素が生成されます。

例:

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

それからはっきりしないドキュメントのためにwp_dropdown_pages()、それはラッパーだget_pages()とも、それの入力引数をサポートしています。


0

私が常にこのようなことをしてきた方法はget_postsforeach以下のようなものを使用しています:

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

これでうまくいきます、ありがとう。現在保存されているオプションに「選択済み」を追加しようとしています。さまざまなコードを試しましたが、ようやくこれに到達しました。これにより、オプションを更新できますが、「選択済み」は追加されません。正しいものに。私が間違っていることへのポインタはありますか?`$ str。= '<オプション'。($ post == $ value2? 'selected = selected': '')。 '>'。$ post-> post_title。 '</ option>'; `提案に対する多くの感謝ps申し訳ありませんが、コードを正しく追加していないようです。バック
ティックを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.