Mostra post popolari in un altro sito Web PHP tramite l'API JSON REST WP


9

Devo mostrare post popolari e recenti in un altro sito Web PHP sotto lo stesso dominio.

Esempio:

  1. www.example.com -> sito web principale (php, mysql)
  2. www.example.com/blog -> Blog di WordPress

È necessario mostrare post recenti e popolari del blog nel sito Web principale.

Si prega di notare che blog e sito Web principale utilizzano due database separati.

Ho deciso di utilizzare l' API JSON REST WP plugin per questo. Ora ho una domanda diversa.

Uso il seguente codice per recuperare i post popolari della scorsa settimana. Ciò di cui ho effettivamente bisogno è ottenere questi stessi dati tramite la chiamata API.

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => $recent_posts_count,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
);
$popularposts = new WP_Query( $args );

Come lo posso fare?


Questo è stato chiesto molte volte. Si prega di utilizzare la ricerca.
Kraftner,

1. Se hai una nuova domanda, ti preghiamo di aprire una nuova domanda. In questo caso potrebbe andare bene perché non è del tutto nuovo. Comunque il titolo ora è fuorviante. 2. Hai visto la documentazione: wp-api.org
kraftner,

Ho aggiornato anche il titolo, tuttavia esaminerò il documento, grazie
Janith Chinthana,

Risposte:


8

Ti darò una piccola risposta al tuo aggiornamento, facendo questo con l' API WP . L'API ha la possibilità di utilizzare WP_Query come anche in core, ma sui parametri get nell'URL.

Un URL per estrarre il contenuto dallo stato dei post sarebbe simile al seguente:

http://example.com/wp-json/posts

Per estrarre il contenuto con i parametri WP_Query a cui sei abituato, puoi farlo in questo modo:

http://example.com/wp-json/posts?filter[posts_per_page]=2&filter[order]=ASC

Puoi creare la tua query personalizzata con tutti i parametri anche nell'URL. Puoi vedere come il metodo per acquisire quei dati è familiare all'utilizzo WP_Queryper un ciclo WordPress standard. Se non si specifica un parametro, l'impostazione predefinita èWP_Query verranno utilizzati .

Il risultato è JSON, che puoi analizzare e utilizzare per il tuo sito esterno.

Vedi anche il sito dell'API per ulteriori parametri e documentazione.

Aggiornamento per date_query

L'API non può creare un risultato per una query simile query_date. Vedi la documentazione per tutti i possibili parametri.

Ma la nuova versione verrà rilasciata in vista giorni, settimane. E vedi questo problema per la discussione su una soluzione per questa query di data. In alternativa, utilizzare un filtro personalizzato tramite hook, come:

// Allow datequery in /posts filter
add_filter( "json_query_vars", function( $query_args ) {
    return array_merge( $query_args, 
        array( "date_query" => array( array( "after" => "1 week ago" ) ) )
    );
} );

Aggiornamento per meta_query

L'API non può anche questa funzionalità della query WP predefinita. Ma puoi usare un hook per migliorare l'API a questo requisito. Anche qui un piccolo esempio.

add_filter('json_query_var-meta_query', 'add_meta_query', 10, 1);

function add_meta_query( $data ){

    $args = array();
    $args['relation'] = 'AND';

    foreach ( $data as $key => $value ) {
        if ( 'relation' === $key ) {
            $args['relation'] = $data['relation'];
        }

        if ( substr($key, 0, 3) === 'key' ) {
            $arg_num = substr( $key, 3 );
            $args[ (int) $arg_num ][ 'key' ] = $value;
        }

        if (  substr( $key, 0, 7 ) === 'compare' ) {
            $arg_num_comp = substr( $key, 7 );
            $args[ (int) $arg_num_comp ][ 'compare' ] = $value;
        }
    }

    return $args;
}

Ora, posso chiamare JSON riposante in questo modo per imitare il filtro post Wp_query già sul server:

?filter[meta_query][key]=_newsml_categories_newsstream&filter[meta_query][key2]=homepage&filter[meta_query][relation]=AND&filter[meta_query][compare]=NOT%20EXISTS&filter[meta_query][compare2]=NOT%20EXISTS

L'aggiornamento della meta query basato su questa risposta .


Hai idea di come convertire la linea 'date_query' => array( array( 'after' => '1 week ago' ) ), come stringa di query
Janith Chinthana,

Vorrei accettare questo come risposta, tuttavia se hai qualche idea riguardo al commento sopra, puoi condividere i tuoi pensieri.
Janith Chinthana,

filtri diversi da filter[posts_per_page]=2&filter[order]=ASCquesti due non funzionano, quindi fornisce sempre solo post recenti
Janith Chinthana,

@JanithChinthana Ho provato di nuovo, il parametro del filtro funziona bene. - Come esempio http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. Molto di più nel mio aggiornamento di seguito nella risposta.
costruzione

grazie per l'aggiornamento, sì post_per_pagee orderfunziona, ma che dire meta_key. funziona con questo o ho bisogno di lavoro extra per quello?
Janith Chinthana,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.