Uso de get_post_meta en WP_Query para mostrar likes en WordPress

26 may 2014, 18:19:00
Vistas: 13.5K
Votos: 1

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

3
Comentarios

¿Puedes reformular lo que estás preguntando? ¿Qué hace tu código que está mal? ¿Qué necesitas que haga? Es muy difícil entender lo que preguntas, dices cómo usas esto en WP_Query, pero ¿usarlo para hacer qué exactamente?

Tom J Nowell Tom J Nowell
26 may 2014 22:40:23

Ahora funciona añadiendo global $post y usando $post->ID. He actualizado el código original de la publicación.

user51590 user51590
26 may 2014 23:14:02

¿Puedes explicar cuál era tu problema original y publicar la respuesta como una respuesta (no edites el código original para corregirlo en la pregunta)?

Tom J Nowell Tom J Nowell
27 may 2014 01:39:45
Todas las respuestas a la pregunta 3
1

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.

19 sept 2015 00:29:15
Comentarios

Acabo de notar que los meta datos de las publicaciones en realidad están en caché... así que esto en realidad no mejora mucho la velocidad. Aún así, me parece un poco más limpio ;)

Privateer Privateer
19 sept 2015 00:36:54
1

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.

26 may 2014 18:29:28
Comentarios

Ya había probado ambas sugerencias pero no han funcionado. El código proporcionado utiliza WP_Query para consultar las publicaciones - He añadido comentarios donde CREO que estoy usando WP_Query. En el bucle del WP_Query quiero usar el valor meta en _like_amount.

user51590 user51590
26 may 2014 22:26:12
0

El cartel original indica que esta es la solución:

global $post;

$likes = get_post_meta( $post->ID, "_like_amount", true);

El problema era obtener el ID de la publicación actual

27 may 2014 01:56:56