Mở rộng bối cảnh tìm kiếm trong màn hình bài đăng danh sách quản trị viên


34

Tôi đã tạo một loại bài đăng tùy chỉnh và đã đính kèm một số trường tùy chỉnh vào nó. Bây giờ tôi muốn tìm kiếm mà các tác giả có thể thực hiện trên màn hình danh sách bài đăng tùy chỉnh (trong phần phụ trợ quản trị) cũng được thực hiện trên các trường meta và không chỉ nhìn vào tiêu đề và nội dung như bình thường.

Tôi có thể kết nối ở đâu và tôi phải sử dụng mã nào?

Hình ảnh ví dụ nhập mô tả hình ảnh ở đây

Stefano


1
Một câu hỏi cũ, nhưng..tôi muốn đề nghị ẩn địa chỉ email và tên khỏi ảnh chụp màn hình ...
Erenor Paz 22/07/18

Câu trả lời:


37

Tôi đã giải quyết việc lọc truy vấn bằng cách thêm phép nối trên bảng postmeta và thay đổi mệnh đề where. mẹo lọc mệnh đề WHERE (thường yêu cầu tìm kiếm & thay thế biểu thức chính quy) có ở đây trên codex :

add_filter( 'posts_join', 'segnalazioni_search_join' );
function segnalazioni_search_join ( $join ) {
    global $pagenow, $wpdb;

    // I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni".
    if ( is_admin() && 'edit.php' === $pagenow && 'segnalazioni' === $_GET['post_type'] && ! empty( $_GET['s'] ) ) {    
        $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    return $join;
}

add_filter( 'posts_where', 'segnalazioni_search_where' );
function segnalazioni_search_where( $where ) {
    global $pagenow, $wpdb;

    // I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni".
    if ( is_admin() && 'edit.php' === $pagenow && 'segnalazioni' === $_GET['post_type'] && ! empty( $_GET['s'] ) ) {
        $where = preg_replace(
            "/\(\s*" . $wpdb->posts . ".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(" . $wpdb->posts . ".post_title LIKE $1) OR (" . $wpdb->postmeta . ".meta_value LIKE $1)", $where );
    }
    return $where;
}

1
Ồ Chỉ là những gì tôi đã tìm kiếm. Tuy nhiên, tôi nghĩ rằng tôi có thể tìm thấy một lỗi, khi tìm kiếm trên tiêu đề bài đăng, tôi nhận được một trận đấu sau đó được nhân đôi trong kết quả 5 lần!?! imgur.com/eE52gIA
jnthnclrk

Đây là một bản tóm tắt khác với SQL được in: tinypic.com/view.php?pic=124tqb6&s=5 Không thể hiểu tại sao tôi nhận được 5 mục!?!
jnthnclrk

1
Đã đăng một câu hỏi riêng về cách sửa lỗi dupe: wordpress.stackexchange.com/questions/111185/
Kẻ

Điều này và bài viết dưới đây là hữu ích cho tôi. Bây giờ để tìm cách bao gồm tìm kiếm cho tác giả bài đăng và hiển thị các bài đăng được thực hiện bởi họ.
Shawn Rebelo

@Stefano, kết quả tìm kiếm đang hoạt động. Có một vấn đề, trường mặc định "Tiêu đề bài viết", hồ sơ tìm kiếm đang lặp lại nhiều lần và phía quản trị viên. Xem: imgur.com/a/W4wmXhO
Siêu mẫu

10

Câu trả lời của Stefano rất hay nhưng nó thiếu một mệnh đề riêng biệt:

function segnalazioni_search_distinct( $where ){
    global $pagenow, $wpdb;

    if ( is_admin() && $pagenow=='edit.php' && $_GET['post_type']=='segnalazioni' && $_GET['s'] != '') {
    return "DISTINCT";

    }
    return $where;
}
add_filter( 'posts_distinct', 'segnalazioni_search_distinct' );

Thêm mã ở trên cập nhật nó và nó sẽ hoạt động không có bản sao.


7

Điều này sẽ làm việc,

function custom_search_query( $query ) {
    $custom_fields = array(
        // put all the meta fields you want to search for here
        "rg_first_name",
        "rg_1job_designation"
    );
    $searchterm = $query->query_vars['s'];

    // we have to remove the "s" parameter from the query, because it will prevent the posts from being found
    $query->query_vars['s'] = "";

    if ($searchterm != "") {
        $meta_query = array('relation' => 'OR');
        foreach($custom_fields as $cf) {
            array_push($meta_query, array(
                'key' => $cf,
                'value' => $searchterm,
                'compare' => 'LIKE'
            ));
        }
        $query->set("meta_query", $meta_query);
    };
}
add_filter( "pre_get_posts", "custom_search_query");

1
Yêu cầu thụt lề đúng mã của bạn và bao gồm một lời giải thích về lý do và cách thức hoạt động của mã này .
tfrommen

Mặc dù lần đầu tiên tôi nâng cấp nó, tôi nhận ra rằng, thật không may, nó sẽ hoạt động trên mọi tìm kiếm giống như vậy, nó có thể phá vỡ tìm kiếm ở mặt trước.
Maciej Paprocki

Thêm một kiểm tra cho if ( $query->query['post_type'] != 'your_custom_post_type' ){ return; }đầu trên cùng của chức năng sẽ ngăn điều này chạy trên các tìm kiếm khác. Lưu ý rằng kỹ thuật trong câu trả lời này không còn tìm kiếm post_title và thêm nó trở lại là không tầm thường.
jwinn

Một vấn đề nữa - Chỉ báo Kết quả tìm kiếm cho các cuộc gọi <keyword> của cuộc gọi get_search_query()mà cuộc gọi tiếp theo get_query_var( 's' ). Vì "s" được đặt thành chuỗi trống, nên kết quả tìm kiếm cho Triệu Tấn sẽ luôn có giá trị trống giữa các dấu ngoặc kép. Có một điều chỉnh cho giải pháp này được xung quanh này?
21 giờ 01 phút

1

Trả lời 1: Thêm mã này vào tệp chức năng, thay đổi và thêm tên cột khác mà bạn đã sử dụng trong loại bài đăng tùy chỉnh của mình

function extend_admin_search( $query ) {

    // use your post type
    $post_type = 'document';
    // Use your Custom fields/column name to search for
    $custom_fields = array(
        "_file_name",
    );

    if( ! is_admin() )
        return;

    if ( $query->query['post_type'] != $post_type )
        return;

    $search_term = $query->query_vars['s'];

    // Set to empty, otherwise it won't find anything
    $query->query_vars['s'] = '';

    if ( $search_term != '' ) {
        $meta_query = array( 'relation' => 'OR' );

        foreach( $custom_fields as $custom_field ) {
            array_push( $meta_query, array(
                'key' => $custom_field,
                'value' => $search_term,
                'compare' => 'LIKE'
            ));
        }

        $query->set( 'meta_query', $meta_query );
    };
}

add_action( 'pre_get_posts', 'extend_admin_search' );

Trả lời 2: Khuyến nghị Sử dụng mã này trong tệp chức năng mà không có bất kỳ thay đổi nào

function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }

    return $join;
}
add_filter('posts_join', 'cf_search_join' );
function cf_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search() ) {
        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

0

Nó không phải là một tìm kiếm, nhưng một số "chọn" theo giá trị riêng biệt.

Trong tệp chức năng- iworks-posts-film.zip Bạn có một ví dụ về cách thêm bộ lọc cho bài đăng thông thường của một số meta_key. Tôi nghĩ rằng nó là dễ dàng để chuyển đổi.


cảm ơn vì sự giúp đỡ ... Tôi sẽ xem xét tài liệu đính kèm của bạn ngay bây giờ. Tôi sẽ cho bạn biết kết quả điều tra của tôi ;-) Stefano
Stefano

