web-dev-qa-db-fra.com

Comment répertorier les utilisateurs qui ont écrit des types de publication personnalisés et masquer ceux qui n'en ont pas?

J'essaie de créer une liste d'auteurs qui montrerait tous les auteurs ayant écrit un article de type de message personnalisé et masquerait les auteurs qui n'en auraient aucun. Avec wp_list_authors, il serait facile de montrer aux utilisateurs qui ont écrit des publications (pas des CPT).

Cela ne montre pas les utilisateurs qui ont publié des types de publication personnalisés, cela ne concerne que les publications.

wp_list_authors('hide_empty=1');

J'ai regardé dans la fonction get_users mais je n'ai réussi à construire qu'une liste avec elle (plus de contrôle sur la liste mais pas ce que je cherchais).

 $blog_url = get_bloginfo('home');
 $blogusers = get_users('orderby=display_name&role=editor');
 foreach ($blogusers as $user) {
    echo '<li><a href="' . $blog_url . '/author/' . $user->user_login . '">' . $user->display_name . '</a></li>';
  }

J'ai trouvé ce post vraiment sympa traitant de la manière d'afficher le nombre de posts dans le backend. Il définit une fonction _yoursite_get_author_post_type_counts() qui pourrait peut-être être utile dans ce cas ...

Une idée comment faire ça? Merci! :)

2
any_h

wp_list_authors() , obtient en interne les publications de type post uniquement. Voir la ligne 294 http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/author-template.php#L273

Comme vous l'avez noté, cette réponse est excellente et, moyennant quelques modifications, peut faire ce que vous voulez.

function wpse31443_author_has_custom_post_type( $post_author, $post_type ) {
    global $wp_post_types; // If nonexistent post type found return
    if ( array_intersect((array)$post_type, array_keys($wp_post_types))
        != (array)$post_type ) return false;

    static $posts = NULL; // Cache the query internally
    if ( !$posts ) {
        global $wpdb;

        $sql = "SELECT `post_type`, `post_author`, COUNT(*) AS `post_count`".
            " FROM {$wpdb->posts}".
            " WHERE `post_type` NOT IN ('revision', 'nav_menu_item')".
            " AND `post_status` IN ('publish', 'pending')".
            " GROUP BY `post_type`, `post_author`";

        $posts = $wpdb->get_results( $sql );
    }

    foreach( $posts as $post ) {
        if ( $post->post_author == $post_author
            and in_array( $post->post_type, (array)$post_type )
            and $post->post_count ) return true;
    }

    return false;
}

Vous savez déjà comment get_users , il devrait donc être un jeu d'enfant de configurer une simple boucle foreach et d'insérer les ID utilisateur dans votre nouvelle fonction.

J'ai testé la fonction dans une certaine mesure, elle devrait fonctionner telle quelle, mais peut nécessiter quelques ajustements. Faites-moi savoir si vous avez des questions et/ou comment je peux améliorer ma réponse.

3
soulseekah