Belirli bir yazı türündeki tüm yayın başlıkları nasıl alınır?


9

İstemci tarafına yankıladığım bir formdaki bir seçme öğesi içindeki başlıkları kullanmak istiyorum. Bunu yapmanın en iyi yolu ne olurdu?


Soru çok açık değil. Belirli gönderi türü altındaki tüm gönderiler için tüm gönderi başlıklarını döndürmeye mi çalışıyorsunuz? Bu doğru mu?
Ahmed Fouad

Afedersiniz! Evet tam olarak, özel bir yazı türü yaptım, bu tür birkaç yazı oluşturdum ve bir kullanıcının bağışlamak için başlıklardan birini (projeleri temsil eder) seçmesine izin veren bir seçme öğesi ile bir form yankılamak istiyorum.
Peter Turner

Yanıtlar:


11

Belirli bir yazı türündeki tüm yayın başlıklarını sorgula

// 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
Bu, WordPress'in WP_Query sınıfında sağladığı API kullanılarak kolayca yapılabilecek bir şey için aşırı karmaşık bir işlevdir. @İalocin tarafından verilen cevap çok daha iyi. Bunun için $ wpdb gerekmez.
somebodysomewhere

Evet ve yorumun anlamı nedir? :)
Ahmed Fouad

1
@Brian far betterDiğer cevap nedir? Bu, mysql'den ihtiyacınız olan verileri yakaladığınız için teknik olarak daha hızlıdır. Diğer cevap (daha kolay cevap) tüm verileri belleğe alır ve daha sonra PHP'de değiştirir. Bu PHP için daha fazla iş. Her ikisi de kabul edilebilir, ancak her birinin güçlü yönleri var. Mysql biliyorsanız o zaman bu aşırı derecede karmaşık değil. Oldukça basit.
JoeMoe1984

@ JoeMoe1984 ile hemfikirim, Bu fonksiyon diğer cevap kadar basit değil ... ANCAK bellek açısından ÇOK daha verimli. SQL değerli bilgileri azaltmak / ayıklamak için FAR daha iyi bir yerdir (wp_list_pluck (...)). Evet, biraz daha karmaşık, ama sisteminiz bunun için size teşekkür edecek ...
mawalker

13

Verileri elde etmek için API işlevlerini kullanabilirsiniz.

// 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
İçin +1 wp_list_pluck(). Bunu her zaman unuturum ...
FaCE

Beni koparmaya tanıttığın için +1 Bunu daha önce nasıl görmemiştim ??
Chizzle

5

Bir İçin hiyerarşik Yayın türüne, elimizdeki yerleşik:

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

seçenek değeri olarak posta başlıklarına ve posta kimliğine sahip bir seçme öğesi oluşturur .

Misal:

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

O dan açık değil belgelere için wp_dropdown_pages(), ancak bir sarıcı var get_pages()ve ayrıca 's girdi argümanları desteklemek.


0

Her zaman böyle şeyler yaptığım gibi kullanmak get_postsve foreachaşağıdaki gibi bir şey:

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

Bu iyi çalışıyor, teşekkürler. Şu anda kaydedilen seçeneğe 'seçili' eklemeye çalışıyorum, birçok farklı kod parçasını denedim ve sonunda bu seçeneği güncelledim, ancak 'seçili' eklenmiyor doğru olana. Yanlış yaptığımın bir göstergesi var mı? `$ str. = '<seçenek'. ($ post == $ value2? 'Seçili = seçili': ''). '>'. $ post-> post_title. '</option>'; `` Herhangi bir öneri için çok teşekkürler ps Maalesef kodu doğru bir şekilde
eklemiyor gibiyim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.