web-dev-qa-db-fra.com

Obtenir les catégories les plus publiées de l'utilisateur

Je travaille sur la liste de tous les utilisateurs similaires à la page Users ici sur SE.

Lorsque je liste chaque utilisateur, je souhaite ajouter les 2 catégories dans lesquelles il a le plus publié. Toutes les catégories sont dans Posts.

La performance est essentielle, c'est pourquoi j'ai mis au point une solution suffisante:

  1. Créez une fonction (avec $user_id en tant qu'argument) qui renvoie le nom de catégorie des deux catégories les plus publiées de l'utilisateur.
  2. Créez un wp_schedule_event() quotidien _ WP Cron qui utilise la fonction ci-dessus et obtient toutes les catégories respectives des utilisateurs et l'ajoute enfin aux métadonnées de chaque utilisateur via add_user_meta().
  3. Obtenez simplement les catégories des utilisateurs via get_user_meta() sur la page Utilisateurs.

Actuellement, j'ai les codes cron et métadonnées prêts, il ne me manque que la fonction qui renvoie les 2 premières catégories d'utilisateurs . Pouvez-vous aider avec cette fonction?

2
Christine Cooper

Cela peut être fait facilement avec $wpdb, voici mon approche:

function GetTop2CategoryByUser($user_id, $taxonomy){
    global $wpdb;

    $results=$wpdb->get_results( $wpdb->prepare( 
     "
       SELECT      tt.term_id as category, COUNT(p.ID) as count
       FROM        $wpdb->posts p

       JOIN        $wpdb->term_relationships tr 
                   ON p.ID = tr.object_id

       JOIN        $wpdb->term_taxonomy tt
                   ON tt.term_taxonomy_id = tr.term_taxonomy_id
                   AND (tt.taxonomy = %s AND tt.term_taxonomy_id != 1)

       WHERE       p.post_author = %s
       GROUP BY    tt.term_id
       ORDER BY    count DESC LIMIT 2
    ",
    $taxonomy,
    $user_id
   ) );
 return $results;
}

// Get user's top 2 published categories
$user_top_cat = GetTop2CategoryByUser($user_ID,$taxonomy)

// $results should return
Array
(
    [0] => stdClass Object
        (
            [term_id] => 4
            [count] => 8345
        )
    [1] => stdClass Object
        (
            [term_id] => 3
            [count] => 45345
        )
)

Il est légèrement plus rapide de récupérer l'ID de la catégorie au lieu des noms.

1
Erevald
<?php 

  $key = 'user_top_categories'; // User meta key for the top categories
  $single = false; // Array or String
  $top_categories = get_user_meta( $user_id, $key, $single );

  foreach($top_categories as $top_cat){

     $term = get_term_by('name', $top_cat, 'category');
     $term_link = get_term_link( $term );

     echo '<li><a href="' . esc_url( $term_link ) . '">' . $term->name . 
          ' ('. $term->count .')</a></li>';

  }

?>
0
Erevald