[РЕШЕНО] Как вывести количество материалов ОДНОГО термина таксономии?

Главные вкладки

Аватар пользователя kompas kompas 27 апреля 2014 в 22:36

Знаю, что существует несколько решений, где выводятся ВСЕ термины избранного словаря с подсчетом количество материалов в них. Но нигде не нашел способа, как вывести количество материалов лишь одного избранного термина. Думаю для людей, понимающих код друпала - это совсем несложная задача и здесь не нужен какой-либо дополнительный модуль.

Комментарии

Аватар пользователя kompas kompas 28 апреля 2014 в 0:18

Добавил пятёрку, но код заставить заработать пока не смог. Насчет контекста я рассматриваю пока простейший вариант, чтобы можно было вставить код в нужном месте страницы (что-то типа сниппета).

На данный момент тестю в денвере и имею категорию с таким адресом taxonomy/term/1 и одной заметкой в ней. Создал страничку, с поддержкой php и вставил слегка адаптированный код, предложенный RxB:

<?php print taxonomy_term_count_nodes($tid$type 1); ?>

На выходе получаю 0. Что сделал не так?

Аватар пользователя kompas kompas 28 апреля 2014 в 0:58

Теперь считает и хорошая новость состоит в том, что заметки снятые с публикации не учитываются. Но плохая в том, что считаются материалы не только с избранного термина, но походу, и со всех его дочерних категорий. Их можно как-то отсечь при подсчете?

Аватар пользователя drupby drupby 28 апреля 2014 в 1:21

"kompas" wrote:
что считаются материалы не только с избранного термина, но походу, и со всех его дочерних категорий. Их можно как-то отсечь при подсчете?

эта функция считает все материалы вместе с дочерними
подсчитать можно элементарно с помощью Sql запроса

Аватар пользователя kompas kompas 28 апреля 2014 в 1:30

Я понимаю, что для умельцев может и элементарно, потому и решил спросить. Мне нужно посчитать не для себя, а так чтобы скрипт выводил и это видели все. Предложенное решение - половинчатое и годится только для тех сайтов, где нет дочерних категорий. Мне нужно другое более полное решение, которое в итоге возможно пригодится не только мне. Я не видел, чтобы эта тема ещё где-то раскрывалась.

Аватар пользователя drupby drupby 28 апреля 2014 в 2:35

попробуй так

$tid = 1;
$count = db_result(db_query("SELECT COUNT(*) FROM {term_node} tn WHERE tn.tid = %d", $tid));
print $count;

"kompas" wrote:
Я не видел, чтобы эта тема ещё где-то раскрывалась.

слишком элементарное и очевидное решение потому что

"kompas" wrote:
Предложенное решение - половинчатое и годится только для тех сайтов, где нет дочерних категорий.

то есть подсчет количества нод для терминов включая дочерние термины нужен только для сайтов, где нет дочерних терминов?

Аватар пользователя drupby drupby 28 апреля 2014 в 2:19

"ХулиGUN" wrote:
мож всё же так в таком случае? SELECT COUNT(*) FROM {term_node} tn WHERE tn.tid = %d

ты имеешь ввиду добавить алиас таблицы tn.tid? в данном случае без разницы

Аватар пользователя kompas kompas 28 апреля 2014 в 10:40
<?php$tid = 1;
$count = db_result(db_query("SELECT COUNT(*) FROM {term_node} tn WHERE tn.tid = %d", $tid));
print $count;?>

Ну да, сейчас правильно считает, но теперь проблема с неопубликованными материалами - они тоже учитываются, что весьма сбивает с толку.

"drupby" wrote:
то есть подсчет количества нод для терминов включая дочерние термины нужен только для сайтов, где нет дочерних терминов?

Если имеется ввиду первый вариант, то думаю, да. Мне, например, трудно представить зачем кому-то выводить заведомо неправильное количество материалов на сайте. Потому что если мы имеем один материал, а прописан он матрешкой в трех терминах, мы и получаем на выходе 3, что не является правдой.

Аватар пользователя drupby drupby 28 апреля 2014 в 13:24

"kompas" wrote:
Ну да, сейчас правильно считает, но теперь проблема с неопубликованными материалами - они тоже учитываются, что весьма сбивает с толку.

добавьте join c таблицей node и условие по status

$tid = 1;
$status = 1;
$count = db_result(db_query("SELECT COUNT(*) FROM {term_node} tn INNER JOIN {node} n ON tn.nid = n.nid WHERE tn.tid = %d AND n.status = %d", $tid, $status));
print $count;
Аватар пользователя kompas kompas 28 апреля 2014 в 14:15

drupby, большое спасибо! Теперь отлично все работает! По крайней мере в тех тестах что я провел. Неопубликованные и дочерние термины не учитываются.

И я так понимаю

$tid - это номер термина

$status - состояние публикации, где 1 - опубликовано, 0 - не опубликовано.

Аватар пользователя drupby drupby 28 апреля 2014 в 14:44

"kompas" wrote:
$tid - это номер термина
$status - состояние публикации, где 1 - опубликовано, 0 - не опубликовано.

правильно - это можно и без комментариев в коде понять опытным путем