Làm thế nào để lấy tất cả các tiêu đề bài viết của một loại bài cụ thể?


9

Tôi muốn sử dụng các tiêu đề trong một yếu tố được chọn trong một hình thức tôi đang lặp lại cho phía khách hàng. cách nào tốt nhất để làm việc này?


Câu hỏi không rõ ràng lắm. Bạn đang cố gắng trả lại tất cả các tiêu đề bài viết cho tất cả các bài viết dưới loại bài đăng cụ thể? Có đúng không?
Ahmed Fouad

Lấy làm tiếc! Có chính xác, tôi đã tạo một loại bài đăng tùy chỉnh, tạo một vài bài đăng thuộc loại này và tôi muốn lặp lại một biểu mẫu với một yếu tố được chọn cho phép người dùng chọn một trong các tiêu đề (Chúng đại diện cho các dự án) để tặng.
Peter Turner

Câu trả lời:


11

Truy vấn tất cả các tiêu đề bài viết của một loại bài cụ thể

// 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
Đây là một hàm quá phức tạp đối với một cái gì đó có thể dễ dàng thực hiện bằng cách sử dụng API mà WordPress cung cấp trong lớp WP_Query. Câu trả lời được cung cấp bởi @ialocin tốt hơn nhiều. Bạn không cần $ wpdb cho việc này.
somebodysomewhere

Vâng và quan điểm của bình luận là gì? :)
Ahmed Fouad

1
@Brian Còn far bettercâu trả lời khác thì sao? Điều này nhanh hơn về mặt kỹ thuật vì bạn chỉ lấy dữ liệu mà bạn cần từ mysql. Câu trả lời khác (câu trả lời dễ dàng hơn) lấy tất cả dữ liệu vào bộ nhớ sau đó sửa đổi nó sau đó trong PHP. Đó là công việc nhiều hơn cho PHP. Cả hai đều được chấp nhận nhưng mỗi người đều có điểm mạnh. Nếu bạn biết mysql thì điều này không quá phức tạp. Nó khá đơn giản.
JoeMoe1984

Tôi đồng ý với @ JoeMoe1984, Chức năng này không đơn giản như câu trả lời khác ... NHƯNG nó hiệu quả hơn từ góc độ bộ nhớ. SQL là một nơi tốt hơn FAR (hơn wp_list_pluck (...)) để giảm / trích xuất thông tin có giá trị từ đó. Vâng, nó phức tạp hơn một chút, nhưng hệ thống của bạn sẽ cảm ơn bạn vì điều đó ...
mawalker 15/03/18

13

Bạn có thể - và trong suy nghĩ của tôi, nên - sử dụng các hàm API để lấy dữ liệu.

// 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 cho wp_list_pluck(). Tôi luôn quên điều đó ...
FaCE

+1 để giới thiệu cho tôi về việc nhổ lông! Làm thế nào tôi không nhìn thấy điều này trước đây ??
Chizzle

5

Đối với loại bài đăng phân cấp , chúng tôi có tích hợp:

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

sẽ tạo ra một yếu tố được chọn với tiêu đề bài đăngID bài đăng làm giá trị tùy chọn.

Thí dụ:

<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ó không rõ ràng từ tài liệu cho wp_dropdown_pages(), nhưng nó là một trình bao bọc get_pages()và cũng hỗ trợ các đối số đầu vào của nó.


0

Cách tôi luôn làm những việc như thế này là sử dụng get_postsforeachthích một cái gì đó bên dưới:

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

Điều này đang làm việc tốt, cảm ơn bạn. Tôi đang cố gắng thêm 'được chọn' vào tùy chọn hiện được lưu, tôi đã thử rất nhiều đoạn mã khác nhau và cuối cùng đã đến đây, điều này cho phép tôi cập nhật tùy chọn nhưng 'đã chọn' không được thêm vào cho đúng Bất kỳ con trỏ về những gì tôi đang làm sai? `$ str. = '<tùy chọn'. ($ post == $ value2? 'đã chọn = đã chọn': ''). '>'. $ post-> post_title. '</ tùy chọn>'; `Rất cám ơn cho bất kỳ đề xuất nào ps Xin lỗi tôi dường như không thêm mã chính xác, đã thử backticks
Jo_pinkish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.