จะดึงหัวข้อโพสต์ทั้งหมดของประเภทโพสต์ที่ต้องการได้อย่างไร


9

ฉันต้องการใช้ชื่อภายในองค์ประกอบที่เลือกในรูปแบบที่ฉันสะท้อนไปยังด้านลูกค้า อะไรจะเป็นวิธีที่ดีที่สุดในการทำเช่นนี้?


คำถามไม่ชัดเจน คุณกำลังพยายามส่งคืนชื่อโพสต์ทั้งหมดสำหรับโพสต์ทั้งหมดภายใต้ประเภทโพสต์เฉพาะหรือไม่ นั่นถูกต้องใช่ไหม?
Ahmed Fouad

ขออภัย! ใช่ฉันสร้างประเภทโพสต์ที่กำหนดเองสร้างโพสต์สองสามประเภทนี้และฉันต้องการที่จะสะท้อนรูปแบบด้วยองค์ประกอบที่เลือกซึ่งช่วยให้ผู้ใช้สามารถเลือกหนึ่งในชื่อเรื่อง (พวกเขาเป็นตัวแทนของโครงการ) เพื่อบริจาค
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
นี่เป็นฟังก์ชั่นที่ซับซ้อนมากเกินไปสำหรับบางสิ่งที่สามารถทำได้อย่างง่ายดายโดยใช้ API ที่ WordPress มีให้ในคลาส WP_Query คำตอบของ @ialocin นั้นดีกว่ามาก คุณไม่ควรต้อง $ wpdb สำหรับสิ่งนี้
บางแห่งที่อื่น

ใช่แล้วประเด็นของความคิดเห็นคืออะไร? :)
Ahmed Fouad

1
@Brian far betterคำตอบอื่น ๆ คืออะไร? นี่เป็นเทคนิคที่เร็วกว่าที่คุณจะคว้าเฉพาะข้อมูลที่คุณต้องการจาก mysql คำตอบอื่น ๆ (คำตอบง่ายกว่า) จะดึงข้อมูลทั้งหมดลงในหน่วยความจำแล้วทำการแก้ไขใน PHP นั่นทำงานได้มากกว่าสำหรับ PHP ทั้งสองเป็นที่ยอมรับ แต่แต่ละคนก็มีจุดแข็ง หากคุณรู้จัก mysql นี่จะไม่ซับซ้อนเกินไป มันค่อนข้างง่าย
JoeMoe1984

ฉันเห็นด้วยกับ @ JoeMoe1984 ฟังก์ชั่นนี้ไม่ง่ายเหมือนคำตอบอื่น ๆ ... แต่มันมีประสิทธิภาพมากกว่าจากมุมมองของหน่วยความจำ SQL เป็นตำแหน่งที่ดีกว่า (มากกว่า wp_list_pluck (... )) เพื่อลด / แยกข้อมูลที่มีค่าออกจาก ใช่มันซับซ้อนกว่าเล็กน้อย แต่ระบบของคุณจะขอบคุณสำหรับสิ่งนั้น ...
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()สำหรับ ฉันมักจะลืมเกี่ยวกับที่หนึ่ง ...
ใบหน้า

+1 สำหรับแนะนำฉันให้รู้จักกับคนที่กล้าหาญ! ฉันไม่เคยเห็นสิ่งนี้มาก่อนหรือไม่?
Chizzle

5

สำหรับประเภทโพสต์แบบลำดับชั้นเรามีบิวท์อิน:

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

ที่จะสร้างองค์ประกอบเลือกที่มีชื่อโพสต์และรหัสโพสต์เป็นค่าตัวเลือก

ตัวอย่าง:

<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_postsและforeachชอบบางสิ่งด้านล่าง:

// 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 ขออภัยฉันดูเหมือนจะไม่เพิ่มรหัสอย่างถูกต้องลอง backticks
Jo_pinkish
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.