Đếm các nút theo loại [đóng]


39

Tôi đang tìm một đoạn mã cho phép tôi hiển thị tổng số đếm cho một loại nút cụ thể, ví dụ: "Pages = 167" hoặc "Products = 10630."

Tôi nên sử dụng mã nào để đạt được điều này?

Câu trả lời:


34

Đây là một hàm sẽ trả về số lượng nút cho một loại nội dung cụ thể:

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

Để sử dụng mã này trong chủ đề của bạn, hãy thêm chức năng vào template.phpvà sau đó bạn có thể gọi hàm như thế này:

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

56

Bạn có thể sử dụng mô-đun Views để làm điều này.

  1. Tạo chế độ xem mới, xóa tùy chọn sắp xếp, trường và các cài đặt mặc định khác
  2. Thêm một trường cho "Nội dung: Loại"
  3. Mở rộng phần "nâng cao" ở bên phải và đặt "Sử dụng tổng hợp" thành "Có"
  4. Thêm một trường khác cho "Nội dung: Loại"
  5. Trên trường "Nội dung: Loại" thứ hai, nhấp vào "Cài đặt tổng hợp"
  6. Đặt loại tổng hợp thành "đếm"
  7. "Nội dung: Loại" thứ hai bây giờ trông giống như "COUNT (Nội dung: Loại)"

Đó nên là nó! Nếu cần, hãy điều chỉnh một số cài đặt khác như nhãn trường và cài đặt kiểu hàng.

Đây là một bản xuất của một khung nhìn như vậy, vì vậy bạn có thể dễ dàng nhập nó và dùng thử:

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

Điều đó có vẻ "nặng" cho hiệu suất máy chủ.
Fedir RYKHTIK

7
@Fedir, nếu bạn nghĩ vậy, bạn cần tìm hiểu thêm về mô-đun Lượt xem. Đây chỉ là cấu hình được xuất và thiết lập các thuộc tính trên một đối tượng không nặng trên máy chủ. Đúng là toàn bộ mô-đun Lượt xem sẽ sử dụng nhiều tài nguyên hơn một khối tùy chỉnh, nhưng không có gì mà máy chủ chia sẻ nhỏ nhất không thể xử lý. Có nhiều lý do tốt để sử dụng lượt xem trên toàn trang web của bạn: khả năng bảo trì, bảo mật, phát triển nhanh hơn và các tùy chọn bộ đệm. Mã tùy chỉnh cũng tốt, nhưng không loại bỏ Lượt xem chỉ vì quá trình xuất mất 81 dòng.
marcvangend

3
Tôi đồng ý, mô-đun Lượt xem có thể khá hữu ích trong nhiều tình huống. Đối với tác vụ hiện tại, tôi sẽ sử dụng truy vấn đơn giản để đếm đối tượng, vì nó sẽ nhẹ hơn. Tôi không thích ở trên cao, nơi tôi có thể nhanh hơn.
Fedir RYKHTIK

11

Cách lập trình ưa thích là sử dụng lớp EntityFieldQuery . Tìm hiểu tại sao EntityFieldQuery vượt trội hơn db_query () .

Đây là một ví dụ về việc đếm các nút kiểu 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();

Xem câu hỏi tương tự .


7

Tôi đã làm điều này bằng cách sử dụng 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
Thật không may EntityFieldQuery sẽ phải tìm nạp tất cả các nút từ cơ sở dữ liệu và sau đó đếm xem có bao nhiêu nút ở đó. Vì vậy, điều này thực sự nặng nề. Sử dụng các khung nhìn hoặc các câu trả lời SQL ở trên chúng nhẹ hơn nhiều.
Mario Awad

5

Sử dụng Drush rất đơn giản và nhanh chóng.

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'

Điều này cho đầu ra tương tự như:

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

Và sau đó nếu bạn muốn lọc theo một loại cụ thể, chỉ cần sử dụng grep như thế này:

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

Đối với bất kỳ ai quan tâm, một giải pháp khác là sử dụng phương thức CountQuery của lớp SelectQuery (thông qua db_select ).

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

Tuy nhiên, tôi thích giải pháp EntityFieldQuery được đăng bởi timofey. Tôi chỉ cung cấp điều này như là một thay thế hợp lý hợp lý.


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;

Sử dụng truy vấn này trong mã của bạn


0

Các số Node Loại mô-đun làm tương tự như bạn yêu cầu.

Mô-đun này được sử dụng để Hiển thị số lượng nút của một loại nội dung cụ thể và số lượng Người dùng của loại vai trò cụ thể.

Mô-đun này sẽ chỉ được sử dụng cho mục đích thống kê và phát triển.


0

Là một biến thể của câu trả lời về việc sử dụng mô-đun Lượt xem , bạn có thể "sử dụng" chế độ xem đi kèm với mô-đun Biểu đồ . Đơn giản chỉ cần cài đặt / kích hoạt nó, không cần cấu hình bổ sung, mã hóa, v.v. Một số chi tiết khác về chế độ xem này, được bao gồm trong các ví dụ bên ngoài (trích dẫn từ liên kết này):

... điều hướng đến charts/examples/viewstrong trang web của bạn. Sau đó, bạn sẽ thấy biểu đồ cột và biểu đồ hình tròn, theo sau là màn hình bảng. Cả biểu đồ và bảng hiển thị đều chứa dữ liệu về tổng số nút cho từng loại nội dung có sẵn.

Ghi chú:

  • Là một phần thưởng, ngoài định dạng bảng, bạn còn có một biểu đồ để trực quan hóa số lượng nút theo loại nội dung.
  • Nếu bạn thích chế độ xem và / hoặc nó gần với những gì bạn muốn, bạn cũng có thể sao chép chế độ xem và sau đó chỉ cần vô hiệu hóa mô-đun Biểu đồ một lần nữa.

Tiết lộ: Tôi là người duy trì mô-đun này,
tôi hy vọng điều này không vi phạm chính sách của trang web về tự quảng cáo .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.