web-dev-qa-db-ja.com

表示名でユーザーを検索するための最も効率的な方法は何ですか?

最初はget_users()を使うと思いましたが、display_nameフィールドはサポートしていませんでした。それから私はWP_User_Queryを使用することについて読みました、しかし、私がそれをするとき、それは常に134217728バイトの許容されたメモリサイズを使い果たします。メモリ制限を解除すると、ページのこの部分はロードされません。今、私は再びget_users()を使えるように、全員のdisplay_nameをユーザーのメタに追加する関数を実行することを考えています。それは良い考えですか?

私の目的は検索も関連性でソートすることです。そして、explode(' ', $search_query)を使用して配列の各要素に対してget_users()を呼び出し、それから結果を次のように組み合わせてソートします。 https: //stackoverflow.com/questions/2176626/php-get-element-with-5-highest-occurrence-in-an-array そしてそれがメモリ効率の良いものになるかどうかはよくわかりません。

読んでくれてありがとう。

4
Nadroev

私はあなたがこの仕事のためにデフォルトのクラスを使うべきだと思います - WP_User_Query 。クエリには多くの可能性があり、表示名も取得します。 WP_User_Queryは、WordPressデータベーステーブルの_users_usermetaを照会することを可能にするクラスです。

値にキャッシュを使用するときにも役立ちます。また、WordPressのデフォルトのWP_Cache(Non-Persistent Cache)または一時的なAPI(Database-Driven Temporarily Persistent Cache)をお勧めします。

以下の例はWP_Cacheを使ってこれを実演します、あなたはトランジェントでこれをすることもできます。コードは機能しません、説明するためにスクラッチで書くだけです。

function wpse_get_user_data( $args ) {


    if ( ! $user_query = wp_cache_get( $args->ID, 'your_key' ) ) {
        $user_query = array();
        $user_query = new WP_User_Query( $args );

        wp_cache_add( $args-ID, $user_query, 'your_key' );
    }

    return $user_query;
}
2
bueltge

WP_User_queryを通して "検索"を押すと、user_loginフィールドとuser_nicenameフィールドの両方を検索します。それは事実上の非効率的なORクエリを生成します。フィルタを使用して検索をuser_nicenameフィールドのみに強制することで、これを減らすことができます。

add_filter('user_search_columns','nicename_only_wpse_188846');

function nicename_only_wpse_188846($search_columns) {
  return array('user_nicename');
}

$args = array(
  'search' => 'abce',
);

// The Query
$user_query = new WP_User_Query( $args );
var_dump($user_query);

それをキャッシュと組み合わせれば、あなたは打撃を受けるかもしれません。

それでも、134217728バイトは、ユーザーとトラフィックが多い場合はかなりスリムです。あなただけのサーバーのアップグレードが必要な場合があります。

1
s_ha_dum