Подсчитайте сообщения, которые имеют определенное мета-значение


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

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

Это дает мне всю сумму всех сообщений.

Как мне узнать, сколько из этих сообщений имеют, скажем, пользовательское мета-значение cat?

Author: Pieter Goosen, 2014-06-18

2 answers

В 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;
 9
Author: Pieter Goosen, 2014-06-18 16:42:35

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

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;

Вот набор функций, упрощающих его использование:

    /**
     * Returns the number of posts a particular metakey is used for.
     * Optionally qualified by a specific value or values in an array of the meta key.
     *
     * @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;
    }

    /**
     * Returns the postmeta records for a particular metakey.
     * Optionally qualified by a specific value or values in an array of the meta key.
     *
     * @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");
    }

    /**
     * Returns the where string for a metakey query
     *
     * @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);  // Seperate values with a comma
                $where .= " AND meta_value IN ($in)";
            } else {
                $where .= " AND meta_value = '$value'";
            }
        }

        return $where;
    }

    /**
     * Puts quotes around each value in an array when used as a callback function
     *
     * @param $value
     * @param $key
     */
    function add_quote( &$value, $key)
    {
        $value = "'$value'";
    }
 0
Author: tazziedave, 2020-04-04 23:44:12