Lọc theo trường tùy chỉnh trong loại bài đăng tùy chỉnh trên trang quản trị


11

Tôi đã sử dụng Trường tùy chỉnh nâng cao để tạo trường tùy chỉnh cho tên cuộc thi, câu trả lời, v.v. Tôi đã tạo loại bài đăng tùy chỉnh cho các cuộc thi như được hiển thị trên hình ảnh và tôi đã sử dụng hàm Wordpress.php để tạo các cột từ các giá trị trường tùy chỉnh của mình.

Tôi đang cố gắng để có được hộp giảm tốc "Lọc theo" với các tên / nhãn cạnh tranh khác nhau như được hiển thị bên dưới, nhưng tôi chỉ có thể tìm giải pháp bằng cách phân loại, mà tôi không sử dụng nếu có thể vì tôi chỉ sử dụng các trường tùy chỉnh cho mọi thứ khác.

Có thể thực hiện thả xuống "Lọc theo" tùy chỉnh chỉ bằng các trường tùy chỉnh không?

Bộ lọc Wordpress bởi


Bạn có thể sử dụng restrict_manage_postshook hành động để thêm các hộp thả xuống bổ sung. Đừng quên rằng bạn cũng phải thêm một số logic cho bộ lọc, vì WP sẽ không biết phải làm gì với nó ngoài hộp (không giống như danh sách thả xuống phân loại, có thể tự động xử lý).
David Gard

Theo suy nghĩ bổ sung - nếu bạn muốn, bạn có thể đặt Tên để liên kết trong Bảng Danh sách của mình, nghĩa là bạn có thể lọc Cuộc thi bằng cách nhấp vào tên, thay vì thả xuống.
David Gard

Câu trả lời:


12

Và để hiển thị kết quả cho Bộ lọc, hãy thử mã này

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Thay đổi khóa meta và giá trị meta theo yêu cầu. Tôi đã lấy "tên cạnh tranh là meta_key và" tên cạnh tranh "làm tên thả xuống chọn.


Thật tuyệt, tôi cảm thấy lười biếng nên đề nghị anh ấy hỏi một câu hỏi bổ sung;)
David Gard

Có vẻ như 2 câu trả lời là một câu trả lời hoàn chỉnh và nên được kết hợp.
RCNeil

10

Các restrict_manage_posts hành động kích hoạt add_extra_tablenav()chức năng, đó là cách bạn thêm Dropdowns thêm để mong muốn Danh sách Bảng của bạn.

Trong ví dụ bên dưới, trước tiên chúng tôi đảm bảo rằng Loại bài đăng là chính xác và sau đó chúng tôi lấy tất cả các giá trị DB được lưu trữ đối với competition_namekhóa trong postmetabảng (bạn phải thay đổi tên khóa theo yêu cầu). Truy vấn khá cơ bản và chỉ kiểm tra xem Cuộc thi có được công bố hay không, chỉ lấy các giá trị duy nhất (bạn không muốn sao chép trong danh sách thả xuống) và sau đó sắp xếp chúng theo thứ tự bảng chữ cái.

Tiếp theo, chúng tôi kiểm tra kết quả (không có điểm nào xuất hiện trong danh sách thả xuống không có gì), sau đó xây dựng các tùy chọn (bao gồm cả một định nghĩa để hiển thị tất cả). Cuối cùng, thả xuống là đầu ra.

Như đã nêu trong nhận xét của tôi, đây không phải là kết thúc của câu chuyện; bạn sẽ cần một số logic để báo cho Bảng danh sách chỉ hiển thị kết quả mong muốn của bạn khi bộ lọc hoạt động, nhưng tôi sẽ để bạn xem xét điều đó và sau đó bắt đầu một câu hỏi khác nếu bạn cần hỗ trợ thêm. Gợi ý - kiểm tra tệp /wp-admin/includes/class-wp-posts-list-table.phpvà đó là cha mẹ.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

Khi sử dụng, tôi gặp lỗiNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Tôi cũng đang gặp lỗi tương tự
Vasim Shaikh

0

Nếu điều này không hiệu quả với bất kỳ ai, giải pháp của tôi là cần thêm Cột tôi đang cố lọc theo danh sách các cột Sắp xếp cho loại bài đăng tùy chỉnh của tôi.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Thay thế truy vấn bên dưới để sửa lỗi wpdb: chuẩn bị:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
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.