Come usare get_post_meta in WP_Query per mostrare i like

26 mag 2014, 18:19:00
Visualizzazioni: 13.5K
Voti: 1

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

3
Commenti

Puoi riformulare quello che stai chiedendo? Cosa fa di sbagliato il tuo codice, cosa hai bisogno che faccia? È molto difficile capire cosa stai chiedendo, dici come usi questo in WP_Query, ma usarlo per fare cosa esattamente?

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

Ora funziona aggiungendo global $post e usando $post->ID. Ho aggiornato il codice originale del post.

user51590 user51590
26 mag 2014 23:14:02

Puoi spiegare qual era il problema originale e pubblicare la risposta come risposta (non modificare il codice originale per correggerlo nella domanda)

Tom J Nowell Tom J Nowell
27 mag 2014 01:39:45
Tutte le risposte alla domanda 3
1

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.

19 set 2015 00:29:15
Commenti

Ho appena notato che i meta dei post sono effettivamente memorizzati nella cache... quindi questo in realtà non migliora molto la velocità. Tuttavia, lo trovo comunque un po' più pulito ;)

Privateer Privateer
19 set 2015 00:36:54
1

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.

26 mag 2014 18:29:28
Commenti

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.

user51590 user51590
26 mag 2014 22:26:12
0

L'autore originale indica che questa è la soluzione:

global $post;

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

Il problema era ottenere l'ID del post corrente

27 mag 2014 01:56:56