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.