Recuento de nodos por tipo [cerrado]


39

Estoy buscando un fragmento que me permita mostrar el recuento total de un tipo de nodo específico, por ejemplo, "Páginas = 167" o "Productos = 10630".

¿Qué código debo usar para lograr esto?

Respuestas:


34

Aquí hay una función que devolverá el número de nodos para un tipo de contenido 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 este código en su tema, agregue la función en su template.phpy luego puede llamar a la función de esta manera:

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

56

Puede usar el módulo Vistas para hacer esto.

  1. Cree una nueva vista, elimine las opciones de clasificación, los campos y otras configuraciones predeterminadas
  2. Agregue un campo para "Contenido: Tipo"
  3. Expanda la parte "avanzada" a la derecha y establezca "Usar agregación" en "Sí"
  4. Agregue otro campo para "Contenido: Tipo"
  5. En el segundo campo "Contenido: Tipo", haga clic en "Configuración de agregación"
  6. Establezca el tipo de agregación en "contar"
  7. El segundo "Contenido: Tipo" ahora debería verse como "COUNT (Contenido: Tipo)"

Eso debería ser! Si es necesario, ajuste algunas configuraciones más, como etiquetas de campo y configuraciones de estilo de fila.

Aquí hay una exportación de dicha vista, por lo que puede importarla fácilmente y probarla:

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

Eso parece "pesado" para el rendimiento del servidor.
Fedir RYKHTIK

77
@Fedir, si crees eso, necesitas aprender más sobre el módulo Vistas. Esto es solo una configuración exportada y las propiedades de configuración en un objeto no son pesadas en el servidor. Es cierto que el módulo Vistas en su conjunto utilizará más recursos que un bloque personalizado, pero no es nada que el servidor compartido más pequeño no pueda manejar. Hay buenas razones para usar vistas en todo su sitio: mantenimiento, seguridad, desarrollo más rápido y opciones de almacenamiento en caché. El código personalizado también está bien, pero no descarte las Vistas solo porque una exportación toma 81 líneas.
marcvangend

3
Estoy de acuerdo, el módulo Vistas podría ser bastante útil en muchas situaciones. Para la tarea actual, usaré una consulta simple para contar el objeto, ya que será más claro. No me gusta pasar por encima donde podría hacerlo más rápido.
Fedir RYKHTIK

11

La forma programática preferida es utilizar la clase EntityFieldQuery . Descubra por qué EntityFieldQuery es superior a db_query () .

Aquí hay un ejemplo de contar Nodos de 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();

Ver pregunta similar .


7

Hice esto 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']); 
}

3
Lamentablemente, EntityFieldQuery tendrá que buscar todos los nodos de las bases de datos y luego contar cuántos hay. Entonces esto es realmente pesado. Utilice las vistas o las respuestas SQL anteriores son mucho más ligeras.
Mario Awad

5

Usar Drush es simple y 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'

Esto da una salida similar 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

Y luego, si desea filtrar por un tipo específico, simplemente use grep de esta manera:

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

3

Para cualquiera que esté interesado, otra solución es usar el método countQuery de la clase SelectQuery (a través de db_select ).

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

Sin embargo, prefiero la solución EntityFieldQuery publicada por timofey. Solo estoy proporcionando esto como una alternativa razonablemente sensata.


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 en su código


0

El módulo de recuento de tipo de nodo hace lo mismo que necesita.

Este módulo se utiliza para mostrar un recuento de nodos de un tipo de contenido particular y también un número de usuarios de un tipo de rol particular.

Este módulo se utilizará solo con fines estadísticos y de desarrollo.


0

Como una variación de la respuesta sobre el uso del módulo Vistas , puede "usar" la vista que viene con el módulo Gráficos . Simplemente instálelo / habilítelo, no necesita configuración adicional, codificación, etc. Algunos detalles más sobre esta vista, incluidos en los ejemplos listos para usar (cita de este enlace):

... navegue hasta charts/examples/viewsen su sitio. A continuación, debería ver un gráfico de columnas y un gráfico circular, seguidos también de una visualización tabular. Tanto los gráficos como la visualización de la tabla contienen datos sobre el número total de nodos para cada uno de los tipos de contenido disponibles.

Notas:

  • Como beneficio adicional, además del formato tabular, también obtiene un gráfico para visualizar el número de nodos por tipo de contenido.
  • Si le gusta la vista y / o está cerca de lo que desea, también puede clonar la vista y luego deshabilitar nuevamente el módulo Gráficos.

Divulgación: soy el encargado de mantener este módulo,
espero que esto no viole la política de autopromoción del sitio .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.