ฉันต้องสร้างหน้าค้นหาที่จะแสดงสิ่งที่เกี่ยวข้องกับการค้นหาที่ให้มา คือcomments
มีมัน, events
, posts
, CPT
s และusers
มีชื่อนั้น
ฉันจะค้นหาผู้ใช้ในเว็บไซต์ที่ชื่อหรือนามสกุลมีวลีค้นหาได้อย่างไร
ฉันต้องสร้างหน้าค้นหาที่จะแสดงสิ่งที่เกี่ยวข้องกับการค้นหาที่ให้มา คือcomments
มีมัน, events
, posts
, CPT
s และusers
มีชื่อนั้น
ฉันจะค้นหาผู้ใช้ในเว็บไซต์ที่ชื่อหรือนามสกุลมีวลีค้นหาได้อย่างไร
คำตอบ:
เพียงใช้WP_User_Query
กับอาร์กิวเมนต์การค้นหา
ดังนั้นหากคุณต้องการค้นหาตัวอย่างสำหรับผู้ใช้ที่มีคำสำคัญในuser_email
คอลัมน์ของเขาหรือคล้ายกันจาก{$wpdb->prefix}users
ตารางคุณสามารถทำสิ่งต่อไปนี้:
$users = new WP_User_Query( array(
'search' => '*'.esc_attr( $your_search_string ).'*',
'search_columns' => array(
'user_login',
'user_nicename',
'user_email',
'user_url',
),
) );
$users_found = $users->get_results();
โปรดทราบว่า*
เป็นสัญลักษณ์แทน ดังนั้นการ จำกัด เช่นการโดเมนเดียวจะให้คุณสตริงการค้นหาต่อไปนี้:user_email
*@example.com
search
สตริงมีบางส่วน "มายากล" คุณลักษณะของการsearch_columns
เริ่มต้นที่ ...
user_email
หาก@
มีอยู่ในsearch
หาเรื่องuser_login
และID
ถ้าsearch
หาเรื่องเป็นตัวเลขuser_url
ถ้าsearch
สตริงมีhttp://
หรือhttps://
user_login
และuser_nicename
ถ้ามีสตริงอยู่ค่าเริ่มต้นทั้งหมดนั้นจะถูกตั้งค่าก็ต่อเมื่อไม่มี search_columns
การระบุอาร์กิวเมนต์
หากคุณต้องการค้นหาตัวอย่างfirst_name
หรือlast_name
คุณจะต้องทำmeta_query
ตามที่ไม่ได้เป็นส่วนหนึ่งของตารางหลัก:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'first_name',
'value' => $search_string,
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $search_string,
'compare' => 'LIKE'
)
)
) );
$users_found = $users->get_results();
ตรวจสอบให้แน่ใจว่าคุณได้รับสตริงการค้นหาที่ถูกต้อง โดยปกติจะเป็นget_query_var('s');
เช่นนั้น แต่ก็สามารถ - ขึ้นอยู่กับแบบฟอร์มของคุณname/id
และเป็นสิ่งที่แตกต่างที่คุณอาจต้องการเรียกคืนโดยใช้$_GET['user_search']
ตัวอย่างเช่น ตรวจสอบให้แน่ใจว่าได้ esacpe อย่างถูกต้องและลบพื้นที่สีขาวที่ไม่ต้องการจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง
เก็บไว้ในใจว่านี่คือarray( array() )
เท่าที่มีเป็นrelation
สำคัญ หากคุณต้องการค้นหาคีย์เดียวอาจจะง่ายกว่าหากทำตามขั้นตอนต่อไปนี้:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'meta_key' => 'first_name',
'meta_value' => $search_string,
'meta_compare' => 'LIKE',
) );
$users_found = $users->get_results();
ผลลัพธ์อาจดูใกล้เคียงกับสิ่งต่อไปนี้:
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
'search' => "*{$search_string}*",
'search_columns' => array(
'user_login',
'user_nicename',
'user_email',
'user_url',
),
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'first_name',
'value' => $search_string,
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $search_string,
'compare' => 'LIKE'
)
)
) );
$users_found = $users->get_results();
functions.php
แม่แบบของคุณหรือ (ซึ่งน่าจะดีที่สุด) พันไว้อย่างดีใน mini-plugin ที่กำหนดเองเพื่อไม่ให้ฟังก์ชั่นหลวมเมื่อเปลี่ยนธีม
display_name
wp_users
เป็นคอลัมน์ใน คำถามสองข้ออยู่ในใจ 1: นี่เป็นการเปลี่ยนแปลงล่าสุดของสกีมาฐานข้อมูลหรือไม่ 2: สามารถใช้เป็นค่าsearch_columns
แทนการสืบค้นเมตาได้หรือไม่
สิ่งนี้ช่วยฉันแทนคำตอบของ kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/
แต่ในการแก้ปัญหานี้ฟังก์ชั่นที่สร้างข้อผิดพลาดดังนั้นฉันเพียงแค่ใช้$wpdb->escape($usermeta_keys)
$usermeta_keys