Anzahl der Knoten nach Typ [geschlossen]


39

Ich suche nach einem Snippet, mit dem ich die Gesamtanzahl für einen bestimmten Knotentyp anzeigen kann, z. B. "Pages = 167" oder "Products = 10630".

Welchen Code soll ich verwenden, um dies zu erreichen?

Antworten:


34

Hier ist eine Funktion, die die Anzahl der Knoten für einen bestimmten Inhaltstyp zurückgibt:

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

Um diesen Code in Ihrem Design zu verwenden, fügen Sie die Funktion zu Ihrem hinzu, template.phpund dann können Sie die Funktion wie folgt aufrufen:

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

56

Sie können dazu das Modul Ansichten verwenden.

  1. Erstellen Sie eine neue Ansicht, entfernen Sie Sortieroptionen, Felder und andere Standardeinstellungen
  2. Fügen Sie ein Feld für "Inhalt: Typ" hinzu
  3. Erweitern Sie den Teil "Erweitert" auf der rechten Seite und setzen Sie "Aggregation verwenden" auf "Ja".
  4. Füge ein weiteres Feld für "Inhalt: Typ" hinzu
  5. Klicken Sie im zweiten Feld "Inhalt: Typ" auf "Aggregationseinstellungen".
  6. Setze den Aggregationstyp auf "count"
  7. Der zweite "Inhalt: Typ" sollte jetzt wie folgt aussehen: "COUNT (Inhalt: Typ)"

Das sollte es sein! Passen Sie bei Bedarf weitere Einstellungen wie Feldbeschriftungen und Zeilenstileinstellungen an.

Hier ist ein Export einer solchen Ansicht, damit Sie sie leicht importieren und ausprobieren können:

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

Das sieht für die Serverleistung zu "schwer" aus.
Fedir RYKHTIK

7
@Fedir, wenn Sie das glauben, müssen Sie mehr über das Modul "Ansichten" erfahren. Hierbei handelt es sich lediglich um eine exportierte Konfiguration, und das Festlegen von Eigenschaften für ein Objekt belastet den Server überhaupt nicht. Es ist richtig, dass das Views-Modul insgesamt mehr Ressourcen als ein benutzerdefinierter Block beansprucht, aber es ist nichts, was der kleinste gemeinsam genutzte Server nicht verarbeiten kann. Es gibt gute Gründe, Ansichten auf Ihrer Website zu verwenden: Wartbarkeit, Sicherheit, schnellere Entwicklung und Caching-Optionen. Benutzerdefinierter Code ist auch in Ordnung, aber verwerfen Sie Ansichten nicht, nur weil ein Export 81 Zeilen dauert.
Marcvangend

3
Ich bin damit einverstanden, dass das Modul Ansichten in vielen Situationen sehr nützlich sein kann. Für die aktuelle Aufgabe verwende ich eine einfache Abfrage, um das Objekt zu zählen, da es leichter wird. Ich mag es nicht über Kopf zu fahren, wo ich es schneller könnte.
Fedir RYKHTIK

11

Die bevorzugte programmatische Methode ist die Verwendung der EntityFieldQuery-Klasse . Erfahren Sie, warum EntityFieldQuery db_query () überlegen ist .

Hier ist ein Beispiel für das Zählen von Knoten des Typs 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();

Siehe ähnliche Frage .


7

Ich habe das mit EntityFieldQuery gemacht.

$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 muss leider alle Knoten aus den Datenbanken abrufen und dann zählen, wie viele es gibt. Das ist also wirklich schwer. Verwenden Sie die obigen Ansichten oder SQL-Antworten, da diese viel leichter sind.
Mario Awad

5

Die Verwendung von Drush ist einfach und schnell.

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'

Dies ergibt eine Ausgabe ähnlich der folgenden:

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

Und wenn Sie nach einem bestimmten Typ filtern möchten, verwenden Sie einfach grep wie folgt:

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

Für alle Interessierten besteht eine andere Lösung darin, die countQuery- Methode der SelectQuery- Klasse (über db_select ) zu verwenden.

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

Ich bevorzuge jedoch die EntityFieldQuery-Lösung von timofey. Ich biete dies nur als vernünftige Alternative an.


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;

Verwenden Sie diese Abfrage in Ihrem Code


0

Das Knotentyp- Zählmodul macht das Gleiche wie Sie.

Dieses Modul wird verwendet, um die Anzahl der Knoten eines bestimmten Inhaltstyps sowie die Anzahl der Benutzer eines bestimmten Rollentyps anzuzeigen.

Dieses Modul wird nur für statistische und Entwicklungszwecke verwendet.


0

Als Abwandlung der Antwort zum Verwenden des Moduls " Ansichten " können Sie die Ansicht verwenden, die mit dem Modul "Diagramme" geliefert wird. Einfach installieren / aktivieren, keine zusätzliche Konfiguration, Codierung usw. erforderlich. Weitere Details zu dieser Ansicht finden Sie in den Standardbeispielen (Zitat aus diesem Link):

... charts/examples/viewsin Ihrer Site zu navigieren . Sie sollten dann ein Säulendiagramm und ein Kreisdiagramm sehen, auf die auch eine tabellarische Anzeige folgt. Sowohl Diagramme als auch die Tabellendarstellung enthalten Daten zur Gesamtzahl der Knoten für jeden verfügbaren Inhaltstyp.

Anmerkungen:

  • Als Bonus erhalten Sie neben dem Tabellenformat auch ein Diagramm, mit dem Sie die Anzahl der Knoten nach Inhaltstyp visualisieren können.
  • Wenn Ihnen die Ansicht gefällt und / oder Sie der gewünschten Ansicht nahe kommt, können Sie die Ansicht auch klonen und dann das Diagrammmodul wieder deaktivieren.

Offenlegung: Ich bin der Betreuer dieses Moduls.
Ich hoffe, dies verstößt nicht gegen die Richtlinie der Website zur Eigenwerbung .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.