Как перечислить пользователей, которые написали пользовательские типы записей, и скрыть тех, которые этого не сделали?


Я пытаюсь создать список авторов, который показывал бы всех авторов, написавших публикацию пользовательского типа, и скрывал авторов, у которых нет записей. С помощью wp_list_authors было бы легко показать пользователям, которые написали сообщения (не CPT).

Здесь не отображаются пользователи, опубликовавшие Пользовательские типы записей, это относится только к публикациям.

wp_list_authors('hide_empty=1');

Я заглянул в функцию get_users, но сумел создать с ее помощью только список (больше контроля над списком, но не над тем, кем я был стремясь к).

 $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>';
  }

Я нашел этот действительно хороший пост , посвященный тому, как показать количество сообщений в бэкэнде. Он определяет функцию _yoursite_get_author_post_type_counts(), которая, возможно, могла бы помочь в этом...

Есть идеи, как это сделать? Спасибо!:)

 2
Author: Community, 2011-10-18

1 answers

wp_list_authors(), внутренне получает сообщения только типа post. См. строку 294 http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/author-template.php#L273

Как вы заметили, этот отличный ответ и с некоторыми изменениями может делать то, что вы хотите.

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;
}

Вы уже знаете, как get_users, таким образом, должно быть проще простого настроить простой цикл foreach и ввести идентификаторы пользователей в вашу новую функцию.

Я проверил функция в какой-то степени должна работать как есть, но может потребоваться некоторая настройка. Дайте мне знать, если у вас есть какие-либо вопросы и/или как я могу улучшить свой ответ.

 3
Author: soulseekah, 2017-04-13 12:37:55