web-dev-qa-db-ja.com

他のphpウェブサイトで人気のある投稿を表示する WP REST JSON API

同じドメイン内の別のPHP Webサイトで人気のある最新の投稿を表示する必要があります。

例:

  1. www.example.com - >メインウェブサイト(php、mysql)
  2. www.example.com/blog - > WordPressブログ

メインWebサイトでブログの人気のある最近の投稿を表示する必要があります。

ブログとメインWebサイトは2つの別々のデータベースを使用していることに注意してください。

そのために 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 );

どうやってやるの?

9

あなたのアップデートに対するちょっとした答えを、 WP AP​​I を使って行います。 APIには、コアと同様にWP_Queryを使用する可能性がありますが、URL内のgetパラメータについてです。

投稿ステータスからコンテンツを取得するためのURLは次のようになります。

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

慣れ親しんだWP_Queryパラメータでコンテンツを取得するには、次のようにします。

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

あなたはまたURLの中のすべてのパラメータであなたのカスタムクエリを構築することができます。そのデータを取得する方法が、標準のWordPressループでWP_Queryを使用するのに慣れ親しんでいると感じる方法がわかります。パラメータを指定しないと、デフォルトのWP_Queryが使用されます。

結果はjsonです。つまり、外部サイトを解析して使用することができます。

その他のパラメータとドキュメントについては APIのサイト も参照してください。

date_query用に更新

APIはquery_dateのようなクエリの結果を作成できません。すべての可能なパラメータについては ドキュメント を参照してください。

しかし、新しいバージョンは数日、数週間でリリースされるでしょう。この日付クエリの解決策についての議論はthis issue をご覧ください。別の方法として、フックを介してカスタムフィルタを使用します。

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

これで、サーバー上に既に存在しているWp_queryの投稿フィルタを模倣するために、JSONをそのように呼び出して安心させることができます。

?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

メタクエリのアップデートは この回答 に基づいています。

8
bueltge