ฉันจะค้นหาผู้ใช้ worpress ด้วยชื่อที่แสดงหรือส่วนหนึ่งของมันได้อย่างไร


13

ฉันต้องสร้างหน้าค้นหาที่จะแสดงสิ่งที่เกี่ยวข้องกับการค้นหาที่ให้มา คือcommentsมีมัน, events, posts, CPTs และusersมีชื่อนั้น

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

คำตอบ:


24

ค้นหาตารางหลัก

เพียงใช้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();

ไฟล์ใดที่ฉันต้องการเพิ่มคิวรีนี้
Naveen

@ Naveen แบบที่ดีที่สุดน่าจะเป็นทั้งfunctions.phpแม่แบบของคุณหรือ (ซึ่งน่าจะดีที่สุด) พันไว้อย่างดีใน mini-plugin ที่กำหนดเองเพื่อไม่ให้ฟังก์ชั่นหลวมเมื่อเปลี่ยนธีม
ไกเซอร์

Kiaser ขอบคุณสำหรับคำตอบของคุณ โปรดช่วยฉันฉันจะรวมรหัสนี้กับ functions.php ได้อย่างไร
Naveen

3
@ Naveen ไม่อยู่ในขอบเขตที่นี่ คุณจะต้องเรียนรู้เกี่ยวกับโค้ดหรือหาผู้พัฒนาที่จะทำเพื่อคุณ และอ่านว่า Q /
ไกเซอร์

display_namewp_usersเป็นคอลัมน์ใน คำถามสองข้ออยู่ในใจ 1: นี่เป็นการเปลี่ยนแปลงล่าสุดของสกีมาฐานข้อมูลหรือไม่ 2: สามารถใช้เป็นค่าsearch_columnsแทนการสืบค้นเมตาได้หรือไม่
henrywright

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