Cum să folosești get_post_meta în WP_Query pentru afișarea like-urilor
Dezvolt un plugin pentru a adăuga like-uri la articole.
Vreau să creez un tabel într-o pagină a pluginului pentru a afișa fiecare articol și numărul de like-uri.
function my_plugin_options() {
echo '<p>Tabel cu Like-uri</p>';
echo '</div>';
echo '<table>';
echo '<tr>';
echo '<td>Articol</td>';
echo '<td>Număr de like-uri</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>';
}
Am un câmp meta în fiecare articol '_like_amount' care reprezintă numărul de like-uri.
Cum pot folosi get_post_meta pentru a prelua câmpul meta în bucla mea WP_Query
?
Am încercat
$likes = get_post_meta( $like_loop->post_ID, "_like_amount", true);
Dar nu funcționează
Dacă vei prelua o mulțime de articole (sau pur și simplu dorești să reduci numărul de interogări efectuate), recomand să rescrii puțin codul.
Mai întâi, construiește o funcție de filtrare pentru a modifica interogarea pe care urmează să o faci.
function filter_query_add_likes( $clauses, WP_Query $wp_query ) {
if ( !is_admin() && !$wp_query->is_main_query() ) {
global $wpdb;
# Adaugă valoarea meta dorită ca times_liked
$clauses['fields'] .= ', IFNULL( meta_like.meta_value, 0 ) as times_liked ';
# Alătură câmpul postmeta bazat pe ID-ul postării și cheia dorită
# - presupune că ai doar o singură valoare times_liked pentru fiecare ID de postare!
$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;
}
Apoi, folosește acel filtru chiar înainte de a rula interogarea pentru a obține câmpul de aprecieri în fiecare postare.
function my_plugin_options() {
# La fel ca înainte, dar folosind heredoc
echo <<<HTML
<p>Tabelul aprecierilor</p>
</div>
<table>
<tr>
<td>Postare</td>
<td>Număr de aprecieri</td>
</tr>
HTML;
$like_args = array(
'post_type' => 'post',
'order' => 'DES',
'post_status' => 'publish'
);
# Setează noul filtru de interogare pentru a fi aplicat acestei interogări
add_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
$like_loop = new WP_Query( $like_args );
# Elimină filtrul pentru a evita afectarea accidentală a altor interogări
remove_filter('posts_clauses', 'filter_query_add_likes', 10, 2);
if ( $like_loop->have_posts() ) {
while ( $like_loop->have_posts() ) {
# folosind next_post așa, extragi postările pentru acces facil
$current_post = $like_loop->next_post();
# times_like (din filtru) poate fi acum accesat fără
# a fi nevoie de o interogare suplimentară cu get_post_meta()
$likes = $current_post->times_liked;
# titlul poate fi extras direct dacă se dorește
$title = $current_post->post_title;
# Desenează coloana
echo <<<HTML
<tr>
<td>{$title}</td>
<td>{$likes}</td>
</tr>
HTML;
}
}
# Încheie tabelul
echo "\r\n</table>";
}
Această abordare realizează câteva lucruri:
- Acum folosești o singură interogare pentru a obține toate rezultatele pe care dorești să le afișezi
- Poți extrage cu ușurință orice dorești din obiectul postării, inclusiv numărul de aprecieri.
- Dacă o postare nu are încă un număr de aprecieri, va primi 0 datorită apelului ISNULL făcut la editarea clauzei de câmpuri.
În general, mult mai rapid decât utilizarea get_post_meta, mai ales dacă ai de-a face cu multe postări.

După ce execuți $like_loop->the_post()
, variabila globală $post
este setată la postarea curentă din Buclă, deci ceea ce dorești este:
$likes = get_post_meta( $post->ID, "_like_amount", true);
Sau...
$likes = get_post_meta( get_the_ID(), "_like_amount", true);
... care este puțin mai robust în anumite circumstanțe.
Totuși, nu înțeleg ce vrei să spui cu "Cum folosesc acest câmp meta în WP_Query
". Codul pe care îl prezinți ca exemplu are puțină legătură cu WP_Query
și dacă vrei să incluzi acea valoare în argumentele interogării, nu explici ce condiții dorești să interoghezi.

Am încercat deja ambele sugestii ale tale, dar nu au funcționat. Codul furnizat utilizează WP_Query pentru a interoga postările - am adăugat comentarii în locurile unde CRED că folosesc un WP_Query. În bucla din WP_Query, doresc să folosesc valoarea meta din _like_amount.
