ฉันจะปรับปรุงตัวอย่างข้อความค้นหาของผู้ดูแลระบบนี้เพื่อหลีกเลี่ยงการสร้างผลลัพธ์ซ้ำซ้อนในการค้นหาที่ไม่ใช่เมตาได้อย่างไร


11

ฉันเล่นกับโค้ดขนาดเล็กซึ่งเพิ่มข้อมูล meta ไปยังการค้นหาของผู้ดูแลระบบ

ตัวอย่างที่ดีที่สุดที่ฉันพบถูกเขียนโดยStefano ในคำถามนี้

อย่างไรก็ตามดูเหมือนว่าจะมีข้อผิดพลาดที่น่ารำคาญ 1 ข้อเมื่อค้นหาคำที่ไม่ใช่เมตา

นี่คือบางส่วนจากการติดตั้ง dev ท้องถิ่นของฉัน ฉันพิมพ์แบบสอบถาม MySQL 2 รายการลงบนหน้าจอ

มุมมองของโพสต์ CPT เดียวที่ฉันใช้ทดสอบ

มุมมองของโพสต์ CPT เดียวที่ฉันใช้ทดสอบ

นี่คือรหัสที่ทำงานตามที่คาดไว้และอนุญาตให้ฉันค้นหาข้อมูลเมตาจากผู้ดูแลระบบ

นี่คือรหัสที่ทำงานตามที่คาดไว้และอนุญาตให้ฉันค้นหาข้อมูลเมตาจากผู้ดูแลระบบ

น่าเสียดายที่รหัสสร้างรายการซ้ำในการจับคู่ที่ไม่ใช่เมตาในกรณีนี้กับชื่อโพสต์

น่าเสียดายที่รหัสสร้างรายการซ้ำในการจับคู่ที่ไม่ใช่เมตาในกรณีนี้กับชื่อโพสต์

การคว้าแสดงสถานะการโพสต์ประเภทโพสต์และโพสต์บรรพบุรุษของการหลอก

! การคว้าแสดงสถานะการโพสต์ประเภทโพสต์และโพสต์บรรพบุรุษของคู่

นี่คือรหัสที่ฉันใช้อยู่โดยพื้นฐานแล้วมันก็เหมือนกับของ Stefano แต่ด้วยความพยายามอย่างหยาบของฉันในการทำให้คิวรีทำงาน

/*
 * 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' );  

อาจจะเป็นรายการแก้ไขด้วยหรือไม่
passatgt

ฉันคิดว่าฉันกำลังดูที่เผยแพร่เท่านั้นเนื่องจากฉันลบที่รอดำเนินการเป็นส่วนตัวฉบับร่าง & ในอนาคต ไม่ได้สังเกตเห็นประเภทการแก้ไข
jnthnclrk

อืมดูเหมือนจะไม่เป็นสถานะ "การแก้ไข": codex.wordpress.org/Post_Status
jnthnclrk

ลองพิมพ์ print_r ประเภทโพสต์หรือโพสต์ id ในคอลัมน์ใดคอลัมน์หนึ่งฉันคิดว่าการแก้ไขเป็นประเภทโพสต์ดังนั้นหากคุณเห็นการแก้ไขคุณก็มีสิ่งนั้นอยู่ในผลลัพธ์เช่นกัน แต่ฉันก็สามารถเห็นได้ว่าคุณแสดงผลลัพธ์จากประเภทโพสต์รายชื่อเท่านั้นดังนั้นฉันคิดว่าฉันผิด แต่มันก็คุ้มค่าที่จะลอง :)
passatgt

เพิ่มการคว้าใหม่ที่มีสถานะโพสต์ประเภทโพสต์และบรรพบุรุษโพสต์
jnthnclrk

คำตอบ:


11

ในกลุ่มสามารถคำสั่งโพสต์ของคุณหลังจากที่GROUP BY JOINสำหรับ Wordpress คุณสามารถใช้posts_groupbyตัวกรอง

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

ขอบคุณสำหรับผลงานของคุณในครั้งนี้ รหัสนี้ทำให้ฉันได้รับประโยชน์มากที่สุดจากที่นั่น แต่การใช้ WP 3.8 ฉันได้รับข้อผิดพลาดของตาราง / นามแฝง SQL ที่ไม่ซ้ำกันดังนั้นฉันจึงทำการเปลี่ยนแปลงบางอย่าง เพื่อให้สามารถติดตั้งได้ฉันต้องตั้งชื่อแทน $ wpdb-> postmeta ที่ใช้ในคำสั่ง JOIN ฉันยังตรวจสอบเพียงตรวจสอบครั้งเดียวเพื่อดูว่าควรใช้ hooks เพื่อให้พวกเขาไม่ได้ยิงทุกครั้ง หวังว่านี่จะช่วยใครซักคน!

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