Marcin Tôi nghĩ rằng bạn đang giới thiệu đến các bộ lọc như "theo ngày", v.v ... nhưng tôi cần nối vào trường "tìm kiếm miễn phí" ở trên. Dù sao tôi chỉ đăng giải pháp của tôi, có lẽ nó sẽ giúp Cảm ơn bạn nào!
Stefano

0

Phiên bản mã ở đây trong một vài câu trả lời sửa đổi tham số meta_query của WP_Query tìm kiếm trong pre_get_posts không còn tìm kiếm post_title. Thêm khả năng tìm kiếm tiêu đề bài đăng, HOẶC giá trị meta không thể được thực hiện trực tiếp trong WP_Query mà không sửa đổi SQL, vì câu hỏi này được xây dựng dựa trên: Sử dụng truy vấn meta ('meta_query') với truy vấn tìm kiếm ('s')

Tôi đã kết hợp một số kỹ thuật ở đây để có được một phiên bản hoạt động nhằm tránh các preg numplaces và quá nhiều sửa đổi SQL (tôi ước nó có thể tránh được hoàn toàn). Nhược điểm duy nhất là sau khi tìm kiếm, văn bản phụ đề ở đầu trang có nội dung "Kết quả tìm kiếm cho ''". Tôi đã ẩn điều đó với CSS cho loại bài đăng tùy chỉnh của plugin của tôi.

