web-dev-qa-db-ja.com

表示名またはその一部でワードプレスのユーザーを検索する方法を教えてください。

提供された検索に関連するものをすべて表示する検索ページを作成する必要があります。すなわち、それを含むcommentseventspostsCPTs、およびusers、その名前です。

サイト内で姓または名に検索フレーズが含まれているユーザーを検索するにはどうすればよいですか。

11
hannit cohen

メインテーブルを検索する

検索引数を付けて 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_emailsearch引数に存在する場合は@
  • ID引数が数値の場合はuser_loginおよびsearch
  • searchストリングにuser_urlまたはhttp://が含まれている場合はhttps://
  • 文字列が存在する場合は... user_loginおよびuser_nicename

これらすべてのデフォルトは、nosearch_columns引数が指定されている場合にのみ設定されます。

メタテーブルを検索する

例えばfirst_namelast_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']を使って検索したいと思うかもしれない別の何かかもしれません。それを正しくエスケープし、文字列の最初と最後から不要な空白を削除するようにしてください。

relationキーがあるので、これはarray( array() )であることを覚えておいてください。単一のキーを検索するだけの場合は、次のように入力するほうが簡単な場合があります。

$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();

最終問い合わせ

結果{mightは次のようになります。

$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();
21
kaiser

これは私の代わりにkaiserの答えを助けてくれました: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/

しかし、この解決策では$wpdb->escape($usermeta_keys)関数がエラーを生成したので、私は単に$usermeta_keysを使いました。

0
Harkály Gergő