Pokaż popularny post na innej stronie php poprzez WP REST JSON API

9

Muszę wyświetlać popularne i najnowsze posty w innej witrynie PHP w tej samej domenie.

Przykład:

  1. www.example.com -> strona główna (php, mysql)
  2. www.example.com/blog -> Blog WordPress

Musisz pokazać popularne, najnowsze posty na blogu w głównej witrynie.

Pamiętaj, że blog i strona główna korzystają z dwóch osobnych baz danych.

Zdecydowałem się na użycie wtyczki WP REST JSON API . Teraz mam inne pytanie.

Używam następującego kodu, aby pobrać popularny post z ostatniego tygodnia. Tak naprawdę potrzebuję uzyskać te same dane za pośrednictwem połączenia 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 );

Jak mogę to zrobić?

Janith Chinthana
źródło
To było zadawane wiele razy. Proszę skorzystać z wyszukiwania.
kraftner
1. Jeśli masz nowe pytanie, otwórz nowe. W takim przypadku może być w porządku, ponieważ nie jest całkowicie nowy. W każdym razie tytuł wprowadza w błąd. 2. Widziałeś dokumentację: wp-api.org
kraftner
Zaktualizowałem również tytuł, jednak
przejrzę

Odpowiedzi:

8

Dam ci krótką odpowiedź na twoją aktualizację, robiąc to z WP API . Interfejsy API mają możliwość korzystania z WP_Query jak również w rdzeniu, ale o parametrach get w adresie URL.

Adres URL do pobierania treści ze statusu postu wygląda następująco:

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

Aby pobrać zawartość z parametrami WP_Query, do których jesteś przyzwyczajony, możesz to zrobić w następujący sposób:

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

Możesz zbudować niestandardowe zapytanie ze wszystkimi parametrami również w adresie URL. Możesz zobaczyć, w jaki sposób metoda chwytania tych danych jest znana w WP_Queryprzypadku standardowej pętli WordPress. Jeśli nie określisz parametru, WP_Queryzostaną użyte wartości domyślne .

Rezultatem jest json, który możesz przeanalizować i użyć dla swojej strony zewnętrznej.

Zobacz także stronę API, aby uzyskać więcej parametrów i dokumentacji.

Aktualizacja dla date_query

Interfejs API nie może utworzyć wyniku dla takiego zapytania query_date. Zobacz dokumentację dla wszystkich możliwych parametrów.

Ale nowa wersja zostanie wydana w widoku dni, tygodnie. I zobacz ten problem, aby omówić rozwiązanie tego zapytania dotyczącego daty. Alternatywnie użyj niestandardowego filtra za pomocą haka, takiego jak:

// 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" ) ) )
    );
} );

Aktualizacja dla meta_query

Interfejs API nie może również korzystać z tej funkcji domyślnego zapytania WP. Ale możesz użyć haka, aby ulepszyć API do tego wymagania. Również tutaj mały przykład.

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;
}

Teraz mogę zadzwonić do JSON w taki sposób, aby naśladować filtr wpisów Wp_query już na serwerze:

?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

Aktualizacja meta zapytania oparta na tej odpowiedzi .

bueltge
źródło
Czy masz pomysł, jak przekonwertować wiersz 'date_query' => array( array( 'after' => '1 week ago' ) ), jako ciąg zapytania
Janith Chinthana
Chciałbym zaakceptować to jako odpowiedź, jednak jeśli masz pomysł na powyższy komentarz, możesz podzielić się swoimi przemyśleniami.
Janith Chinthana
filtry inne niż filter[posts_per_page]=2&filter[order]=ASCte dwa nie działają, więc zawsze podaje tylko ostatnie posty
Janith Chinthana
@JanithChinthana Przetestowałem jeszcze raz, parametr filtra działa dobrze. - Jako przykład http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. O wiele więcej w mojej aktualizacji poniżej w odpowiedzi.
bueltge
dzięki za aktualizację, tak post_per_pagei orderdziała, ale co z tym meta_key. czy to działa z tym, czy potrzebuję do tego dodatkowej pracy?
Janith Chinthana