Intereting Posts
как сделать пользовательский обработчик ajax? Несколько тем во вложенной папке в \ wp-content \ themes \ Как проверить имя пользователя и пароль без входа в систему Как проверить доступность имени пользователя с помощью ajax при регистрации Использовать одиночную запись блога в качестве главной страницы сайта без перенаправления WooCommerce Добавить в корзину не работает Предупреждение при попытке изменить / добавить пользовательский тип сообщения Как настроить WordPress, чтобы иметь возможность использовать тег <script> внутри сообщений? Извлеките изображение из содержимого, назначьте его как признак, а затем удалите его из содержимого Как синхронизировать роли в Multisite? Изменение размеров изображения для темы для мобильных устройств удалить автоматически созданные страницы из меню? Функция WPMU get_blog_details, last_updated / зарегистрированная и форматирование строки времени и даты Изменение пользовательского post_type при публикации Передача переменной из файла шаблона в файл плагина

Количество сообщений в категории, включая категории детей

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

function wp_get_cat_postcount($id) { $cat = get_category_by_slug( $id ); $count = (int)$cat->count; $taxonomy = 'category'; $args = array( 'child_of' => $id, ); $tax_terms = get_terms($taxonomy,$args); foreach ($tax_terms as $tax_term) { $count +=$tax_term->count; } return $count; } 

Функция, которую вы используете, скремблирована и не имеет большого смысла. Кроме того, он очень статичен, поскольку вы не можете возвращать счет в соответствии с пользовательскими параметрами, такими как тип сообщения, статус сообщения или настраиваемое поле. Другое дело отметить, что если сообщение принадлежит термину и одному из его детских терминов, сообщение будет засчитываться дважды, так что вы получите счет в почтовом отправлении, который больше, чем у вас на самом деле.

IMHO, я просто воспользуюсь пользовательским запросом, чтобы сделать динамическую функцию и возвращать истинный счет вместо раздутого из-за сообщений, принадлежащих родительскому и дочернему терминам.

ИДЕЯ

У параметра tax_query есть параметр include_children , который по умолчанию имеет значение true . Этот параметр будет включать все дочерние термины терминов, переданных параметру terms , поэтому он будет возвращать сообщения из переданных терминов и всех его дочерних элементов.

Во-вторых, нам нужно только запросить одно сообщение, чтобы получить сообщение. WP_Query умолчанию WP_Query , он будет продолжать поиск в db для сопоставления сообщений, даже если он уже нашел требуемые сообщения, определяющие запрос. Это делается для вычисления разбивки на страницы, и количество всех этих сообщений, соответствующих запросу, сохраняется в $found_posts объекта запроса.

Чтобы сэкономить на вызовах db и потратить время на это, мы также просто WP_Post поле ID сообщения, а не полный объект WP_Post .

КОД

Прежде всего, несколько заметок

  • Код не проверен и может быть ошибкой. Обязательно сначала проверьте это на локальной тестовой установке с включенной отладкой

  • Для этого кода требуется минимум PHP 5.4

Я прокомментирую код, когда я пойду, чтобы вы могли следить и понимать, что произойдет

 /** * Funtion to get post count from given term or terms and its/their children * * @param (string) $taxonomy * @param (int|array|string) $term Single integer value, or array of integers or "all" * @param (array) $args Array of arguments to pass to WP_Query * @return $q->found_posts * */ function get_term_post_count( $taxonomy = 'category', $term = '', $args = [] ) { // Lets first validate and sanitize our parameters, on failure, just return false if ( !$term ) return false; if ( $term !== 'all' ) { if ( !is_array( $term ) ) { $term = filter_var( $term, FILTER_VALIDATE_INT ); } else { $term = filter_var_array( $term, FILTER_VALIDATE_INT ); } } if ( $taxonomy !== 'category' ) { $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING ); if ( !taxonomy_exists( $taxonomy ) ) return false; } if ( $args ) { if ( !is_array ) return false; } // Now that we have come this far, lets continue and wrap it up // Set our default args $defaults = [ 'posts_per_page' => 1, 'fields' => 'ids' ]; if ( $term !== 'all' ) { $defaults['tax_query'] = [ [ 'taxonomy' => $taxonomy, 'terms' => $term ] ]; } $combined_args = wp_parse_args( $args, $defaults ); $q = new WP_Query( $combined_args ); // Return the post count return $q->found_posts; } 

ПРИМЕНЕНИЕ

Вы можете использовать эту функцию следующими способами

ДЕЛО 1

Единый срок ( термин ID 21 ) с таксономией категории по умолчанию

 $count = get_term_post_count( 'category', 21 ); echo $count; 

CASE 2

Массив терминов ids с пользовательской таксономией my_taxonomy

 $count = get_term_post_count( 'my_taxonomy', [21, 41, 52] ); echo $count; 

CASE 3

Единый термин из таксономии категории по умолчанию из пользовательского типа сообщения cpt и сообщения о статусе

 $args = [ 'post_type' => 'cpt', 'post_status' => 'trash' ]; $count = get_term_post_count( 'category', 21, $args ); echo $count; 

ИСПОЛЬЗОВАНИЕ 4

Если вам нужно получить количество сообщений от всех членов данной таксономии, просто установите параметр $term для всех

 $count = get_term_post_count( 'category', 'all' ); echo $count;