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
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();
'wordpress > wordpress기초' 카테고리의 다른 글
워드프레스 - 테마 만들기 - 카카오 API로 책 가져오기 2 (2) | 2020.10.30 |
---|---|
워드프레스 - 테마 만들기 - 책목록에 표지 넣기 (0) | 2020.10.28 |
워드프레스 - 테마 만들기 - 표지 입력 (0) | 2020.10.27 |
워드프레스 - 테마 만들기 - 책 정보 저장 (3) | 2020.10.26 |
워드프레스 - 테마 만들기 - meta box (0) | 2020.10.26 |