[WordPress] WordPress에서 REST API 플러그인 만드는 방법

2023. 3. 15. 20:40개발을 파헤치다/PHP

반응형

 

WordPress는 굉장한 확장성으로 단순히 CMS(Content Management System)를 넘어서는 플랫폼이라고 볼 수 있죠.

WooCommerce 플러그인을 활용하면 쇼핑몰이 되기도 하고 LMS(Learning Management System) 플러그인을 붙이면 온라인 교육 플랫폼이 되기도 합니다. 이렇게 WordPress를 응용하는 데는 보통 플러그인이라는 형태로 개발이 진행되는데요. 오늘은 WordPress의 데이터를 가져올 수 있는 REST API 플러그인을 만드는 방법을 살펴보겠습니다. 이게 된다면 WordPress기반의 앱이나 웹 서비스를 만들 수 있겠죠?

 

 

API 등록

가장 먼저 해야 할 것은 사실 플러그인 개발을 위한 기본 디렉토리 구조를 잡는 것인데요. 이 부분은 제가 따로 포스팅을 했으니 아래글에서 확인해 주세요.

2021.11.19 - [개발을 파헤치다/PHP] - [Wordpress Plugin] 워드프레스 플러그인 설정 페이지 만드는 방법

 

[Wordpress Plugin] 워드프레스 플러그인 설정 페이지 만드는 방법

워드프레스 플러그인을 개발하게 되면 거의 대부분 설정 페이지를 개발하게 됩니다. 워드프레스 플러그인 개발은 쉽게 생각해서 웹 서비스를 하나 개발하고 관리자 페이지를 만든다고 보시면

show-me-the-money.tistory.com

기본적인 WordPress 플러그인 개발 준비가 끝났다면 REST API를 등록해줘야 합니다.

API를 호출할 때 경로와 호출되었을 때 어떤 로직을 통해 응답값을 줄 것인지 설정해줘야 합니다.

 

add_action('rest_api_init', function(){
    register_rest_route('jejuand-rest/v1', '/point/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'get_points',
        'permission_callback'   =>  "is_user_logged_in",
    ));
});

이때 register_rest_route라는 메서드를 사용하는데요. 여기에 3가지 값을 전달해주어야 합니다.

  • namespace : 보통 플러그인 이름과 버전이 들어가게 됩니다. REST API 호출 시 기본 URL 주소 뒤에 붙게 됩니다.
  • route : 지정한 namespace에서 호출할 특정 API를 나타냅니다. 여기에 정규표현식으로 id값을 넣을 수 있습니다.
  • option : API의 옵션을 설정할 수 있습니다. HTTP Method나 API 호출시 동작할 콜백함수, API 호출 권한 설정 등 다양한 옵션을 줄 수 있습니다.

위의 예시는 제가 개발했던 E-Commerce 플랫폼의 REST API 플러그인을 만드는 과정인데요.

내용은 사용자의 누적 포인트를 리턴하는 API입니다. 따라서 route에 point라는 경로와 정규표현식을 통해 사용자의 id값을 넣을 수 있도록 설계했습니다.

 

Parameter 설정

이제 본격적으로 Parameter 설정을 해볼까요?

이번에는 이메일 및 아이디의 유효성을 체크하는 REST API를 한번 만들어 봅시다.

<?php

add_action('rest_api_init', function () {
	// 유효성 체크하는 API
    register_rest_route('jejuand-rest/v1', 'user' . '/validation_check', array(
                'methods' => 'GET',
                'callback' => 'get_validate',
                'permission_callback'   =>  "__return_true",
                'args'  =>  array(
                    'username'    =>  array(
                        "required"  =>  false,
                    ),
                    'email' =>  array(
                      "required"  =>  false,
                      "validate_callback" =>  "is_email",
                    ),
                ),
            ));
});
?>

option 항목에 args가 있는데 이건 REST API 요청 시 포함할 매개변수(Parameter)입니다. REST API를 개발하게 되면 많은 parameter들을 전달해야 할 때도 있는데요. GET 요청을 보낼 때 데이터 조건을 필터링하기 위해 넣는다던가, POST 요청을 보낼 때 서버에 저장하기 위한 데이터를 포함하기도 합니다. 위의 예시에서는 username과 email 항목이 parameter로 지정됐습니다.

Parameter를 전달할 때에도 필수냐 아니냐, 유효성 검사를 할 것이냐에 대한 설정도 가능합니다.

API를 등록한 대로 요청을 하면 아래의 validation_check 메서드가 실행됩니다.

 

