Conteggio dei nodi per tipo [chiuso]


39

Sto cercando uno snippet che mi consenta di visualizzare il conteggio totale per un tipo di nodo specifico, ad esempio "Pagine = 167" o "Prodotti = 10630."

Quale codice dovrei usare per raggiungere questo obiettivo?

Risposte:


34

Ecco una funzione che restituirà il numero di nodi per un tipo di contenuto specifico:

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

Per usare questo codice nel tuo tema, aggiungi la funzione al tuo template.phpe poi puoi chiamare la funzione in questo modo:

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

56

È possibile utilizzare il modulo Visualizzazioni per farlo.

  1. Crea una nuova vista, rimuovi le opzioni di ordinamento, i campi e altre impostazioni predefinite
  2. Aggiungi un campo per "Contenuto: tipo"
  3. Espandi la parte "avanzata" sulla destra e imposta "Usa aggregazione" su "Sì"
  4. Aggiungi ancora un altro campo per "Contenuto: Tipo"
  5. Nel secondo campo "Contenuto: tipo", fai clic su "Impostazioni aggregazione"
  6. Imposta il tipo di aggregazione su "count"
  7. Il secondo "Contenuto: Tipo" ora dovrebbe apparire come "COUNT (Contenuto: Tipo)"

Dovrebbe essere! Se necessario, modifica alcune altre impostazioni come le etichette dei campi e le impostazioni dello stile di riga.

Ecco un'esportazione di tale vista, quindi puoi importarla facilmente e provarla:

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

Questo sembra "pesante" per le prestazioni del server.
Fedir RYKHTIK il

7
@Fedir, se lo pensi, devi saperne di più sul modulo Views. Questa è solo una configurazione esportata e l'impostazione delle proprietà su un oggetto non è affatto pesante sul server. È vero che il modulo Views nel suo insieme utilizzerà più risorse di un blocco personalizzato, ma non è nulla che il server condiviso più piccolo non sia in grado di gestire. Esistono buoni motivi per utilizzare le visualizzazioni in tutto il sito: manutenibilità, sicurezza, sviluppo più rapido e opzioni di memorizzazione nella cache. Anche il codice personalizzato va bene, ma non scartare le visualizzazioni solo perché un'esportazione richiede 81 righe.
marcvangend,

3
Sono d'accordo, il modulo Views potrebbe essere abbastanza utile in molte situazioni. Per l'attività corrente, userò una semplice query per contare l'oggetto, poiché sarà più leggero. Non mi piace sovraccarico dove potrei farlo più velocemente.
Fedir RYKHTIK il

11

Il modo programmatico preferito è utilizzare la classe EntityFieldQuery . Scopri perché EntityFieldQuery è superiore a db_query () .

Ecco un esempio del conteggio dei nodi di 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();

Vedere domanda simile .


7

L'ho fatto 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
Purtroppo EntityFieldQuery dovrà recuperare tutti i nodi dai database e quindi contare quanti ce ne sono. Quindi questo è davvero pesante. Usa le viste o le risposte SQL sopra sono molto più leggere.
Mario Awad,

5

L'uso di Drush è semplice e veloce.

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'

Questo dà un output simile 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 poi se vuoi filtrare per un tipo specifico, usa grep in questo modo:

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

Per chi è interessato, un'altra soluzione è quella di utilizzare il countQuery metodo della SelectQuery classe (via db_select ).

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

Tuttavia, preferisco la soluzione EntityFieldQuery pubblicata da timofey. Sto solo fornendo questo come un'alternativa ragionevolmente ragionevole.


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;

Usa questa query nel tuo codice


0

Il modulo di conteggio Tipo di nodo fa lo stesso di quanto richiesto.

Questo modulo viene utilizzato per mostrare un conteggio di nodi di un determinato tipo di contenuto e anche un numero di utenti di un determinato tipo di ruolo.

Questo modulo verrà utilizzato solo a fini statistici e di sviluppo.


0

Come variante alla risposta sull'utilizzo del modulo Viste , è possibile "utilizzare" la vista fornita con il modulo Grafici . Basta installarlo / abilitarlo, non sono necessarie ulteriori configurazioni, codifiche, ecc. Alcuni dettagli in più su questa vista, inclusi negli esempi preconfigurati (citazione da questo link):

... vai al charts/examples/viewstuo sito. Dovresti quindi vedere un grafico a colonne e un grafico a torta, che sono seguiti anche da una visualizzazione tabulare. Sia i grafici che la visualizzazione della tabella contengono dati sul numero totale di nodi per ciascuno dei tipi di contenuto disponibili.

Gli appunti:

  • Come bonus, oltre al formato tabulare, ottieni anche un grafico per visualizzare il numero di nodi per tipo di contenuto.
  • Se ti piace la vista e / o è vicina a ciò che desideri, puoi anche clonare la vista e quindi disabilitare nuovamente il modulo Grafici.

Divulgazione: sono il manutentore di questo modulo,
spero che ciò non violi la politica del sito sull'autopromozione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.