タイプ別のノード数[クローズ]


39

特定のノードタイプの合計数を表示できるスニペットを探しています。たとえば、「ページ= 167」や「製品= 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. 2番目の[コンテンツ:タイプ]フィールドで、[集計設定]をクリックします
  6. 集計タイプを「カウント」に設定します
  7. 2番目の「Content:Type」は「COUNT(Content:Type)」のようになります。

それはそれであるはずです!必要に応じて、フィールドラベルや行スタイル設定などの設定を調整します。

このようなビューのエクスポートは次のとおりです。簡単にインポートして試すことができます。

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

サーバーのパフォーマンスは「重い」ように見えます。
フェディルRYKHTIK

7
@Fedir、あなたがそう思うなら、Viewsモジュールについてもっと学ぶ必要があります。これはエクスポートされた構成であり、オブジェクトのプロパティ設定はサーバー上ではまったく重くありません。Viewsモジュール全体がカスタムブロックよりも多くのリソースを使用することは事実ですが、最小の共有サーバーが処理できないことは何もありません。サイト全体でビューを使用する正当な理由があります:保守性、セキュリティ、開発の高速化、キャッシュオプション。カスタムコードでも問題ありませんが、エクスポートに81行かかるため、ビューを破棄しないでください。
marcvangend

3
私は、Viewsモジュールが多くの状況で非常に役立つ可能性があることに同意します。現在のタスクでは、オブジェクトが軽くなるため、単純なクエリを使用してオブジェクトをカウントします。もっと速くできるオーバーヘッドは好きではありません。
フェディル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回答を使用すると、はるかに軽量になります。
マリオアワド

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

興味のある人にとって、別の解決策はSelectQueryクラスのcountQueryメソッドを(db_selectを介して)使用することです。

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

ただし、私はtimofeyが投稿したEntityFieldQueryソリューションを好みます。私はこれを合理的に賢明な代替手段としてのみ提供しています。


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.