web-dev-qa-db-ja.com

Wordpress APIを使用してすべての投稿を取得する(カスタム投稿タイプを使用する投稿も含む)

Wordpress APIでは、次のリクエストを使用して、デフォルトの「投稿」タイプのすべての投稿を取得できます。

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

「本」と「映画」のカスタム投稿タイプが作成されていると仮定すると、次のリクエストで各カスタム投稿タイプのすべての投稿を取得できます。

http://example.com/wp-json/custom/v1/books
http://example.com/wp-json/custom/v1/movies

上記の投稿すべてを取得するために同様の要求を行うことができますか。つまり、デフォルトの '投稿'投稿タイプを使用する投稿だけでなく、 '本'および '映画'カスタム投稿タイプを使用する投稿もありますか。

5
grazianodev

私は私の質問に対するコメントで提案されているようにAPIを拡張することになりましたが、私はすべての投稿タイプのすべての投稿を取得するデフォルトルートがあることを望んでいました。どうやらありません。

だからここに私の解決策があります:

add_action( 'rest_api_init', 'custom_api_get_all_posts' );   

function custom_api_get_all_posts() {
    register_rest_route( 'custom/v1', '/all-posts', array(
        'methods' => 'GET',
        'callback' => 'custom_api_get_all_posts_callback'
    ));
}

function custom_api_get_all_posts_callback( $request ) {
    // Initialize the array that will receive the posts' data. 
    $posts_data = array();
    // Receive and set the page parameter from the $request for pagination purposes
    $paged = $request->get_param( 'page' );
    $paged = ( isset( $paged ) || ! ( empty( $paged ) ) ) ? $paged : 1; 
    // Get the posts using the 'post' and 'news' post types
    $posts = get_posts( array(
            'paged' => $paged,
            'post__not_in' => get_option( 'sticky_posts' ),
            'posts_per_page' => 10,            
            'post_type' => array( 'post', 'books', 'movies' ) // This is the line that allows to fetch multiple post types. 
        )
    ); 
    // Loop through the posts and Push the desired data to the array we've initialized earlier in the form of an object
    foreach( $posts as $post ) {
        $id = $post->ID; 
        $post_thumbnail = ( has_post_thumbnail( $id ) ) ? get_the_post_thumbnail_url( $id ) : null;

        $posts_data[] = (object) array( 
            'id' => $id, 
            'slug' => $post->post_name, 
            'type' => $post->post_type,
            'title' => $post->post_title,
            'featured_img_src' => $post_thumbnail
        );
    }                  
    return $posts_data;                   
} 

Httpリクエストは次のようになります。

http://example.com/wp-json/custom/v1/all-posts

または、特定の結果ページをターゲットにしている場合は、次のようになります。

http://example.com/wp-json/custom/v1/all-posts?page=2
5
grazianodev