Liczba węzłów według typu [zamknięte]

39

Szukam fragmentu, który pozwala mi wyświetlić łączną liczbę dla określonego typu węzła, np. „Strony = 167” lub „Produkty = 10630”.

Jakiego kodu powinienem użyć, aby to osiągnąć?

Diane
źródło

Odpowiedzi:

34

Oto funkcja, która zwróci liczbę węzłów dla określonego typu treści:

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

Aby użyć tego kodu w motywie, dodaj funkcję do swojego, template.phpa następnie możesz wywołać funkcję w następujący sposób:

echo 'Pages: ' . YOURTHEME_get_node_count('page');
echo 'Products: ' . YOURTHEME_get_node_count('product');
Kod cyklonowy
źródło
56

W tym celu możesz użyć modułu Widoki .

  1. Utwórz nowy widok, usuń opcje sortowania, pola i inne ustawienia domyślne
  2. Dodaj pole „Treść: Typ”
  3. Rozwiń „zaawansowaną” część po prawej stronie i ustaw „Użyj agregacji” na „Tak”
  4. Dodaj kolejne pole „Treść: Typ”
  5. W drugim polu „Treść: Typ” kliknij „Ustawienia agregacji”
  6. Ustaw typ agregacji na „liczyć”
  7. Drugi „Content: Type” powinien teraz wyglądać jak „COUNT (Content: Type)”

To powinno być to! W razie potrzeby dostosuj więcej ustawień, takich jak etykiety pól i ustawienia stylu wiersza.

Oto eksport takiego widoku, dzięki czemu można go łatwo zaimportować i wypróbować:

$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
źródło
Wygląda to na „ciężkie” dla wydajności serwera.
Fedir RYKHTIK
7
@Fedir, jeśli tak uważasz, musisz dowiedzieć się więcej o module Widoki. Jest to tylko wyeksportowana konfiguracja, a ustawienie właściwości obiektu nie jest wcale obciążeniem dla serwera. Prawdą jest, że moduł Widoki jako całość będzie zużywał więcej zasobów niż blok niestandardowy, ale nie jest to nic, czego nie mógłby obsłużyć najmniejszy serwer współdzielony. Istnieją dobre powody, aby korzystać z widoków w całej witrynie: łatwość konserwacji, bezpieczeństwo, szybszy rozwój i opcje buforowania. Kod niestandardowy też jest w porządku, ale nie odrzucaj widoków tylko dlatego, że eksport zajmuje 81 linii.
marcvangend
3
Zgadzam się, moduł Widoki może być bardzo przydatny w wielu sytuacjach. W bieżącym zadaniu użyję prostego zapytania, aby policzyć obiekt, ponieważ będzie on lżejszy. Nie lubię napinać się tam, gdzie mógłbym to zrobić szybciej.
Fedir RYKHTIK
11

Preferowanym, programowym sposobem jest użycie klasy EntityFieldQuery . Dowiedz się, dlaczego EntityFieldQuery jest lepszy od db_query () .

Oto przykład liczenia węzłów typu 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();

Zobacz podobne pytanie .

timofey.com
źródło
7

Zrobiłem to za pomocą 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
źródło
3
EntityFieldQuery niestety będzie musiał pobrać wszystkie węzły z baz danych, a następnie policzyć, ile ich jest. To jest naprawdę ciężkie. Użyj widoków lub odpowiedzi SQL powyżej, które są znacznie lżejsze.
Mario Awad
5

Korzystanie z Drush jest proste i szybkie.

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'

Daje to wynik podobny do:

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

A jeśli chcesz filtrować według określonego typu, po prostu użyj grep w następujący sposób:

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 パ ト シ
źródło
3

Dla każdego, kto jest zainteresowany, innym rozwiązaniem jest użycie countQuery sposobu SelectQuery klasy (poprzez db_select ).

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

Jednak wolę rozwiązanie EntityFieldQuery opublikowane przez timofey. Podaję to jedynie jako rozsądnie rozsądną alternatywę.

jęczący
źródło
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;

Użyj tego zapytania w swoim kodzie

Adeel Nawaz
źródło
0

Count Typ węzła moduł tak samo jak ty wymagać.

Ten moduł służy do wyświetlania liczby węzłów określonego typu treści, a także liczby użytkowników określonego typu roli.

Ten moduł będzie wykorzystywany wyłącznie do celów statystycznych i programistycznych.

DEVARAJ JOHNSON
źródło
0

Jako odmianę odpowiedzi na temat korzystania z modułu Widoki , możesz „użyć” widoku dostarczonego z modułem Wykresy . Wystarczy go zainstalować / włączyć, bez potrzeby dodatkowej konfiguracji, kodowania itp. Kilka dodatkowych szczegółów na temat tego widoku, zawartych w przykładach „od razu po wyjęciu z pudełka” (cytat z tego linku):

... przejdź do charts/examples/viewsswojej witryny. Powinieneś zobaczyć wykres kolumnowy i wykres kołowy, po których następuje również wyświetlanie tabelaryczne. Zarówno wykresy, jak i wyświetlanie tabeli zawierają dane o łącznej liczbie węzłów dla każdego z dostępnych typów treści.

Uwagi:

  • Jako bonus, oprócz formatu tabelarycznego, otrzymujesz również wykres, który wizualizuje liczbę węzłów według typu zawartości.
  • Jeśli podoba ci się widok i / lub jest on bliski temu, co chcesz, możesz również sklonować widok, a następnie po prostu ponownie wyłączyć moduł Wykresy.

Ujawnienie: Jestem opiekunem tego modułu,
mam nadzieję, że nie narusza to zasad witryny dotyczących autopromocji .

Pierre.Vriens
źródło