Come usare get_post_meta in WP_Query per mostrare i like
Sto sviluppando un plugin per aggiungere like ai post
Voglio creare una tabella in una pagina del plugin per mostrare ogni post e il numero di like
function my_plugin_options() {
echo '<p>Tabella dei Like</p>';
echo '</div>';
echo '<table>';
echo '<tr>';
echo '<td>Post</td>';
echo '<td>Numero di like</td>';
echo '</tr>';
// -- WP_Query --
$like_args = array(
'post_type' => 'post',
'order' => 'DES',
'post_status' => 'publish'
);
$like_loop = new WP_Query($like_args);
if($like_loop->have_posts()):
while($like_loop->have_posts()):
$like_loop->the_post();
// -- WP_Query --
// Recupera il numero di like per il post corrente
$likes = get_post_meta( get_the_ID(), "_like_amount", true);
echo '<tr>';
echo '<td>';
the_title();
echo '</td>';
echo '<td>';
echo $likes; // Stampa il numero di like
echo '</td>';
echo '</tr>';
endwhile;
endif;
wp_reset_postdata();
echo '</table>';
}
Ho un campo meta in ogni post '_like_amount' che contiene il numero di like.
Come posso usare get_post_meta per recuperare il campo meta nel mio loop WP_Query
?
Ho provato
$likes = get_post_meta( $like_loop->post_ID, "_like_amount", true);
Ma non funziona
Se dovrai recuperare molti articoli (o semplicemente vuoi ridurre il numero di query eseguite), consiglio di riscrivere leggermente il codice.
Per prima cosa, crea una funzione di filtro per modificare la query che stai per eseguire.
function filter_query_add_likes( $clauses, WP_Query $wp_query ) {
if ( !is_admin() && !$wp_query->is_main_query() ) {
global $wpdb;
# Aggiungi il valore meta desiderato come times_liked
$clauses['fields'] .= ', IFNULL( meta_like.meta_value, 0 ) as times_liked ';
# Unisci il campo postmeta basato sull'ID del post e sulla chiave desiderata
# - questo presuppone che tu abbia solo un meta times_liked per ogni ID post!
$clauses['join'] .= <<<SQL
LEFT JOIN {$wpdb->prefix}postmeta AS meta_like ON meta_like.post_id = {$wpdb->prefix}posts.ID AND meta_like.meta_key = '_like_amount'
SQL;
}
return $clauses;
}
Successivamente, usa quel filtro appena prima di eseguire la tua query per ottenere il campo dei like in ogni post.
function my_plugin_options() {
# Uguale a quello che hai fatto, ma usando heredoc
echo <<<HTML
<p>Tabella dei Like</p>
</div>
<table>
<tr>
<td>Post</td>
<td>Numero di Like</td>
</tr>
HTML;
$like_args = array(
'post_type' => 'post',
'order' => 'DES',
'post_status' => 'publish'
);
# Imposta il nostro nuovo filtro per applicarlo a questa query
add_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
$like_loop = new WP_Query( $like_args );
# Rimuovi il nostro filtro per evitare di influenzare altre query per errore
remove_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
if ( $like_loop->have_posts() ) {
while ( $like_loop->have_posts() ) {
# Usando next_post in questo modo recupera i tuoi post per un accesso facile
$current_post = $like_loop->next_post();
# Il tuo times_like (dal filtro) può ora essere accessibile senza
# dover eseguire una query extra con get_post_meta()
$likes = $current_post->times_liked;
# Il titolo può essere recuperato direttamente se desiderato
$title = $current_post->post_title;
# Disegna la tua colonna
echo <<<HTML
<tr>
<td>{$title}</td>
<td>{$likes}</td>
</tr>
HTML;
}
}
# Chiudi la tabella
echo "\r\n</table>";
}
Questo fa diverse cose:
- Ora usi solo una singola query per recuperare tutti i risultati che vuoi mostrare
- Puoi facilmente recuperare qualsiasi cosa dall'oggetto post, incluso il numero di volte in cui il post è stato apprezzato.
- Se un post non ha ancora un conteggio dei like, riceverà 0 grazie alla chiamata ISNULL fatta durante la modifica della clausola fields.
In generale, è molto più veloce rispetto all'uso di get_post_meta, specialmente se hai a che fare con molti post.

Una volta eseguito $like_loop->the_post()
la variabile globale $post
viene impostata sul post corrente nel Loop, quindi quello che vuoi è:
$likes = get_post_meta( $post->ID, "_like_amount", true);
Oppure...
$likes = get_post_meta( get_the_ID(), "_like_amount", true);
... che in alcune circostanze è un po' più robusto.
Tuttavia, non capisco cosa intendi con "Come uso questo campo meta nel mio WP_Query
". Il codice che fornisci come esempio ha poco a che fare con WP_Query
e se vuoi includere quel valore negli argomenti della query non spieghi quali condizioni vuoi interrogare.

Avevo già provato entrambi i tuoi suggerimenti ma non hanno funzionato. Il codice fornito utilizza una WP_Query per interrogare i post - ho aggiunto dei commenti dove PENSO di stare usando una WP_Query. Nel loop della WP_Query voglio utilizzare il valore meta in _like_amount.
