Làm cách nào để cải thiện đoạn mã truy vấn quản trị viên này để tránh tạo kết quả trùng lặp trên các tìm kiếm không phải là meta?


11

Tôi đã chơi xung quanh với các đoạn mã có thêm dữ liệu meta vào tìm kiếm của quản trị viên.

Đoạn trích hay nhất mà tôi tìm thấy được viết bởi Stefano về câu hỏi này .

Tuy nhiên, nó dường như có 1 lỗi khó chịu khi tìm kiếm các thuật ngữ không phải meta.

Dưới đây là một số lấy từ cài đặt dev địa phương của tôi. Tôi đã in 2 truy vấn MySQL lên màn hình.

Xem bài đăng CPT duy nhất tôi đang sử dụng để kiểm tra

Xem bài đăng CPT duy nhất tôi đang sử dụng để kiểm tra

Đây là mã làm việc như mong đợi và cho phép tôi tìm kiếm dữ liệu meta từ quản trị viên

Đây là mã làm việc như mong đợi và cho phép tôi tìm kiếm dữ liệu meta từ quản trị viên

Thật không may, mã tạo các bản sao trên các kết quả không phải là meta, trong trường hợp này là trên tiêu đề bài đăng

Thật không may, mã tạo các bản sao trên các kết quả không phải là meta, trong trường hợp này là trên tiêu đề bài đăng

Một ví dụ hiển thị trạng thái bài đăng, loại bài đăng và tổ tiên của bản sao

! Một ví dụ hiển thị trạng thái bài đăng, loại bài đăng và tổ tiên của bản sao

Đây là mã tôi đang chạy, về cơ bản giống như mã của Stefano, nhưng với những nỗ lực thô sơ của tôi để làm cho truy vấn hoạt động.

/*
 * Search custom fields from admin keyword searches
 */

function rel_search_join( $join ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') {    
        $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    echo '<br><strong>JOIN</strong>: ';
    print_r ( $join );
    echo '<br>';
    return $join;
}
add_filter('posts_join', 'rel_search_join' );

function rel_search_where( $where ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_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 );
        $where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'private'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'future'", "", $where );
    }
    echo '<br><strong>WHERE</strong>: ';
    print_r ( $where );
    echo '<br>';
    return $where;
}
add_filter( 'posts_where', 'rel_search_where' );  

Có lẽ nó liệt kê các sửa đổi quá?
passatgt

Tôi nghĩ rằng tôi chỉ nhìn vào xuất bản, bởi vì tôi đã loại bỏ chờ xử lý, riêng tư, dự thảo và tương lai. Không nhận thấy một loại sửa đổi.
jnthnclrk

Hmmm, dường như không phải là trạng thái "sửa đổi": codex.wordpress.org/Post_Status
jnthnclrk

hãy thử print_r loại bài đăng hoặc id bài đăng trong một trong các cột, tôi nghĩ rằng bản sửa đổi là loại bài đăng, vì vậy nếu bạn có thể xem bản sửa đổi, bạn cũng có kết quả đó. Nhưng tôi cũng có thể thấy rằng bạn chỉ hiển thị kết quả từ loại bài đăng danh sách, vì vậy tôi nghĩ rằng tôi đã sai. Nhưng nó đáng để thử :)
passatgt

Đã thêm một lấy mới với trạng thái bài, loại bài và tổ tiên đăng.
jnthnclrk

Câu trả lời:


11

Một GROUP BYtuyên bố có thể nhóm bài viết của bạn sau JOIN. Đối với Wordpress, bạn có thể sử dụng posts_groupbybộ lọc.

add_filter( 'posts_groupby', 'my_post_limits' );
function my_post_limits($groupby) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
        $groupby = "$wpdb->posts.ID";
    }
    return $groupby;
}

4

Cảm ơn bạn đã làm việc này, folks. Mã này đã đưa tôi đến gần hết, nhưng khi sử dụng WP 3.8, tôi đã gặp một lỗi bảng / bí danh không phải là SQL, vì vậy tôi đã thực hiện một số thay đổi. Để nó hoạt động trên thiết lập của tôi, tôi đã phải đặt một bí danh $ wpdb-> postmeta đã được sử dụng trong câu lệnh THAM GIA. Tôi cũng chỉ kiểm tra một lần để xem có nên sử dụng móc không để chúng không bắn mỗi lần. Hy vọng điều này sẽ giúp được ai đó!

global $postmeta_alias, $is_specials_search;
$cpt_name = 'special';
$postmeta_alias = 'pdpm'; // Change this to whatever your custom post type is
$is_specials_search = is_admin() && $pagenow=='edit.php' && isset( $_GET['post_type'] ) && $_GET['post_type']==$cpt_name && isset( $_GET['s'] );

// Extend search to include 'description' field
if ( $is_specials_search ) {
  add_filter( 'posts_join',      'pd_description_search_join' );
  add_filter( 'posts_where',     'pd_description_search_where' );
  add_filter( 'posts_groupby',   'pd_search_dupe_fix' );
}

function pd_description_search_join ($join){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

  if ( $is_specials_search )  
    $join .='LEFT JOIN '.$wpdb->postmeta. ' as ' . $postmeta_alias . ' ON '. $wpdb->posts . '.ID = ' . $postmeta_alias . '.post_id ';

  return $join;
} // END search_join

function pd_description_search_where( $where ){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

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

  return $where;
} // END search_where

function pd_search_dupe_fix($groupby) {
    global $pagenow, $wpdb, $is_specials_search;

    if ( $is_specials_search )
      $groupby = "$wpdb->posts.ID";

    return $groupby;
} // END pd_search_dupe_fix
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.