Подсчет сообщений данного типа сообщения, имеющего определенную таксономию?

(Примечание модератора: оригинальное название было, "Как знать количество пользовательских сообщений типа, имеющих определенную таксономию"),

Я застреваю с функцией wp_count_posts()!

Я создал пользовательские названные типы сообщения 'artwork' отобразить иллюстрации в галерее. Я также создал пользовательскую названную таксономию 'artworkcat' отсортировать каждые иллюстрации в определенную категорию ('webdesign', 'logo', 'print').

Я хотел бы использовать wp_count_posts() знать, сколько сообщений у меня есть использование 'artwork' пользовательский тип сообщения, в определенной категории.

Если это не ясно, я даю Вам практический пример: Я хотел бы знать, сколько сообщений я имею в этом 'artwork' пользовательский тип сообщения, с 'artworkcat' таксономией, названной 'webdesign'.

Делает wp_count_posts() работа для этого, добавляя некоторые параметры?

Спасибо за справку!

3
29.10.2010, 13:53
4 ответа

wp_count_posts() не будет работать на это, это не принимает параметр таксономии. Можно сделать следующее:

$taxonomy = 'artworkcat';
$term_slug = 'webdesign';
$post_type = 'artwork';

$term = get_term_by( 'slug', $term_slug, $taxonomy_type );

$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy
ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->posts.post_type = $post_type
AND $wpdb->term_taxonomy.taxonomy = $taxonomy
AND $wpdb->term_taxonomy.term_id = {$term->term_id};"));

Для получения списка терминов в таксономии использовать get_terms(). Например: get_terms('artworkcat')

2
19.02.2020, 22:15
  • 1
    Спасибо за справку sorich87. Я просто не знаю, как использовать этот $count. Это собирается возвратить массив или значение? –   28.10.2010, 20:37
  • 2
    Добро пожаловать. Это возвратит значение. –  sorich87 28.10.2010, 20:41
  • 3
    Это является лучшим - низкий ресурс способ сделать это. –  Sagive SEO 16.09.2017, 01:25

Код Sorich является большим, если Вы - удобные SQL-запросы управления. Если Вы создали бы простой запрос, можно использовать get_posts() возвратить массив сообщения возражает, что соответствуют желаемым параметрам запроса и считают их одновременно, возвращая значение. Я использовал это для подсчета всех видов комбинаций, поскольку легко изменить.

$args = array(
    'post_type' => 'artwork',
    'post_status' => 'any',
    'genre' => 'romantic'
);
$num = count( get_posts( $args ) );

Измените post_status аргумент, чтобы "опубликовать", если Вы только хотите считать опубликованные объекты.

И если у Вас есть Запрос Несколько плагин Taxonomies установленным scribu, можно добавить несколько taxonomies к args...

2
19.02.2020, 22:15

Ответ @somatic является, вероятно, лучшим для большинства сайтов; это является, конечно, самым простым. И если Вы очень довольны SQL, можно использовать ответ @sorich87. Или можно использовать мое гибридное решение ниже.

Был очень похожий вопрос, который задают на прошлой неделе (определенно читает ответ на тот вопрос прежде, чем прочитать ответ, я уехал в Вас здесь):

Взятие ответа от этого и изменение его немного, Вы получаете вызов, которые похожи на это:

$post_counts = CountPostsForPostTypeAndCategory::count('artwork','artworkcat');
foreach($post_counts as $post_counts) {
  echo "{$post_counts->term_name}: {$post_counts->post_count}<br/>";
}

И вот то, что класс, который можно скопировать в тему functions.php файл или использование в .php файл плагина Вы могли бы писать. Это - вероятно, излишество (и вероятно чрезмерно сложный) для Ваших потребностей, но в случае, если Вы хотите гибридное решение, это должно дать Вам, хотят Вас, хотят и если у Вас есть много сообщений (сотни?) это будет работать лучше, чем загрузка всех сообщений в массив только, чтобы смочь считать их:

class CountPostsForPostTypeAndCategory {
  static $term_ids;
  static $taxonomy;
  static function count($post_type,$taxonomy) {
    self::$taxonomy = $taxonomy;

    add_action('posts_fields',array(__CLASS__,'posts_fields'));
    add_action('posts_where',array(__CLASS__,'posts_where'));
    add_action('posts_join',array(__CLASS__,'posts_join'));
    add_action('posts_groupby',array(__CLASS__,'posts_groupby'));

    $term_ids = get_terms($taxonomy,'fields=ids');
    $query = new WP_Query(array(
      'post_type' => $post_type,
      'posts_per_page' => '-1',
      'category__in' => $term_ids,
    ));

    remove_action('posts_fields',$array(__CLASS__,'posts_fields'));
    remove_action('posts_where',array(__CLASS__,'posts_where'));
    remove_action('posts_join',array(__CLASS__,'posts_join'));
    remove_action('posts_groupby',array(__CLASS__,'posts_groupby'));

    return $query->posts;
  }
  static function posts_where($where) {
    global $wpdb;
    $taxonomy = self::$taxonomy;
    $where = preg_replace("#({$wpdb->term_taxonomy}.taxonomy) = 'category'#","\\1 = '{$taxonomy}'",$where);
    return $where;
  }
  static function posts_join($join) {
    global $wpdb;
    $join .= " INNER JOIN {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id ";
    return $join;
  }
  static function posts_groupby($groupby) {
    global $wpdb;
    $groupby = " {$wpdb->posts}.post_type, {$wpdb->terms}.term_id";
    return $groupby;
  }
  static function posts_fields($field_list) {
    global $wpdb;
    $field_list =<<<SQL
{$wpdb->terms}.term_id,
{$wpdb->terms}.name AS term_name,
{$wpdb->terms}.slug AS term_slug,
COUNT(*) as post_count
SQL;
    return $field_list;
  }
}

Пара вещей объяснить. WP_Query() не позволяет нам запросить для списка идентификаторов термина таксономии, но он действительно позволяет нам запросить для списка категории ID. Но что такое категории? Они - названная таксономия 'category'? Вот почему я настроил WP_Query() для запросов по категориям идентификаторов с помощью таксономии называют идентификаторы, но затем я выполняю в строковой замене posts_where сцепитесь с заменой 'category' с '{$taxonomy}', или в Вашем случае с 'artworkcat'.

Вся явная сложность вокруг add_action() и remove_action() должен просто позволить Вам только использовать те рычаги, когда Вам нужны они а не оставить их кладущий вокруг, где они могли потенциально влиять на Ваши другие запросы.

0
19.02.2020, 22:15

Телесный имел самый чистый ответ, но пропустил одну вещь. Необходимо указать numberposts, чтобы быть-1 так, чтобы он считал их всех. Как это:

$args = array(
    'post_type' => 'artwork',
    'post_status' => 'published',
    'genre' => 'romantic',
    'numberposts' => -1
);
$num = count( get_posts( $args ) );

просто замените рода своим кратким заголовком таксономии и романтичный с конкретным термином.

3
19.02.2020, 22:15
  • 1
    Если Вы используете этот код, который отлично подходит для его цели, необходимо измениться 'published' кому: 'publish', это 'post_status => 'publish', –  Malachy 17.08.2014, 15:18

Теги

Похожие вопросы