Cum să folosești get_post_meta în WP_Query pentru afișarea like-urilor

26 mai 2014, 18:19:00
Vizualizări: 13.5K
Voturi: 1

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ă

3
Comentarii

Poți reformula întrebarea ta? Ce anume nu funcționează corect în codul tău și ce anume ai nevoie să facă? Este foarte greu de înțeles ce întrebi exact. Menționezi cum să folosești asta în WP_Query, dar pentru a face ce anume?

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

Am rezolvat acum prin adăugarea global $post și folosind $post->ID. Am actualizat codul din postarea originală.

user51590 user51590
26 mai 2014 23:14:02

Poți explica care a fost problema inițială și să postezi răspunsul ca un răspuns (nu edita codul original pentru a-l repara în întrebare)?

Tom J Nowell Tom J Nowell
27 mai 2014 01:39:45
Toate răspunsurile la întrebare 3
1

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.

19 sept. 2015 00:29:15
Comentarii

Tocmai am observat că meta-informațiile postărilor sunt de fapt stocate în cache... așa că asta nu îmbunătățește prea mult viteza. Totuși, mi se pare un pic mai curat ;)

Privateer Privateer
19 sept. 2015 00:36:54
1

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.

26 mai 2014 18:29:28
Comentarii

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.

user51590 user51590
26 mai 2014 22:26:12
0

Posterul original indică faptul că aceasta este soluția:

global $post;

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

Problema consta în obținerea ID-ului postului curent

27 mai 2014 01:56:56