Подсчет постов с определенным значением метаполя

18 июн. 2014 г., 06:11:59
Просмотры: 15.5K
Голосов: 5

Как подсчитать только те записи, которые имеют определенное значение произвольного метаполя?

$productCount = wp_count_posts('product');
echo $productCount->publish;

Этот код выводит общее количество всех записей.

Как узнать, сколько из этих записей имеют, например, значение произвольного поля cat?

0
Все ответы на вопрос 2
1
11

В WordPress нет стандартной/встроенной функции для подсчета записей по определенному мета-значению. wp_count_posts подсчитывает количество записей только по типу записи.

В данном случае может быть полезно использовать WP_Query для создания пользовательского запроса, чтобы получить все записи с указанным мета-значением, а затем использовать $wp_query->found_posts для получения количества записей.

Вот как это можно сделать:

 $query = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'blue' ) );

   echo $query->found_posts;
18 июн. 2014 г. 08:29:20
Комментарии

Этот ответ, вероятно, первое, что приходит в голову. Однако это может оказаться ресурсоемким с точки зрения использования оперативной памяти. В таких случаях лучше использовать SQL-запрос через global $wpdb

Braza Braza
11 мая 2022 г. 20:05:59
1

Вероятно, лучший способ сделать это:

global $wpdb;
$count = $wpdb->get_row("SELECT COUNT(*) AS THE_COUNT FROM $wpdb->postmeta WHERE (meta_key = 'color' AND meta_value = 'blue')");

return $count->THE_COUNT;

Вот набор функций для упрощения использования:

    /**
     * Возвращает количество записей, для которых используется конкретный мета-ключ.
     * Опционально можно указать конкретное значение или массив значений мета-ключа.
     *
     * @param string            $key
     * @param null|string|array $value
     *
     * @return mixed
     */
    function get_meta_count( $key, $value = null) {
        global $wpdb;

        $where = get_meta_where($key, $value);
        $count = $wpdb->get_row("SELECT COUNT(*) AS THE_COUNT FROM $wpdb->postmeta WHERE $where");
        return $count->THE_COUNT;
    }

    /**
     * Возвращает записи postmeta для конкретного мета-ключа.
     * Опционально можно указать конкретное значение или массив значений мета-ключа.
     *
     * @param string            $key
     * @param null|string|array $value
     *
     * @return mixed
     */
    function get_meta ( $key, $value = null) {
        global $wpdb;
        $where = get_meta_where($key, $value);
        return $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE $where");
    }

    /**
     * Возвращает условие WHERE для запроса по мета-ключу
     *
     * @param string            $key
     * @param null|string|array $value
     *
     * @return string
     */
    function get_meta_where( $key, $value) {
        $where = "meta_key = '$key'";

        if (null !== $value) {
            if (\is_array($value)) {
                \array_walk($value,'add_quote');
                $in = \implode(',', $value);  // Разделяем значения запятой
                $where .= " AND meta_value IN ($in)";
            } else {
                $where .= " AND meta_value = '$value'";
            }
        }

        return $where;
    }

    /**
     * Добавляет кавычки вокруг каждого значения в массиве при использовании в качестве callback-функции
     *
     * @param $value
     * @param $key
     */
    function add_quote( &$value, $key)
    {
        $value = "'$value'";
    }
2 дек. 2019 г. 02:00:55
Комментарии

В первой SQL-команде есть опечатка — пропущена одинарная кавычка в конце слова "blue". Отправил исправление.

Rik Lewis Rik Lewis
5 апр. 2020 г. 00:11:09