Показуйте популярну публікацію на іншому веб-сайті через WP REST JSON API


9

Мені потрібно показувати популярні та останні публікації на іншому веб-сайті PHP під тим самим доменом.

Приклад:

  1. www.example.com -> головний веб-сайт (php, mysql)
  2. www.example.com/blog -> Блог WordPress

Потрібно показати популярні, останні повідомлення блогу на головному веб-сайті.

Зверніть увагу, що блог та головний веб-сайт використовують дві окремі бази даних.

Я вирішив використовувати для цього плагін WP REST JSON API . Зараз у мене інше питання.

Я використовую наступний код для отримання популярної публікації минулого тижня. Що мені насправді потрібно - це отримання цих самих даних за допомогою виклику 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 );

Як я можу це зробити?


Про це запитували багато разів. Будь ласка, використовуйте пошук.
kraftner

1. Якщо у вас є нове запитання, будь ласка, відкрийте нове запитання. У цьому випадку це може бути добре, оскільки це не зовсім нове. У будь-якому випадку назва зараз вводить в оману. 2. Ви бачили документацію: wp-api.org
kraftner

Я також оновив заголовок, однак я перегляну документ, дякую
Джаніт Чінтхана

Відповіді:


8

Я дам вам невелику відповідь на ваше оновлення, роблячи це за допомогою WP API . API має можливість використовувати WP_Query, як і в ядрі, але про параметри отримання в URL-адресі.

URL-адреса для витягування вмісту зі статусу публікації виглядатиме так:

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

Щоб витягнути вміст за допомогою параметрів WP_Query, до якого ви звикли, ви можете зробити це так:

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

Ви можете створити власний запит із усіма параметрами також у URL-адресі. Ви можете бачити, як метод захоплення цих даних відчувається звичним для використання WP_Queryдля стандартного циклу WordPress. Якщо не вказати параметр, WP_Queryбудуть використані параметри за замовчуванням .

У результаті вийшло json, який ви можете проаналізувати та використовувати для вас зовнішній сайт.

Див. Також сайт API для отримання додаткових параметрів та документації.

Оновлення для date_query

API не може створити результат для такого запиту query_date. Дивіться документацію для всіх можливих параметрів.

Але нова версія вийде з огляду на дні, тижні. І дивіться це питання для обговорення рішення для цього запиту дати. Альтернативно використовувати спеціальний фільтр через гачок, наприклад:

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

Оновлення для meta_query

API також не може використовувати цю функцію WP-запиту за замовчуванням. Але ви можете використовувати гачок для розширення API до цієї вимоги. Також тут невеликий приклад.

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

Тепер я можу назвати JSON таким спокійним, щоб імітувати фільтр публікацій Wp_query вже на сервері:

?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

Оновлення мета запиту на основі цієї відповіді .


Чи маєте ви ідею, як перетворити рядок 'date_query' => array( array( 'after' => '1 week ago' ) ), у рядок запиту
Janith Chinthana

Я хотів би прийняти це як відповідь, але якщо у вас є ідеї щодо вищезазначеного коментаря, ви можете поділитися своїми думками.
Джаніт Чінтхана

Фільтри, окрім filter[posts_per_page]=2&filter[order]=ASCцих двох, не працюють, тому він завжди дає лише останні публікації
Джаніт Чінтхана

@JanithChinthana Я перевірив знову, параметр фільтра працює чудово. - Як приклад http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. Набагато більше мого оновлення нижче у відповіді.
буелге

дякую за оновлення, так post_per_pageі orderпрацює, але що робити meta_key. це працює з цим чи мені для цього потрібна додаткова робота?
Джаніт Чінтхана
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.