ฉันเล่นกับโค้ดขนาดเล็กซึ่งเพิ่มข้อมูล meta ไปยังการค้นหาของผู้ดูแลระบบ
ตัวอย่างที่ดีที่สุดที่ฉันพบถูกเขียนโดยStefano ในคำถามนี้
อย่างไรก็ตามดูเหมือนว่าจะมีข้อผิดพลาดที่น่ารำคาญ 1 ข้อเมื่อค้นหาคำที่ไม่ใช่เมตา
นี่คือบางส่วนจากการติดตั้ง dev ท้องถิ่นของฉัน ฉันพิมพ์แบบสอบถาม MySQL 2 รายการลงบนหน้าจอ
มุมมองของโพสต์ 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' );