Nombre de nœuds par type [fermé]


39

Je recherche un extrait qui me permet d'afficher le nombre total pour un type de nœud spécifique, par exemple "Pages = 167" ou "Produits = 10630".

Quel code dois-je utiliser pour y parvenir?

Réponses:


34

Voici une fonction qui renverra le nombre de nœuds pour un type de contenu spécifique:

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

Pour utiliser ce code dans votre thème, ajoutez la fonction dans votre template.phpet vous pouvez ensuite appeler la fonction comme ceci:

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

56

Vous pouvez utiliser le module Vues pour le faire.

  1. Créer une nouvelle vue, supprimer les options de tri, les champs et autres paramètres par défaut
  2. Ajouter un champ pour "Contenu: Type"
  3. Développez la partie "avancée" sur la droite et définissez "Utiliser l'agrégation" sur "Oui"
  4. Ajouter encore un autre champ pour "Contenu: Type"
  5. Dans le deuxième champ "Contenu: Type", cliquez sur "Paramètres d'agrégation".
  6. Définissez le type d'agrégation sur "count"
  7. La seconde "Content: Type" devrait maintenant ressembler à "COUNT (Content: Type)"

Ça devrait être ça! Si nécessaire, ajustez d'autres paramètres tels que les étiquettes de champs et les paramètres de style de ligne.

Voici une exportation d'une telle vue, vous pouvez donc facilement l'importer et l'essayer:

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

Cela semble trop "lourd" pour les performances du serveur.
Fedir RYKHTIK

7
@ Fedir, si vous pensez cela, vous devez en savoir plus sur le module Views. Ceci est juste une configuration exportée et la définition des propriétés sur un objet n'est pas lourde sur le serveur. Il est vrai que le module Views dans son ensemble utilisera plus de ressources qu'un bloc personnalisé, mais rien ne peut être géré par le plus petit serveur partagé. Il existe de bonnes raisons d'utiliser des vues sur l'ensemble de votre site: facilité de maintenance, sécurité, développement plus rapide et options de mise en cache. Le code personnalisé convient également, mais ne supprimez pas les vues simplement parce qu’une exportation prend 81 lignes.
Marcvangend

3
Je suis d'accord, le module Vues pourrait être très utile dans de nombreuses situations. Pour la tâche en cours, je vais utiliser une requête simple pour compter l'objet, car ce sera plus clair. Je n'aime pas trop me laisser faire plus vite.
Fedir RYKHTIK

11

La méthode de programmation préférée consiste à utiliser la classe EntityFieldQuery . Découvrez pourquoi EntityFieldQuery est supérieur à db_query () .

Voici un exemple de comptage de nœuds de type 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();

Voir la question similaire .


7

J'ai fait cela en utilisant 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
EntityFieldQuery devra malheureusement extraire tous les nœuds des bases de données, puis compter le nombre de nœuds existants. Donc c'est vraiment lourd. Utilisez les vues ou les réponses SQL ci-dessus, elles sont beaucoup plus claires.
Mario Awad

5

Utiliser Drush est simple et rapide.

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'

Cela donne une sortie similaire à:

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

Et si vous voulez filtrer par un type spécifique, utilisez simplement grep comme ceci:

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

Pour ceux qui sont intéressés, une autre solution consiste à utiliser la méthode countQuery de la classe SelectQuery (via db_select ).

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

Cependant, je préfère la solution EntityFieldQuery publiée par timofey. Je ne propose cela que comme une alternative raisonnablement raisonnable.


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;

Utilisez cette requête dans votre code


0

Le type de noeud module de fait la même chose que vous souhaitez.

Ce module est utilisé pour afficher le nombre de nœuds d’un type de contenu particulier ainsi que le nombre d’utilisateurs d’un type de rôle particulier.

Ce module sera utilisé uniquement à des fins statistiques et de développement.


0

En variante de la réponse à propos de l’utilisation du module Vues , vous pouvez "utiliser" la vue fournie avec les graphiques. module . Il suffit de l'installer / de l'activer, aucune configuration supplémentaire, codage, etc. n'est nécessaire. Quelques détails supplémentaires sur cette vue, inclus dans les exemples prêts à l'emploi (citation tirée de ce lien):

... aller vers charts/examples/views dans votre site. Vous devriez alors voir un diagramme à colonnes et un diagramme à secteurs, suivis d'un affichage sous forme de tableau. Les graphiques et l'affichage de la table contiennent des données sur le nombre total de nœuds pour chacun des types de contenu disponibles.

Remarques:

  • En plus du format tabulaire, vous obtenez également un graphique permettant de visualiser le nombre de nœuds par type de contenu.
  • Si vous aimez la vue et / ou si elle est proche de ce que vous voulez, vous pouvez également cloner la vue, puis simplement désactiver à nouveau le module Graphiques.

Divulgation: je suis le responsable de ce module,
j'espère que cela n'enfreint pas la politique du site sur l'auto-promotion .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.