Uso de get_post_meta en WP_Query para mostrar likes en WordPress
Estoy desarrollando un plugin para añadir likes a los posts
Quiero crear una tabla en una página del plugin para mostrar cada post y su número de likes
function my_plugin_options() {
echo '<p>Tabla de Likes</p>';
echo '</div>';
echo '<table>';
echo '<tr>';
echo '<td>Post</td>';
echo '<td>Número de likes</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 --
$likes = get_post_meta( $like_loop->post_ID, "_like_amount", true);
echo '<tr>';
echo '<td>';
the_title();
echo '</td>';
echo '<td>';
$likes;
echo '</td>';
echo '</tr>';
endwhile;
endif;
wp_reset_postdata();
echo '</table>';
}
Tengo un campo meta en cada post '_like_amount' que contiene el número de likes.
¿Cómo uso get_post_meta para recuperar el campo meta en mi bucle WP_Query
?
He probado con
$likes = get_post_meta( $like_loop->post_ID, "_like_amount", true);
Pero falla

Si vas a obtener una gran cantidad de publicaciones (o simplemente quieres reducir el número de consultas realizadas), recomendaría reescribirlo un poco.
Primero, construye una función de filtro para modificar la consulta que estás a punto de realizar.
function filter_query_add_likes( $clauses, WP_Query $wp_query ) {
if ( !is_admin() && !$wp_query->is_main_query() ) {
global $wpdb;
# Añade tu meta valor deseado como times_liked
$clauses['fields'] .= ', IFNULL( meta_like.meta_value, 0 ) as times_liked ';
# Une el campo postmeta basado en el ID del post y la clave deseada
# - ¡esto asume que solo tienes un meta times_liked para cada ID de 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;
}
Luego, usa ese filtro justo antes de ejecutar tu consulta para obtener tu campo de likes en cada publicación.
function my_plugin_options() {
# Igual a lo que hiciste, solo usando heredoc
echo <<<HTML
<p>Tabla de Likes</p>
</div>
<table>
<tr>
<td>Publicación</td>
<td>Número de Likes</td>
</tr>
HTML;
$like_args = array(
'post_type' => 'post',
'order' => 'DES',
'post_status' => 'publish'
);
# Establece nuestro nuevo filtro de consulta para aplicar en esta consulta
add_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
$like_loop = new WP_Query( $like_args );
# Elimina nuestro filtro de consulta para evitar tocar otras consultas por accidente
remove_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
if ( $like_loop->have_posts() ) {
while ( $like_loop->have_posts() ) {
# usando next_post así extrae tus publicaciones para un acceso fácil
$current_post = $like_loop->next_post();
# tu times_like (del filtro) ahora puede ser accedido sin
# tener que hacer una consulta extra con get_post_meta()
$likes = $current_post->times_liked;
# tu título puede ser extraído directamente si lo deseas
$title = $current_post->post_title;
# Dibuja tu columna
echo <<<HTML
<tr>
<td>{$title}</td>
<td>{$likes}</td>
</tr>
HTML;
}
}
# Termina la tabla
echo "\r\n</table>";
}
Esto hace un par de cosas:
- Ahora solo usas una única consulta para obtener todos los resultados que quieres mostrar
- Puedes extraer fácilmente lo que quieras del objeto de publicación, incluyendo el número de veces que la publicación fue gustada.
- Si aún no hay un conteo de likes en una publicación, recibirá 0 debido a la llamada ISNULL hecha al editar la cláusula de campos.
En general, es mucho más rápido que usar get_post_meta, especialmente si estás manejando muchas publicaciones.

Una vez que ejecutas $like_loop->the_post()
, la variable global $post
se establece en la publicación actual dentro del Loop, por lo que lo que necesitas es:
$likes = get_post_meta( $post->ID, "_like_amount", true);
O también...
$likes = get_post_meta( get_the_ID(), "_like_amount", true);
... que es un poco más robusto en ciertas circunstancias.
Sin embargo, no entiendo a qué te refieres con "Cómo uso este campo meta en mi WP_Query
". El código que proporcionas como ejemplo tiene poco que ver con WP_Query
, y si lo que deseas es incluir ese valor en los argumentos de la consulta, no explicas qué condiciones quieres usar para dicha consulta.
