0

カスタム投稿タイプのみを作成できる「ユーザーロール」と呼ぶカスタムユーザーロールがあります。多くのカテゴリでcptと呼びます。

私が取得しようとしているのは、ページごとに20人のユーザーを表示するページ(ページネーションがあります)と、次の情報(2つ以上の投稿が公開されているユーザーのみを表示する必要があります):
1)これによって公開されたcpt投稿の総数user
2) このユーザーが公開したカテゴリ 1 および 2 の投稿の合計数

WordPress get_users 関数を使用してこれを達成し、ロールとして「user-role」を持つすべての作成者を取得してから、count_many_users_posts() を使用してこの見つかったユーザーをループスローし、各ユーザーによる投稿の総数を取得してから、新しい WP_Query を使用しました最初の著者 ID を持ち、指定されたカテゴリに属しているすべての投稿を取得します。新しい foreach スローを使用すると、これは投稿に続きます。ユーザーごとに見つかった投稿の数を数えていました。

ソリューションを2人のユーザーに制限すると、ロジックが機能するようです。

問題: スクリプトの実行が遅すぎ、ユーザー数が非常に多い (約 3k) ため、別のループ内で 2 つのループを実行すると、これが機能するには遅すぎます。

私が考えていたのは、カスタムクエリを使用して、指定されたユーザーロールのusermetaテーブルと内部結合されたusersテーブルを選択して、必要なロールのユーザーIDのみを取得し、このすべてのクエリ内部がpostsテーブルと再び結合されることでした。 post_type = cpt の公開投稿のみを取得し、返された行をカウントします。

可能であれば、上記は term_relationships テーブルに応じて結果を再度フィルター処理するクエリと結合され、カテゴリ 1,2 の投稿のみをカウントします (これは投稿の総数に返される必要があります)。

私が試したがうまくいかなかったもの(結果は返されませんが、結合とwhere句を正しく使用しているとは本当に思いません)は次のとおりです。

SELECT $wpdb->users.id, count(*) FROM $wpdb->users 
INNER JOIN $wpdb->usermeta on $wpdb->users.id = $wpdb->usermeta.user_id 
    WHERE $wpdb->usermeta.meta_key = 'wp_capabilities' 
    AND meta_value RLIKE '[[:<:]]user-role[[:>:]]' 
INNER JOIN $wpdb->posts on $wpdb->users.id = $wpdb->posts.post_author 
    WHERE $wpdb->posts.post_type = "cpt" AND $wpdb->posts.post_status = "publish"
    having count(*)>2

上記にどれだけ近いかはわかりませんが、これは特定のロールユーザーのすべての投稿を1つのクエリでカウントするために構築できるものです。これに、投稿のカウントを追加したいと思います上記のカテゴリ (カテゴリの用語 ID をハードコードできるため、この ecuation で $wpdb->term_relationships 以外の他のテーブルを取得する必要はありません)

したがって、上記から $ids と count(*) を取得した後、結果は次のように $wpdb->term_relationships で再度内部結合する必要があると考えています。

INNER JOIN $wpdb->term_relationships on $wpdb->term_relationships.object_id = $wpdb->posts.id 
    WHERE term_taxonomy_id IN (1,2)

これは私が思いついたものですが、これに対する標準的な解決策はありますか? それとも、Wordpress のデータベースと WordPress の機能は、この時点でこのような大規模なデータ セットをカバーしていないのでしょうか?

4

1 に答える 1