/**
       *  
       *  이메일 및 아이디 유효성 체크를 하는 로직
       */
      public function get_validate(WP_REST_Request $request){
        global $wpdb;

        // 값을 사용할 수 있으면 200 OK를 리턴한다
        $result = "success";
        $status_code = 200;

        // username 혹은 email을 request에서 가져온다
        *$query_params* *=* *$request**->**get_query_params**();*
 *$email* *=* *$query_params**[**"email"**];*
 *$username* *=* *$query_params**[**"user_name"**];*
        if($email){
          $query = "select * from wp_users where user_email='{$email}'";
          // 이미 값이 있는지 확인한다
          // 값이 있으면 406 Not Acceptable을 리턴한다
          $query_result = $wpdb->get_var($query);
          if($query_result){
            $result = "Unavailabe";
            $status_code = 406;
          }
        }
        else if($username){
          $query = "select * from wp_users where user_login='{$username}'";
          $query_result = $wpdb->get_var($query);
          if($query_result){
            $result = "Unavailabe";
            $status_code = 406;
          }
        }
        else{
          // 필수 파라미터가 없으므로 400 BAD REQUEST를 리턴한다
          $result = "Bad Request";
          $status_code = 400;
        }
                
        // Response를 생성해서 리턴
        $data = array(
          "result"  =>  $result,
        );
        $response = new WP_REST_Response($data);
        $response->set_status($status_code);
        return $response;

      }

                                                      

 

Return 값 설정

REST API는 데이터 꾸러미를 전해줍니다. 그럼 클라이언트 쪽에서는 데이터 꾸러미를 펼쳐서 원하는 데이터를 가져다가 쓰면 되는 것이죠.

XML이나 일반 텍스트, JSON 등 여러 형태로 데이터를 줄 수 있는데 대체로 JSON 형태를 사용합니다. 

아래 부분이 바로 리턴값을 생성하는 부분입니다.

 

// Response를 생성해서 리턴
        $data = array(
          "result"  =>  $result,
        );
        $response = new WP_REST_Response($data);
        $response->set_status($status_code);
        return $response;

 

WP_REST _Response 클래스를 활용하면 map 형태의 배열을 넘겨주는 것 만으로 JSON 형태로 알아서 변환되어 전달됩니다.

set_status 메서드를 통해 HTTP Response code값도 설정이 가능합니다.

 

Permission에 대한 설정

REST API를 등록하고 필요한 데이터 로직을 가져와 리턴하는 방법까지 알아보았는데요. 중요한 부분에 대한 설명을 추가하려고 합니다.

바로 권한에 대한 부분이죠. API 별로 호출할 수 있는 권한이 다른 게 일반적인데요. 그도 그럴 것이 개인정보와 관련된 소중한 데이터를 봐서는 안될 사람에게 보여주면 큰일이 나겠죠? 예를 들어 내 결제내역이 다른 사람에게 공개되면 아마 서비스를 이용할 사람은 없을 것 같네요. 따라서 API 특성별로 권한을 설정해주어야 합니다.

 

add_action('rest_api_init', function(){
    register_rest_route('jejuand-rest/v1', '/point/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'get_points',
        
        'permission_callback'   =>  "is_user_logged_in",
        
        'permission_callback'.  =>. "__return_true",
        
        'permission_callback' => function () {
            return current_user_can( 'edit_others_posts' );
        }
        ) );
    ));
});

위의 코드에서 permission_callback에 해당되는 부분이 바로 권한을 설정하는 부분입니다.

다양한 옵션값을 줘서 설정할 수 있구요. function을 등록해서 권한을 자체적으로 검사하는 로직을 만들 수도 있습니다. 이 경우 true / false 값을 리턴해서 권한 여부를 설정할 수 있습니다. 대표적인 권한 설정값들을 설명드릴게요.

  • is_user_logged_in : 유저가 로그인해서 인증을 한 경우에만 응답값을 내보냅니다. WordPress의 경우 원래는 웹기반이라 Basic Auth를 사용하는데요. REST API에서 인증을 좀 더 원활히하기 위해 JWT Token 플러그인을 활용하면 좋습니다. 그럼 Token 기반의 인증이 가능합니다. 이렇게 설정한 경우 Token값이 정상적으로 인증되어야 데이터를 리턴 받을 수 있습니다.

  • __return_true : 인증되지 않은 사용자에게도 응답값을 내보냅니다. 주로 누구나 볼 수 있는 서비스 내 콘텐츠 목록을 리턴하거나 할 때 사용됩니다.

이제 WordPress 기반 REST API 플러그인을 만들 수 있는 모든 준비가 끝났네요. 이 부분을 잘 활용한다면 WordPress에서 제공하는 다양한 플러그인과 강력한 관리자 페이지 서비스를 그대로 활용하면서 나만의 앱이나 웹앱 서비스에 콘텐츠를 보여줄 수 있는 시스템을 구성할 수 있습니다. 서비스를 개발할 때 상당히 시간단축을 할 수 있겠죠? 만약 컨텐츠 기반 서비스를 계획 중이라면 개발기간을 압도적으로 단축시킬 수 있습니다. 백엔드 REST API 개발만으로 서버작업 대부분이 끝날 테니깐요. 아무쪼록 도움이 되셨길 바랍니다.

반응형