首页 > 解决方案 > 如何在 wordpress 中为自定义端点请求应用分页?

问题描述

我在 WordPress 中创建了一个自定义的 RESTful API 端点,它返回带有唯一必填字段的 JSON。

因此,当我访问 example.com/wp-json/wl/posts 时,它会返回 5 个帖子,因为我限制了帖子的数量。

function wl_posts() {
    $args = [
        'numberposts' => 99999,
        'post_type' => 'post'
    ];

    $posts = get_posts($args);

    $data = [];
    $i = 0;

    foreach($posts as $post) {
        $data[$i]['id'] = $post->ID;
        $data[$i]['title'] = $post->post_title;
        $data[$i]['content'] = $post->post_content;
        $data[$i]['slug'] = $post->post_name;
        $data[$i]['featured_image']['thumbnail'] = get_the_post_thumbnail_url($post->ID, 'thumbnail');
        
        $i++;
    }

    return $data;
}


add_action('rest_api_init', function() {
    register_rest_route('wl/v1', 'posts', [
        'methods' => 'GET',
        'callback' => 'wl_posts',
    ]);

});

但我也想添加分页,所以如果我添加 ?page=2 ,它应该返回另外 5 个帖子。

那怎么存档?

标签: jsonwordpressapirest

解决方案


访问时/?rest_route=//wp-json/wp/v2/pages您也可以深入了解 ie。wp/v2/pages/endpoints/0/args然后检查pageper_page

curl http://YOUR-SITE/wp-json/wl/v1/posts/?per_page=1&page=2

发布参数以供参考

我们可以将这些定义和发布为参数。这不是必需的,但它们现在与帖子和页面一致

add_action('rest_api_init', function() {
  register_rest_route('wl/v1', 'posts', [
    'methods' => 'GET',
    'callback' => 'wl_posts',
    'args' => [
      'page' => [
        'description' => 'Current page',
        'type' => "integer",
      ],
      'per_page' => [
        'description' => 'Items per page',
        'type' => "integer",
      ]
    ],
  ]);
});

获取参数

Asget_posts有它自己的逻辑,它WP_Query最终使用让我们WP_Query更好地使用。

function wl_posts() {
  $args = [];

  if (isset($_REQUEST['per_page'])) {
    $args['posts_per_page'] = (int) $_REQUEST['per_page'];
  }
  if (isset($_REQUEST['page'])) {
    $args['page'] = (int) $_REQUEST['page'];
  }

  $args['post_type'] = 'post';

  $get_posts = new WP_Query;
  $posts= $get_posts->query( $args );

  $data = [];
  $i = 0;

  foreach($posts as $post) {
    $data[$i]['id'] = $post->ID;
    $data[$i]['title'] = $post->post_title;
    $data[$i]['content'] = $post->post_content;
    $data[$i]['slug'] = $post->post_name;
    $data[$i]['featured_image']['thumbnail'] = 
      get_the_post_thumbnail_url($post->ID, 'thumbnail');

    $i++;
  }

  return $data;
}

推荐阅读