본문 바로가기

wordpress/wordpress기초

워드프레스 - 테마 만들기 - 카카오 API로 책 가져오기 1

반응형

add_submenu_page$parent_slug:string$page_title:string$menu_title:string$capability:string$menu_slug:string$function:callable$position:integer|null )

 

주소창의 해당 부분이 슬러그이다. 

 

functions.php

<?php
include 'functions-post-type.php';
include 'functions-setup.php';
include 'functions-taxonomy.php';
include 'functions-meta-box.php';
include 'functions-save.php';
include 'functions-enqueue-scripts.php';
include 'functions-manage-columns.php';
include 'functions-admin-menu.php';

functions-admin-menu.php

<?php
    add_action('admin_menu', function(){
        add_submenu_page( "edit.php?post_type=book",
         "책 가져오기",
         "가져오기",
         "publish_posts",
         "import-books",
         function(){
             echo "책 가져오기 페이지";
         }
        );
    });

 

정상적으로 책 가져오기 페이지가 추가되었다. 

 

 

kakao developers에 접속해서 해당 애플리케이션을 추가해준다. 

앱 키의 REST API 키를 저장해둔다. 


카카오 책 API 적용하기 

 

developers.kakao.com/tool/rest-api/open/get/v3-search-book

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com

 

 

 

wp_remote_get($url, $args);

wp_remote_retrieve_response_code($response);

wp_remote_retrieve_response_message($response);

 

import-books.php

<div class="wrap">
    <h1>책 가져오기</h1>
    <!-- <pre> -->
    <?php
    $url = "https://dapi.kakao.com/v3/search/book?";
    $query_string = http_build_query([
        'query' => '개미',
    ]);

    // var_dump($url, $query_string);

    $response = wp_remote_get($url, $query_string);
    $response_code = wp_remote_retrieve_response_code($response);
    $response_message = wp_remote_retrieve_response_message($response);
    $headers = wp_remote_retrieve_headers($response);
    $body = json_decode(wp_remote_retrieve_body($response));
    ?>
    <!-- </pre> -->
    <?php
    if ($response_code !== 200) {
    ?>
        
        <h2>에러 : <?= $body->errorType ?></h2>
        <p><?= $body->message ?></p>
    <?php
    }
    ?>

</div>

REST API KEY를 제외하고 값을 넣어보았다.

 

 

 

이번엔 header에 RestAPI 값을 넣어서 진행해 보도록 하겠다.

 

<div class="wrap">
    <h1>책 가져오기</h1>


    <?php
    $url = "https://dapi.kakao.com/v3/search/book?";
    $query_string = http_build_query([
        'query' => '개미',
    ]);

    // var_dump($url, $query_string);
    $args = [
        'httpversion' =>'1.1',
        'headers' =>[
            'Authorization' => 'KakaoAK REST KEY'
        ]
    ];

    $response = wp_remote_get($url.$query_string, $args);
    $response_code = wp_remote_retrieve_response_code($response);
    $response_message = wp_remote_retrieve_response_message($response);
    $headers = wp_remote_retrieve_headers($response);
    $body = json_decode(wp_remote_retrieve_body($response));
    ?>

    <?php
    if ($response_code !== 200) {
    ?>

        <h2>에러 : <?= $body->errorType ?></h2>
        <p><?= $body->message ?></p>
    <?php
    } else {
    ?>
        <h2>검색 결과</h2>
        <pre>
            <?php var_dump($body) ?>
        </pre>
    <?php
    }
    ?>

</div>

 

 

값이 정상적으로 받아와진다

 

 

 

기능 구분하기 

 

functions-admin-menu.php

<?php
add_action('admin_menu', function () {
    add_submenu_page(
        "edit.php?post_type=book",
        "책 가져오기",
        "가져오기",
        "publish_posts",
        "import-books",
        function () {
            if ($_SERVER['REQUEST_METHOD'] === 'GET') {
                include get_template_directory() . '/admin-pages/import-books-form.php';
            } else {
                $response = remote_books($_POST['query']);
                $response_code = wp_remote_retrieve_response_code($response);
                $response_message = wp_remote_retrieve_response_message($response);
                $headers = wp_remote_retrieve_headers($response);
                $body = json_decode(wp_remote_retrieve_body($response));
                include get_template_directory() . '/admin-pages/import-books-result.php';
            }
        }
    );
});


function remote_books($query)
{
    $url = "https://dapi.kakao.com/v3/search/book?";
    $query_string = http_build_query([
        'query' => $query,
    ]);

    // var_dump($url, $query_string);
    $args = [
        'httpversion' => '1.1',
        'headers' => [
            'Authorization' => 'KakaoAK REST API KEY'
        ]
    ];

    $response = wp_remote_get($url . $query_string, $args);
    return $response;
}

 

 

 

검색 구현하기 

 

import-books를 분리해서 form과 result로 나눠준다.

 

 

import-books-form.php

