Contagem de nós por tipo [fechado]

39

Estou procurando um trecho que permita exibir a contagem total de um tipo de nó específico, por exemplo, "Páginas = 167" ou "Produtos = 10630".

Qual código devo usar para conseguir isso?

Diane
fonte

Respostas:

34

Aqui está uma função que retornará o número de nós para um tipo de conteúdo específico:

function YOURTHEME_get_node_count($content_type) {
  $query = 'SELECT COUNT(*) ' .
           'FROM {node} n ' .
           'WHERE n.type = :type';
  return db_query($query, array(
      ':type' => $content_type
  ))->fetchField();
}

Para usar esse código no seu tema, adicione a função no seu template.phpe, em seguida, você pode chamar a função assim:

echo 'Pages: ' . YOURTHEME_get_node_count('page');
echo 'Products: ' . YOURTHEME_get_node_count('product');
Cyclonecode
fonte
56

Você pode usar o módulo Views para fazer isso.

  1. Crie uma nova visualização, remova opções de classificação, campos e outras configurações padrão
  2. Adicione um campo para "Conteúdo: Tipo"
  3. Expanda a parte "avançada" à direita e defina "Usar agregação" para "Sim"
  4. Adicione ainda outro campo para "Conteúdo: Tipo"
  5. No segundo campo "Conteúdo: Tipo", clique em "Configurações de agregação"
  6. Defina o tipo de agregação para "contar"
  7. O segundo "Conteúdo: Tipo" agora deve se parecer com "COUNT (Conteúdo: Tipo)"

Deve ser isso! Se necessário, ajuste mais algumas configurações, como rótulos de campo e configurações de estilo de linha.

Aqui está uma exportação dessa visualização, para que você possa importá-la e experimentá-la facilmente:

