Numără postările care au o valoare meta specifică
Cum pot număra doar postările care au o valoare specifică într-un câmp meta personalizat?
$productCount = wp_count_posts('product');
echo $productCount->publish;
Aceasta îmi afișează numărul total al tuturor postărilor.
Cum pot afla câte dintre aceste postări au o valoare meta personalizată, de exemplu cat
?

Nu există o funcție implicită/nativă în WordPress pentru a număra postări după o valoare meta specifică. wp_count_posts
numără doar cantitatea de postări în funcție de tipul de postare.
Aici ar putea fi util să folosiți WP_Query
pentru a crea o interogare personalizată care să obțină toate postările cu acea valoare meta specifică și apoi să utilizați $wp_query->found_posts
pentru a obține numărul de postări.
Acest cod ar trebui să funcționeze:
$query = new WP_Query( array( 'meta_key' => 'culoare', 'meta_value' => 'albastru' ) );
echo $query->found_posts;

Acest răspuns este probabil prima idee care ne vine în minte. Cu toate acestea, aceasta se poate dovedi costisitoare din punct de vedere al resurselor utilizate (RAM). În astfel de cazuri de utilizare, cel mai bine este să optați pentru o interogare SQL prin intermediul global $wpdb

Probabil cel mai bun mod de a face acest lucru este:
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;
Iată o colecție de funcții pentru a o folosi mai ușor:
/**
* Returnează numărul de articole pentru care este folosită o anumită cheie meta.
* Opțional, poate fi calificată de o valoare specifică sau de un array de valori ale cheii meta.
*
* @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;
}
/**
* Returnează înregistrările postmeta pentru o anumită cheie meta.
* Opțional, poate fi calificată de o valoare specifică sau de un array de valori ale cheii meta.
*
* @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");
}
/**
* Returnează condiția WHERE pentru o interogare de cheie meta
*
* @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); // Separează valorile cu virgulă
$where .= " AND meta_value IN ($in)";
} else {
$where .= " AND meta_value = '$value'";
}
}
return $where;
}
/**
* Adaugă ghilimele în jurul fiecărei valori dintr-un array atunci când este folosită ca funcție callback
*
* @param $value
* @param $key
*/
function add_quote( &$value, $key)
{
$value = "'$value'";
}
