Come contare i post con un valore meta specifico in WordPress
Come posso contare solo i post che hanno un valore specifico in un campo meta personalizzato?
$productCount = wp_count_posts('product');
echo $productCount->publish;
Questo codice mi restituisce il totale di tutti i post.
Come posso scoprire quanti di questi post hanno ad esempio un valore meta personalizzato cat
?

Non esiste una funzione predefinita/nativa in WordPress per contare i post in base a un valore meta specifico. wp_count_posts
conta solo il numero di post in base al tipo di post
Potrebbe essere utile qui utilizzare WP_Query
per creare una query personalizzata per ottenere tutti i post con quel valore meta specifico e poi usare $wp_query->found_posts
per ottenere il conteggio dei post.
Questo dovrebbe funzionare
$query = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'blue' ) );
echo $query->found_posts;

Probabilmente il modo migliore per farlo è:
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;
Ecco una raccolta di funzioni per semplificarne l'utilizzo:
/**
* Restituisce il numero di post per cui viene utilizzata una particolare metakey.
* Opzionalmente qualificato da un valore specifico o da un array di valori della 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;
}
/**
* Restituisce i record postmeta per una particolare metakey.
* Opzionalmente qualificato da un valore specifico o da un array di valori della 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");
}
/**
* Restituisce la stringa WHERE per una query su metakey
*
* @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); // Separa i valori con una virgola
$where .= " AND meta_value IN ($in)";
} else {
$where .= " AND meta_value = '$value'";
}
}
return $where;
}
/**
* Aggiunge apici attorno a ciascun valore in un array quando usato come funzione callback
*
* @param $value
* @param $key
*/
function add_quote( &$value, $key)
{
$value = "'$value'";
}
