Mostrando as contagens de postagem do usuário por tipo de postagem personalizada na lista de usuários do administrador?

8

Estou tentando descobrir como conectar-se à página /wp-admin/users.php manage para crie colunas personalizadas para mostrar o número de postagens que os usuários têm para os tipos de postagem personalizados em WPHonors.com .

Eu criei um ticket trac para isso, mas @ nacin explicou porque é mais um trabalho para um plugin fazer.

Não consegui encontrar uma maneira de manipular a saída dos usuários tabela, para que eu possa adicionar colunas personalizadas para contagens de postagens de CPTs para cada usuário. E que pode ter algo a ver com a pergunta @nacin perguntou, o que seria números de contagem de posts vinculados a. Para a atual contagem de postes 'post', um usuário tem links para a página de gerenciamento de postagem, mostrando todas as postagens desse usuário ( /wp-admin/edit.php?author=%author_id% ).

Se eu fosse vinculá-lo em algum lugar, seria:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

Se isso fosse de alguma forma possível, eu acho. Mas eu nem preciso necessariamente vinculá-lo a qualquer lugar. Eu quero mostrar apenas as contagens de postagens de CPT para cada pessoa, com 600 usuários e um total combinado de 300+ postagens em 4 tipos de post personalizado. Os administradores são apenas um que pode enviar 'post' postagens, para que a coluna na página do usuário seja inútil.

    
por jaredwilli 24.10.2010 / 07:47

4 respostas

10

Aqui está uma expansão da resposta do tutorial de Mike. Eu adicionei links para os tipos listados para que você possa clicar em um e ser levado diretamente para uma listagem de todos os posts desse tipo para esse autor, o que exigiu uma variável adicional para $counts e alguma saída extra para $custom_column[]

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    return $column_headers;
}

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
    if ($column_name=='custom_posts') {
        $counts = _yoursite_get_author_post_type_counts();
        $custom_column = array();
        if (isset($counts[$user_id]) && is_array($counts[$user_id]))
            foreach($counts[$user_id] as $count) {
                $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
                // admin_url() . "edit.php?author=" . $user->ID;
                $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
            }
        $custom_column = implode("\n",$custom_column);
        if (empty($custom_column))
            $custom_column = "<th>[none]</th>";
        $custom_column = "<table>\n{$custom_column}\n</table>";
    }
    return $custom_column;
}

function _yoursite_get_author_post_type_counts() {
    static $counts;
    if (!isset($counts)) {
        global $wpdb;
        global $wp_post_types;
        $sql = <<<SQL
        SELECT
        post_type,
        post_author,
        COUNT(*) AS post_count
        FROM
        {$wpdb->posts}
        WHERE 1=1
        AND post_type NOT IN ('revision','nav_menu_item')
        AND post_status IN ('publish','pending', 'draft')
        GROUP BY
        post_type,
        post_author
SQL;
        $posts = $wpdb->get_results($sql);
        foreach($posts as $post) {
            $post_type_object = $wp_post_types[$post_type = $post->post_type];
            if (!empty($post_type_object->label))
                $label = $post_type_object->label;
            else if (!empty($post_type_object->labels->name))
                $label = $post_type_object->labels->name;
            else
                $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
            if (!isset($counts[$post_author = $post->post_author]))
                $counts[$post_author] = array();
            $counts[$post_author][] = array(
                'label' => $label,
                'count' => $post->post_count,
                'type' => $post->post_type,
                );
        }
    }
    return $counts;
}
    
por somatic 24.10.2010 / 18:08
9

Assumindo que eu entendi a pergunta, o que você precisa fazer é ligar os dois ganchos relacionados ao valor de colunas e cabeçalhos de coluna para as páginas de gerenciamento admin. Eles são 'manage_{$type}_columns' e 'manage_{$type}_custom_column' em que no seu caso de uso {$type} é users .

O gancho 'manage_users_columns'

Este primeiro é simples, permite especificar os cabeçalhos das colunas e, portanto, as colunas disponíveis. O WordPress codifica o valor da coluna "Postagens" , portanto, como você deseja alterá-lo, vamos simplesmente removê-lo com unset() e, em seguida, adicionar uma nova coluna com o mesmo título, mas identificador de 'custom_posts' :

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
  unset($column_headers['posts']);
  $column_headers['custom_posts'] = 'Posts';
  return $column_headers;
}

O gancho 'manage_users_custom_column'