/**
 * Extend custom post type search to also search meta fields
 * @param  WP_Query $query
 */
function extend_cpt_admin_search( $query ) {
  // Make sure we're in the admin area and that this is our custom post type
  if ( !is_admin() || $query->query['post_type'] != 'your_custom_post_type' ){
    return;
  }

  // Put all the meta fields you want to search for here
  $custom_fields = array(
    "your_custom_meta_field",
    "your_custom_meta_field2",
    "your_custom_meta_field3"
  );
  // The string submitted via the search form
  $searchterm = $query->query_vars['s'];

  // Set to empty, otherwise no results will be returned.
  // The one downside is that the displayed search text is empty at the top of the page.
  $query->query_vars['s'] = '';

  if ($searchterm != ""){
    // Add additional meta_query parameter to the WP_Query object.
    // Reference: https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
    $meta_query = array();
    foreach($custom_fields as $cf) {
      array_push($meta_query, array(
        'key' => $cf,
        'value' => $searchterm,
        'compare' => 'LIKE'
      ));
    }
    // Use an 'OR' comparison for each additional custom meta field.
    if (count($meta_query) > 1){
      $meta_query['relation'] = 'OR';
    }
    // Set the meta_query parameter
    $query->set('meta_query', $meta_query);


    // To allow the search to also return "OR" results on the post_title
    $query->set('_meta_or_title', $searchterm);
  }
}
add_action('pre_get_posts', 'extend_cpt_admin_search');



/**
 * WP_Query parameter _meta_or_title to allow searching post_title when also
 * checking searching custom meta values
 * https://wordpress.stackexchange.com/questions/78649/using-meta-query-meta-query-with-a-search-query-s
 * https://wordpress.stackexchange.com/a/178492
 * This looks a little scary, but basically it's modifying the WHERE clause in the 
 * SQL to say "[like the post_title] OR [the existing WHERE clause]"
 * @param  WP_Query $q
 */
function meta_or_title_search( $q ){
  if( $title = $q->get( '_meta_or_title' ) ){
    add_filter( 'get_meta_sql', function( $sql ) use ( $title ){
      global $wpdb;

      // Only run once:
      static $nr = 0;
      if( 0 != $nr++ ) return $sql;

      // Modified WHERE
      $sql['where'] = sprintf(
          " AND ( (%s) OR (%s) ) ",
          $wpdb->prepare( "{$wpdb->posts}.post_title LIKE '%%%s%%'", $title),
          mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
      );

      return $sql;
    });
  }
}
add_action('pre_get_posts', 'meta_or_title_search');
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.