Показывать популярные посты на другом php сайте через 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, как и в ядре, но с параметрами get в 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-Query по умолчанию. Но вы можете использовать ловушку для улучшения 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 restful таким образом, чтобы имитировать фильтр сообщений 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

Обновление мета-запроса на основе этого ответа .

bueltge
источник
Есть ли у вас какие-либо идеи, как преобразовать строку 'date_query' => array( array( 'after' => '1 week ago' ) ), в строку запроса
Джанит Чинтана
Я хотел бы принять это как ответ, однако, если у вас есть какие-либо идеи относительно вышеупомянутого комментария, вы можете поделиться своими мыслями.
Джанит Чинтана
Фильтры, кроме filter[posts_per_page]=2&filter[order]=ASCэтих двух, не работают, поэтому он всегда дает только последние сообщения
Джанит Чинтана
@JanithChinthana Я снова проверил, параметр фильтра работает нормально. - Как пример http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. Гораздо больше в моём обновлении ниже в ответе.
Bueltge
спасибо за обновление, да post_per_pageи orderработает, но как насчет meta_key. это работает с этим или мне нужно дополнительная работа для этого?
Джанит Чинтана