Em seguida, você precisa usar o 'manage_users_custom_column' hook, que só é chamado para colunas não padrão. Testamos o $column_name=='custom_posts' para tornar nosso código robusto, no caso de adicionarmos novas colunas de usuário no futuro e, em seguida, pegamos as contagens de tipo de postagem de usuário da função que escrevi _yoursite_get_author_post_type_counts() , que discutirei a seguir. Eu então joguei com algumas maneiras de formatar isso, mas decidi que um HTML <table> era o mais apropriado (já que é uma tabela de dados) . Se uma mesa não funciona para você, suponho que você será capaz de gerar marcações diferentes facilmente:

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
  if ($column_name=='custom_posts') {
    $counts = _yoursite_get_author_post_type_counts();
    $custom_column = array();
    if (isset($counts[$user_id]) && is_array($counts[$user_id]))
      foreach($counts[$user_id] as $count)
        $custom_column[] = "\t<tr><th>{$count['label']}</th>" .
                                 "<td>{$count['count']}</td></tr>";
    $custom_column = implode("\n",$custom_column);
  }
  if (empty($custom_column)) 
    $custom_column = "No Posts!";
  else 
    $custom_column = "<table>\n{$custom_column}\n</table>";
  return $custom_column;
}

Obtendo contagens de registros por tipo de postagem para cada usuário / autor

Por fim, há a recuperação de contagens de postagem por tipo de postagem por autor / usuário. Geralmente eu tento usar WP_Query() ao executar consultas em posts, mas essa consulta teria requerido o uso de muitos outros hooks que pareciam mais fáceis de serem "naughty" e fazer tudo em um.

Eu omiti qualquer postagem de $post->post_type is 'revision' ou 'nav_menu_item' , mas deixei em 'attachments' . Você pode achar melhor incluir explicitamente os tipos de postagem desejados, em vez de excluir os poucos que eu fiz.

Eu também filtrado por $post->post_status para apenas 'publish' e 'pending' . Se você também quiser incluir 'future' , 'private' e / ou 'draft' , será necessário fazer as alterações no código.

Para cada carregamento de página, só chamo essa função _yoursite_get_author_post_type_counts() uma vez e, em seguida, armazeno em uma variável estática em vez de chamar para cada usuário. Eu armazeno em uma matriz indexada por IDs de autor / usuário contendo uma matriz com o nome do tipo de postagem no elemento 'label' e, claro, a contagem em um elemento com o mesmo nome:

function _yoursite_get_author_post_type_counts() {
  static $counts;
  if (!isset($counts)) {
    global $wpdb;
    global $wp_post_types;
    $sql = <<<SQL
SELECT
  post_type,
  post_author,
  COUNT(*) AS post_count
FROM
  {$wpdb->posts}
WHERE 1=1
  AND post_type NOT IN ('revision','nav_menu_item')
  AND post_status IN ('publish','pending')
GROUP BY
  post_type,
  post_author
SQL;
    $posts = $wpdb->get_results($sql);
    foreach($posts as $post) {
      $post_type_object = $wp_post_types[$post_type = $post->post_type];
      if (!empty($post_type_object->label))
        $label = $post_type_object->label;
      else if (!empty($post_type_object->labels->name))
        $label = $post_type_object->labels->name;
      else
        $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
      if (!isset($counts[$post_author = $post->post_author]))
        $counts[$post_author] = array();
      $counts[$post_author][] = array(
        'label' => $label,
        'count' => $post->post_count,
        );
    }
  }
  return $counts;
}

A interface do usuário resultante

E isso é o que parece ser aplicado à minha instalação de teste do WordPress 3.0.1:

Façaodownloaddocódigocompleto

Vocêpode fazer o download do código completo de Gist :

Você pode copiar esse código para o arquivo functions.php do seu tema ou armazenar o arquivo em um plug-in, o que você escolher.

Espero que isso ajude!

    
por MikeSchinkel 24.10.2010 / 09:16
2

O que se segue é uma variação da resposta de sorich87, já que não consegui fazê-lo funcionar e queria suportar vários tipos automaticamente:

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

Eu li em get_posts_by_author_sql() e como ele deve construir uma declaração WHERE para você, mas os resultados que obtive foram sempre "1 = 0". Então eu acabei de escrever o resto da instrução SQL, já que get_posts_by_author_sql() está apenas salvando você ter que escrever dois bits: o tipo de post e o autor:

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

Isso funciona tão bem, e irá adicionar quantas colunas quiser, mas cada uma usa espaço horizontal, enquanto o tutorial de Mike adicionará uma única coluna para os tipos de postagem personalizados e, em seguida, os listará como uma tabela dentro dessa linha. . Mesma informação, visualização diferente. O de Mike provavelmente é melhor para grandes quantidades de tipos, já que constrói uma lista vertical condensada (e exibe apenas um item de contagem se não estiver vazio), enquanto o método de sorich87 é bom para quantidades menores, pois há muito espaço de coluna horizontal disponível. p>

Não esqueça que você pode adicionar "post_status = publish" à consulta para retornar apenas itens publicados, já que o exemplo retorna todos os posts ...

    
por somatic 24.10.2010 / 18:02
1

Os seguintes itens serão adicionados:

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');
    
por sorich87 24.10.2010 / 08:51