<div class="wrap">
    <h1>책 가져오기</h1>
    <form method="post">
    <table class="form-table">
    <tbody>
        <tr>
            <th scope="row">
                <label for="query">검색어</label>
            </th>
            <td>
                <input type="text" id="query" name="query">
            </td>
        </tr>
    </tbody>
    </table>
    <?php
    submit_button('검색');
    ?>
    </form>
    


</div>

 

import-books-result.php

<div class="wrap">
<?php
if ($response_code !== 200) {
?>

    <h2>에러 : <?= $body->errorType ?></h2>
    <p><?= $body->message ?></p>
<?php
} else {
?>
    <h2>검색 결과</h2>

    <table class="widefat striped">
        <thead>
            <tr>
            <th scope="col">표지</th>
                <th scope="col">제목</th>
                <th scope="col">저자</th>
                <th scope="col">출판사</th>
                <th scope="col">발행일 </th>
            </tr>
        </thead>
        <tbody>
            <?php

            foreach ($body->documents as $book) { ?>
                <tr>
                    <td><img height="100" src="<?= $book->thumbnail ?>"> </td>
                    <td><?= $book->title ?></td>
                    <td><?= implode(', ', $book->authors) ?></td>
                    <td><?= $book->publisher ?></td>
                    <td nowrap><?= date('Y-m-d', strtotime($book->datetime)) ?></td>
                </tr>

            <?php
            }
            ?>
        </tbody>
    </table>
<?php
}
?>
</div>

 

 

post 요청(검색 일때는) result 부분을 include 시켜준다. 

 

functions-admin-menu.php

 

<?php
add_action('admin_menu', function () {
    add_submenu_page(
        "edit.php?post_type=book",
        "책 가져오기",
        "가져오기",
        "publish_posts",
        "import-books",
        function () {
            include get_template_directory() . '/admin-pages/import-books-form.php';
            if ($_SERVER['REQUEST_METHOD'] === 'POST') {

                $response = remote_books($_POST['query']);
                $response_code = wp_remote_retrieve_response_code($response);
                $response_message = wp_remote_retrieve_response_message($response);
                $headers = wp_remote_retrieve_headers($response);
                $body = json_decode(wp_remote_retrieve_body($response));

                include get_template_directory() . '/admin-pages/import-books-result.php';
            }
        }
    );
});


function remote_books($query)
{
    $url = "https://dapi.kakao.com/v3/search/book?";
    $query_string = http_build_query([
        'query' => $query,
    ]);

    // var_dump($url, $query_string);
    $args = [
        'httpversion' => '1.1',
        'headers' => [
            'Authorization' => 'KakaoAK c9351d4373d988d687b5c95825b4f932'
        ]
    ];

    $response = wp_remote_get($url . $query_string, $args);
    return $response;
}

 

 

 

검색 시에 정상적으로 목록들이 출력이된다

 

 

 

 

 

 

클래스화 시키기 

클래스로 만들기

  • 클래스 생성자에 add_action, add_filter를 넣는다.
  • new 키워드로 클래스를 생성한다.
  • action, filter는 내부적으로 call_user_func 함수를 사용한다. 클래스의 함수를 넘길 때는 아래와 같이 쓴다.call_user_func([$object, 'function_name']);

    따라서 action을 걸 때도 이렇게 건다.

    add_action( 'action_tag', [$object, 'function_name'] );

 

기존 functions-admin-menu를 ImportBooks로 리네임해준다

 

ImportBooks.php

 

<?php
class ImportBooks
{
    function __construct()
    {
        add_action('admin_menu', [$this, 'addMenu']);
    }

    public function addMenu()
    {
        add_submenu_page(
            "edit.php?post_type=book",
            "책 가져오기",
            "가져오기",
            "publish_posts",
            "import-books",
            function(){
                if($_SERVER['REQUEST_METHOD'] === 'GET'){
                    include get_template_directory() . '/admin-pages/import-books-form.php';
                }
                if($_SERVER['REQUEST_METHOD'] === 'POST'){
                    $this->result();
                }
            }

        );
    }
    public function result()
    {
        $response = $this->get($_POST['query']);
        $response_code = wp_remote_retrieve_response_code($response);
        $response_message = wp_remote_retrieve_response_message($response);
        $headers = wp_remote_retrieve_headers($response);
        $body = json_decode(wp_remote_retrieve_body($response));

        include get_template_directory() . '/admin-pages/import-books-result.php';
    }


    public function get($query)
    {
        $url = "https://dapi.kakao.com/v3/search/book?";
        $query_string = http_build_query([
            'query' => $query,
        ]);

        // var_dump($url, $query_string);
        $args = [
            'httpversion' => '1.1',
            'headers' => [
                'Authorization' => 'KakaoAK ' . KAKAO_REST_API_KEY
            ]
        ];

        $response = wp_remote_get($url . $query_string, $args);
        return $response;
    }
}

new ImportBooks();
반응형