Hitungan node berdasarkan jenis [ditutup]

39

Saya mencari cuplikan yang memungkinkan saya menampilkan jumlah total untuk jenis simpul tertentu, misalnya "Halaman = 167" atau "Produk = 10630."

Kode apa yang harus saya gunakan untuk mencapai ini?

Diane
sumber

Jawaban:

34

Berikut adalah fungsi yang akan mengembalikan jumlah node untuk jenis konten tertentu:

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

Untuk menggunakan kode ini dalam tema Anda, tambahkan fungsi ke dalam Anda template.phpdan kemudian Anda dapat memanggil fungsi seperti ini:

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

Anda dapat menggunakan modul Views untuk melakukan ini.

  1. Buat tampilan baru, hapus opsi sortir, bidang dan pengaturan default lainnya
  2. Tambahkan bidang untuk "Konten: Ketik"
  3. Luaskan bagian "lanjutan" di sebelah kanan dan atur "Gunakan agregasi" menjadi "Ya"
  4. Tambahkan bidang lain untuk "Konten: Ketik"
  5. Pada bidang "Konten: Jenis" kedua, klik "Pengaturan agregasi"
  6. Setel jenis agregasi ke "hitung"
  7. "Konten: Jenis" yang kedua sekarang akan terlihat seperti "COUNT (Konten: Jenis)"

Seharusnya begitu! Jika perlu, sesuaikan beberapa pengaturan lagi seperti label bidang dan pengaturan gaya baris.

Ini adalah ekspor dari tampilan seperti itu, sehingga Anda dapat dengan mudah mengimpornya dan mencobanya:

$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
sumber
Itu terlihat "berat" untuk kinerja server.
Fedir RYKHTIK
7
@ Fedir, jika Anda berpikir begitu, Anda perlu mempelajari lebih lanjut tentang modul Views. Ini hanya konfigurasi yang diekspor dan pengaturan properti pada objek tidak berat sama sekali pada server. Memang benar bahwa modul Views secara keseluruhan akan menggunakan lebih banyak sumber daya daripada blok khusus, tetapi bukan apa-apa yang tidak bisa ditangani oleh server bersama terkecil. Ada alasan bagus untuk menggunakan tampilan di seluruh situs Anda: rawatan, keamanan, pengembangan lebih cepat, dan opsi caching. Kode kustom juga baik-baik saja, tetapi jangan membuang Tampilan hanya karena ekspor membutuhkan 81 baris.
marcvangend
3
Saya setuju, modul Views bisa sangat berguna dalam banyak situasi. Untuk tugas saat ini, saya akan menggunakan kueri sederhana untuk menghitung objek, karena akan lebih ringan. Saya tidak suka overhead di mana saya bisa lebih cepat.
Fedir RYKHTIK
11

Cara terprogram yang disukai, adalah dengan menggunakan kelas EntityFieldQuery . Pelajari mengapa EntityFieldQuery lebih unggul daripada db_query () .

Berikut adalah contoh penghitungan Nodes dari tipe 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();

Lihat pertanyaan serupa .

timofey.com
sumber
7

Saya melakukan ini menggunakan 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
sumber
3
EntityFieldQuery sayangnya harus mengambil semua node dari database dan kemudian menghitung berapa banyak yang ada di sana. Jadi ini sangat berat. Gunakan pandangan atau jawaban SQL di atas jauh lebih ringan.
Mario Awad
5

Menggunakan Drush sederhana dan cepat.

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'

Ini menghasilkan output yang mirip dengan:

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

Dan kemudian jika Anda ingin memfilter berdasarkan tipe tertentu, gunakan saja grep seperti ini:

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 パ ト シ
sumber
3

Bagi siapa saja yang tertarik, solusi lain adalah menggunakan metode countQuery dari kelas SelectQuery (via db_select ).

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

Namun, saya lebih suka solusi EntityFieldQuery yang diposting oleh timofey. Saya hanya menyediakan ini sebagai alternatif yang cukup masuk akal.

tomcant
sumber
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;

Gunakan kueri ini dalam kode Anda

Adi
sumber
0

The Node Type count modul melakukan hal yang sama seperti yang Anda butuhkan.

Modul ini digunakan untuk Menampilkan jumlah node dari tipe konten tertentu dan juga jumlah Pengguna dari tipe peran tertentu.

Modul ini akan digunakan hanya untuk keperluan statistik dan pengembangan.

DEVARAJ JOHNSON
sumber
0

Sebagai variasi dari jawaban tentang menggunakan modul Views , Anda bisa "menggunakan" tampilan yang menyertai modul Charts . Cukup instal / aktifkan, tidak perlu konfigurasi tambahan, coding, dll. Beberapa detail lebih lanjut tentang tampilan ini, termasuk dalam contoh Out-of-the-box (kutipan dari tautan ini):

... arahkan ke charts/examples/viewssitus Anda. Anda kemudian akan melihat diagram kolom dan diagram lingkaran, yang juga diikuti oleh tampilan tabular. Baik grafik dan tampilan tabel berisi data tentang jumlah total node untuk masing-masing jenis konten yang tersedia.

Catatan:

  • Sebagai bonus, selain dari format tabular, Anda juga mendapatkan bagan untuk memvisualisasikan jumlah node berdasarkan tipe konten.
  • Jika Anda suka tampilan, dan / atau dekat dengan apa yang Anda inginkan, Anda mungkin juga mengkloning tampilan, dan kemudian cukup menonaktifkan modul Charts lagi.

Pengungkapan: Saya adalah pengelola modul ini,
saya harap ini tidak melanggar kebijakan situs tentang promosi diri .

Pierre
sumber