开发

WordPress Rest API 基本入门手册

CRUD

  • Create
  • Read
  • Upload
  • Delete

JSON 文件查看工具

postman

URL 格式

https://域名地址/wp-json/wp/v2/文章类型名称
https://puji.design/wp-jason/wp/v2/post

定制数据

在 WordPress 默认的 JSON 文件中如果没有我们想要的数据,我们可以使用 rest_api_init 来自定义 JSON 文件中返回的数据

在 function.php 文件中修改,WordPress 会自动生成 JSON 对应的格式文件。

function customize_rest_api() {
  register_rest_field('post', 'author_name', array(
    'get_callback' => function() {return get_the_author();}
  ));
}
add_action('rest_api_init', 'customize_rest_api');

register_rest_field 方法中包含了三个参数,第一个参数是文章类型,第二个参数是自定义的名称,第三个参数描述了我们希望如何处理这个字段,他为一个 array

自定义文章类型启用 JSON

WordPress 默认情况下不会对自定义文章类型生成相应的 JSON 数据,如需开启,在注册文章类型时将 show_in_rest 设置为 true 即可。

如注册了一个event的文章类型

https://域名地址/wp-json/wp/v2/event

自定义 JSON URL

原因:

  • 自定义搜索逻辑
  • 仅返回需要使用的 JSON 数据,优化读取速度
  • 减少文件请求数量
function customize_rest_search() {
  register_rest_route('puji/v1', 'search', array(
    'methods' => WP_REST_SERVER::READABLE, // WP中的常量,类似 GET
    'callback' => 'searchResults'
  ));
}

function searchResults($data) {
  $allPosts = new WP_Query(array(
    'post_type' => array('post', 'page', 'event'),
    's' => sanitize_text_field($data['term'])
  ));

  $searchResults = array(
    'generalInfo' => array(),
    'artists' => array(),
    'events' => array()
  );

  while($allPosts->have_posts()) {
    $allPosts->the_post();
    if (get_post_type() == 'post' OR get_post_type() == 'page') {
      array_push($searchResults['generalInfo'], array(
        'title' => get_the_title(),
        'link' => get_the_permalink(),
        'post_type' => get_post_type()
      ));
    }

    if (get_post_type() == 'artist') {
      array_push($searchResults['artists'], array(
        'id' => get_the_id(),
        'title' => get_the_title(),
        'link' => get_the_permalink(),
        'thumb' => get_the_post_thumbnail_url(0, 'medium')
      ));
    }

    if (get_post_type() == 'event') {
      $eventDate = new DateTime(get_field('event_date')); // event_date是自定义字段
      array_push($searchResults['events'], array(
        'title' => get_the_title(),
        'link' => get_the_permalink(),
        'month' => $eventDate->format('M'),
        'day' => $eventDate->format('d')
      ));
    }
    
  }

  // 增强选项:根据自定义字段筛选关联文章类型,如event文章关联了artist文章类型

  if ($searchResults['artists']) {
    $artistMetaQuery = array('relation' => 'OR');
    foreach($searchResults['artists'] as $item) {
      array_push($artistMetaQuery, array(
        'key' => 'related_artist',
        'compare' => 'LIKE',
        'value' => '"' . $item[id] . '"'
      ));
    }

    $artistRelationshipQuery = new WP_Query(array(
      'post_type' => 'event',
      'meta_query' => $artistMetaQuery
    ));

    while($artistRelationshipQuery->have_posts()) {
      $artistRelationshipQuery->the_post();

      if (get_post_type() == 'event' {
        array_push($searchResults[events], array(
          'title' => get_the_title(),
          'link' => get_the_permalink(),
          'month' => $eventDate->format('M'),
          'day' => $eventDate->format('d')
        ));
      }
    }

    $searchResults['events'] = array_values(array_unique($searchResults['events'], SORT_REGULAR));
  }

  return $searchResults;
}

add_action('rest_api_init', 'customize_rest_search');

register_rest_route 方法中有三个参数

  • 第一个参数为命名空间
  • 第二个参数是路由名称
  • 第三个参数为一个数组,数组中包含了两个关联数据,第一个数据为需要提供的操作,可参考 CRUD,第二个返回数据

请求类型

GET

WP_REST_SERVER::READABLE

POST

DELETE

参考链接

官方文档: https://developer.wordpress.org/rest-api

内容目录

PUJI Design 朴及设计 (c) 2024. 沪ICP备17052229号