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:
$user_id
en tant qu'argument) qui renvoie le nom de catégorie des deux catégories les plus publiées de l'utilisateur.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()
.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?
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.
<?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>';
}
?>