$view = new view;
$view->name = 'nodecounts';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'Node counts';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'Node counts';
$handler->display->display_options['group_by'] = TRUE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['query']['options']['query_comment'] = FALSE;
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'none';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
$handler->display->display_options['row_options']['inline'] = array(
  'type_1' => 'type_1',
  'type' => 'type',
);
$handler->display->display_options['row_options']['separator'] = ': ';
$handler->display->display_options['row_options']['hide_empty'] = 0;
$handler->display->display_options['row_options']['default_field_elements'] = 1;
/* Field: Content: Type */
$handler->display->display_options['fields']['type_1']['id'] = 'type_1';
$handler->display->display_options['fields']['type_1']['table'] = 'node';
$handler->display->display_options['fields']['type_1']['field'] = 'type';
$handler->display->display_options['fields']['type_1']['label'] = '';
$handler->display->display_options['fields']['type_1']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['absolute'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['external'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['replace_spaces'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['trim_whitespace'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['nl2br'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['type_1']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['type_1']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['trim'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['html'] = 0;
$handler->display->display_options['fields']['type_1']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['type_1']['element_default_classes'] = 1;
$handler->display->display_options['fields']['type_1']['hide_empty'] = 0;
$handler->display->display_options['fields']['type_1']['empty_zero'] = 0;
$handler->display->display_options['fields']['type_1']['hide_alter_empty'] = 1;
$handler->display->display_options['fields']['type_1']['link_to_node'] = 0;
$handler->display->display_options['fields']['type_1']['machine_name'] = 0;
/* Field: COUNT(Content: Type) */
$handler->display->display_options['fields']['type']['id'] = 'type';
$handler->display->display_options['fields']['type']['table'] = 'node';
$handler->display->display_options['fields']['type']['field'] = 'type';
$handler->display->display_options['fields']['type']['group_type'] = 'count';
$handler->display->display_options['fields']['type']['label'] = '';
$handler->display->display_options['fields']['type']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['type']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['type']['alter']['absolute'] = 0;
$handler->display->display_options['fields']['type']['alter']['external'] = 0;
$handler->display->display_options['fields']['type']['alter']['replace_spaces'] = 0;
$handler->display->display_options['fields']['type']['alter']['trim_whitespace'] = 0;
$handler->display->display_options['fields']['type']['alter']['nl2br'] = 0;
$handler->display->display_options['fields']['type']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['type']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['type']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['type']['alter']['trim'] = 0;
$handler->display->display_options['fields']['type']['alter']['html'] = 0;
$handler->display->display_options['fields']['type']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['type']['element_default_classes'] = 1;
$handler->display->display_options['fields']['type']['hide_empty'] = 0;
$handler->display->display_options['fields']['type']['empty_zero'] = 0;
$handler->display->display_options['fields']['type']['hide_alter_empty'] = 1;
$handler->display->display_options['fields']['type']['separator'] = '';
$handler->display->display_options['fields']['type']['format_plural'] = 0;

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block');
Marcvangend
fonte
Isso parece "pesado" para o desempenho do servidor.
Fedir RYKHTIK
7
@Fedir, se você pensa assim, precisa aprender mais sobre o módulo Views. Isso é apenas a configuração exportada e a definição de propriedades em um objeto não é pesada no servidor. É verdade que o módulo Views como um todo usará mais recursos do que um bloco personalizado, mas não é nada que o menor servidor compartilhado não possa suportar. Existem boas razões para usar as visualizações em todo o site: manutenção, segurança, opções mais rápidas de desenvolvimento e armazenamento em cache. O código personalizado também é bom, mas não descarta as Views apenas porque uma exportação leva 81 linhas.
marcvangend
3
Estou de acordo, o módulo Views pode ser bastante útil em muitas situações. Para a tarefa atual, usarei uma consulta simples para contar o objeto, pois será mais leve. Eu não gosto de sobrecarregar onde eu poderia mais rápido.
Fedir RYKHTIK
11

A maneira programática preferida é usar a classe EntityFieldQuery . Saiba por que EntityFieldQuery é superior a db_query () .

Aqui está um exemplo de contagem de nós do tipo Blog.

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node') // grab nodes
->entityCondition('bundle', 'blog') // filter by blog type
->propertyCondition('status', 1) // filter by published
->count(); // count

$result = $query->execute();

Veja pergunta semelhante .

timofey.com
fonte
7

Eu fiz isso usando EntityFieldQuery.

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
    /* this is the content type machine name */
    ->entityCondition('bundle', 'product')
    /* You can set extra properties using fieldCondition and properties with propertyCondition */
    ->fieldCondition('field_product_status', 'tid', key(taxonomy_get_term_by_name('New')))
    ;

$result = $query->execute();
if (isset($result['node'])){
    $count_of_new_product_nodes = count($result['node']); 
}
Coomie
fonte
3
Infelizmente, o EntityFieldQuery precisará buscar todos os nós dos bancos de dados e contar quantos existem. Então isso é realmente pesado. Use as visualizações ou as respostas SQL acima, pois elas são muito mais leves.
Mario Awad
5

Usar Drush é simples e rápido.

drush sqlq 'select count(node.nid) as node_count, node_type.type from node inner join node_type on node.type = node_type.type group by node_type.type'

Isso fornece uma saída semelhante a:

node_count  type
17  category_2012
20  category_2013
19  category_2014
3   competition
19  entry_2012_breakthrough
89  entry_2012_digitalother
50  entry_2012_directdirect
19  entry_2012_filmsecscn
17  entry_2012_insights
12  entry_2012_outdoor
31  entry_2012_promo
19  entry_2013_breakthrough
100 entry_2013_digitalother
40  entry_2013_directdirect

E então, se você deseja filtrar por um tipo específico, use grep como este:

drush sqlq 'select count(node.nid) as node_count, node_type.type from node inner join node_type on node.type = node_type.type group by node_type.type' | grep 2014
Patoshi パ ト シ
fonte
3

Para quem está interessado, outra solução é usar o countQuery método do SelectQuery classe (via db_select ).

$count = db_select('node')
  ->condition('type', 'some-type')
  ->countQuery()->execute()->fetchField();

No entanto, prefiro a solução EntityFieldQuery publicada por timofey. Só estou fornecendo isso como uma alternativa razoavelmente sensata.

tomcant
fonte
1
SELECT
  COUNT({node}.nid) AS node_count,
  {node_type}.type
FROM {node}
  INNER JOIN {node_type} ON {node}.type = {node_type}.type
GROUP BY {node_type}.type;

Use esta consulta no seu código

Adeel Nawaz
fonte
0

O módulo de contagem de tipo de nó faz o mesmo que você precisar.

Este módulo é usado para Mostrar uma contagem de nós de um tipo de conteúdo específico e também o número de Usuários de um tipo de função específico.

Este módulo será usado apenas para fins estatísticos e de desenvolvimento.

DEVARAJ JOHNSON
fonte
0

Como uma variação da resposta sobre o uso do módulo Views , você pode "usar" a visualização que acompanha o módulo Charts . Simplesmente instale / ative, nenhuma configuração adicional, codificação, etc. são necessários. Mais alguns detalhes sobre essa exibição, incluídos nos exemplos prontos para uso (citação neste link):

... navegue charts/examples/viewsno seu site. Você deve ver um gráfico de colunas e um gráfico de pizza, que são seguidos por uma exibição tabular também. Os gráficos e a exibição da tabela contêm dados sobre o número total de nós para cada um dos tipos de conteúdo disponíveis.

Notas:

  • Como bônus, além do formato tabular, você também recebe um gráfico para visualizar o número de nós por tipo de conteúdo.
  • Se você gosta da vista e / ou está perto do que deseja, também pode cloná-la e desabilitar o módulo Gráficos novamente.

Divulgação: sou o mantenedor deste módulo.
Espero que isso não viole a política de autopromoção do site .

Pierre.Vriens
fonte