จำนวนโหนดตามประเภท [ปิด]


39

ฉันกำลังมองหาตัวอย่างที่ให้ฉันแสดงจำนวนทั้งหมดสำหรับประเภทโหนดที่ระบุเช่น "Pages = 167" หรือ "Products = 10630"

ฉันควรใช้รหัสใดเพื่อให้บรรลุสิ่งนี้

คำตอบ:


34

นี่คือฟังก์ชั่นที่จะคืนจำนวนโหนดสำหรับประเภทเนื้อหาที่ระบุ:

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

ในการใช้รหัสนี้ในชุดรูปแบบของคุณให้เพิ่มฟังก์ชันลงในของคุณtemplate.phpจากนั้นคุณสามารถเรียกใช้ฟังก์ชันดังนี้:

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

56

คุณสามารถใช้โมดูลViewsเพื่อทำสิ่งนี้

  1. สร้างมุมมองใหม่ลบตัวเลือกการเรียงฟิลด์และการตั้งค่าเริ่มต้นอื่น ๆ
  2. เพิ่มฟิลด์สำหรับ "เนื้อหา: ประเภท"
  3. ขยายส่วน "ขั้นสูง" ทางด้านขวาและตั้ง "ใช้การรวม" เป็น "ใช่"
  4. เพิ่มฟิลด์อื่นสำหรับ "เนื้อหา: ประเภท"
  5. ในฟิลด์ "เนื้อหา: ประเภท" ที่สองคลิก "การตั้งค่าการรวม"
  6. ตั้งค่าประเภทการรวมเป็น "นับ"
  7. ตอนนี้ "เนื้อหา: ประเภท" ที่สองควรมีลักษณะเหมือน "COUNT (เนื้อหา: ประเภท)"

นั่นควรจะเป็น! หากจำเป็นให้ปรับการตั้งค่าเพิ่มเติมเช่นป้ายฟิลด์และการตั้งค่าสไตล์แถว

นี่คือการส่งออกมุมมองดังกล่าวเพื่อให้คุณสามารถนำเข้าและลองใช้งานได้อย่างง่ายดาย:

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

ดูเหมือนว่า "หนัก" สำหรับประสิทธิภาพของเซิร์ฟเวอร์
Fedir RYKHTIK

7
@Fedir ถ้าคุณคิดว่าคุณต้องเรียนรู้เพิ่มเติมเกี่ยวกับโมดูล Views นี่เป็นเพียงการส่งออกการกำหนดค่าและการตั้งค่าคุณสมบัติบนวัตถุไม่หนักบนเซิร์ฟเวอร์เลย เป็นความจริงที่โมดูล Views โดยรวมจะใช้ทรัพยากรมากกว่าบล็อกที่กำหนดเอง แต่ไม่มีสิ่งใดที่เซิร์ฟเวอร์ที่ใช้ร่วมกันที่เล็กที่สุดไม่สามารถจัดการได้ มีเหตุผลที่ดีที่จะใช้มุมมองทั่วทั้งไซต์ของคุณ: การบำรุงรักษาความปลอดภัยการพัฒนาที่เร็วขึ้นและตัวเลือกแคช รหัสที่กำหนดเองก็ใช้ได้เช่นกัน แต่อย่าทิ้งการดูเพียงเพราะการส่งออกใช้เวลา 81 บรรทัด
marcvangend

3
ฉันเห็นด้วยโมดูล Views อาจมีประโยชน์ในหลาย ๆ สถานการณ์ สำหรับงานปัจจุบันฉันจะใช้การค้นหาง่าย ๆ เพื่อนับวัตถุเพราะมันจะเบากว่า ฉันไม่ชอบค่าใช้จ่ายที่ฉันสามารถทำได้เร็วขึ้น
Fedir RYKHTIK

11

ที่ต้องการวิธีการเขียนโปรแกรมคือการใช้ระดับ EntityFieldQuery เรียนรู้ว่าทำไมEntityFieldQuery จะดีกว่า db_query ()

นี่คือตัวอย่างของการนับโหนดของประเภทบล็อก

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

ดูคำถามที่คล้ายกัน


7

ฉันทำสิ่งนี้โดยใช้ 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 น่าเสียดายที่จะต้องดึงข้อมูลโหนดทั้งหมดจากฐานข้อมูลแล้วนับว่ามีจำนวนเท่าใด นี่มันหนักจริงๆ ใช้มุมมองหรือคำตอบ SQL ด้านบนซึ่งเบากว่ามาก
Mario Awad

5

การใช้ Drush นั้นง่ายและรวดเร็ว

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'

สิ่งนี้ให้ผลลัพธ์คล้ายกับ:

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

และถ้าคุณต้องการตัวกรองตามประเภทเฉพาะให้ใช้ grep ดังนี้:

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

สำหรับผู้ที่สนใจวิธีอื่นคือใช้วิธีcountQueryของคลาสSelectQuery (ผ่านdb_select )

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

อย่างไรก็ตามฉันชอบโซลูชัน EntityFieldQuery ที่โพสต์โดย timofey ฉันให้สิ่งนี้เป็นทางเลือกที่สมเหตุสมผลเท่านั้น


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;

ใช้แบบสอบถามนี้ในรหัสของคุณ


0

นับโหนดประเภทโมดูลทำเช่นเดียวกับที่คุณต้องการ

โมดูลนี้ใช้เพื่อแสดงจำนวนโหนดของประเภทเนื้อหาเฉพาะและจำนวนผู้ใช้ที่มีประเภทบทบาทเฉพาะ

โมดูลนี้จะถูกใช้เพื่อวัตถุประสงค์ทางสถิติและการพัฒนาเท่านั้น


0

เนื่องจากความแตกต่างของคำตอบเกี่ยวกับการใช้โมดูลViewsคุณสามารถ "ใช้" มุมมองที่มาพร้อมกับโมดูลCharts เพียงติดตั้ง / เปิดใช้งานไม่ต้องมีการกำหนดค่าเพิ่มเติมการเข้ารหัสและอื่น ๆ ที่จำเป็น รายละเอียดเพิ่มเติมเกี่ยวกับมุมมองนี้รวมอยู่ในตัวอย่างนอกกรอบ (อ้างจากลิงค์นี้):

... นำทางไปยังcharts/examples/viewsไซต์ของคุณ จากนั้นคุณควรเห็นแผนภูมิคอลัมน์และแผนภูมิวงกลมซึ่งตามด้วยการแสดงตาราง ทั้งแผนภูมิและตารางแสดงข้อมูลเกี่ยวกับจำนวนโหนดทั้งหมดสำหรับแต่ละประเภทเนื้อหาที่มีอยู่

หมายเหตุ:

  • เป็นโบนัสนอกเหนือจากรูปแบบตารางคุณยังได้รับแผนภูมิเพื่อแสดงจำนวนโหนดตามประเภทเนื้อหา
  • หากคุณชอบมุมมองและ / หรือใกล้เคียงกับสิ่งที่คุณต้องการคุณอาจคัดลอกมุมมองจากนั้นปิดการใช้งานโมดูล Charts อีกครั้ง

การเปิดเผยข้อมูล: ฉันเป็นผู้ดูแลโมดูลนี้
ฉันหวังว่านี่จะไม่ละเมิดนโยบายของไซต์เกี่ยวกับการโปรโมตตนเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.