Wp Rest API 커스텀 엔드 포인트 POST 요청
제가 만든 커스텀 API 엔드포인트에 데이터를 올리려고 합니다.
이것이 내 워드프레스 사용자 지정 엔드포인트 코드입니다.
register_rest_route( 'api/v1', '/cities', array(
'methods' => 'POST',
'callback' => 'create_city_from_data'
));
그리고 테스트를 위해 이렇게 요청을 반환하려고 합니다.
function create_city_from_data($req) {
return ['req' => $req];
}
하지만 항상 빈 오브젝트를 응답으로 받고 페이로드로 무엇을 보내든 아무것도 받지 못했습니다.
내 페이로드는 이 정도야
{ name: 'Hello', population: 565656 }
요청에서 받은 내용입니다.
{"req":{}}
아래 코드를 사용하여 페이로드를 볼 수 있습니다.
add_action('rest_api_init', function () {
register_rest_route( 'api/v1', '/cities', array(
'methods' => 'POST',
'callback' => 'create_city_from_data'
));
});
function create_city_from_data($req) {
$response['name'] = $req['name'];
$response['population'] = $req['population'];
$res = new WP_REST_Response($response);
$res->set_status(200);
return ['req' => $res];
}
우체부를 사용하여 POST 파라미터를 표시했습니다.
이 기능을 사용하면 API에서 커스텀 투고 타입의 모든 투고를 볼 수 있습니다.API 뷰어에서 모든 게시물을 가져옵니다.API 뷰어의 작성자 URL(예: Postman json api view, google chrome adon 사용)
Domain-name/wp-json/showFavorites/v2?post_type=hotel
여기 '호텔'은 맞춤 우편 유형입니다.
기능에 이 기능을 추가합니다.php
add_action( 'rest_api_init', 'wp_api_show_favorites_endpoints' );
function wp_api_show_favorites_endpoints() {
register_rest_route( 'showFavorites', '/v2', array(
'methods' => 'GET',
'callback' => 'showFavorites_callback',
));
}
function showFavorites_callback( $request_data ) {
global $wpdb;
$data = array();
$table = 'wp_posts';
$parameters = $request_data->get_params();
$post_type = $parameters['post_type'];
if($post_type!=''){
$re_query = "SELECT * FROM $table where post_type='$post_type'";
$pre_results = $wpdb->get_results($re_query,ARRAY_A);
return $pre_results;
}else{
$data['status']=' false ';
return $data;
}
}
그리고 이를 이용하여 API에서 콘텐츠를 올릴 수 있습니다.
// POST All Posts using API
add_action( 'rest_api_init', 'wp_api_add_posts_endpoints' );
function wp_api_add_posts_endpoints() {
register_rest_route( 'addPost', '/v2', array(
'methods' => 'POST',
'callback' => 'addPosts_callback',
));
}
function addPosts_callback( $request_data ) {
global $wpdb;
$data = array();
$table = 'wp_posts';
// Fetching values from API
$parameters = $request_data->get_params();
$user_id = $parameters['user_id'];
$post_type = $parameters['post_type'];
$post_title = $parameters['post_title'];
$the_content = $parameters['the_content'];
$cats = $parameters['cats'];
$the_excerpt = $parameters['the_excerpt'];
$feature_img = $parameters['featured_image'];
// custom meta values
$contact_no = $parameters['contact_no'];
$email = $parameters['email'];
$hotel_url = $parameters['hotel_url'];
if($post_type!='' && $post_title!=''){
// Create post object
$my_post = array(
'post_title' => wp_strip_all_tags( $post_title),
'post_content' => $the_content,
'post_author' => '',
'post_excerpt' => $the_excerpt,
'post_status' => 'publish',
'post_type' => $post_type,
);
$new_post_id = wp_insert_post( $my_post );
function wp_api_encode_acf($data,$post,$context){
$customMeta = (array) get_fields($post['ID']);
$data['meta'] = array_merge($data['meta'], $customMeta );
return $data;
}
if( function_exists('get_fields') ){
add_filter('json_prepare_post', 'wp_api_encode_acf', 10, 3);
}
// Set post categories
$catss = explode(',', $cats);
if (!empty($catss)) {
if ($post_type == 'post') {
wp_set_object_terms( $new_post_id, $catss, 'category', false );
}
else{
wp_set_object_terms( $new_post_id, $catss, 'Categories', false ); // Executes if posttype is other
}
}
// Set Custom Metabox
if ($post_type != 'post') {
update_post_meta($new_post_id, 'contact-no', $contact_no);
update_post_meta($new_post_id, 'email', $email);
update_post_meta($new_post_id, 'hotel-url', $hotel_url);
}
// Set featured Image
$url = $feature_img;
$path = parse_url($url, PHP_URL_PATH);
$filename = basename($path);
$uploaddir = wp_upload_dir();
$uploadfile = $uploaddir['path'] . '/' . $filename;
$contents= file_get_contents($feature_img);
$savefile = fopen($uploadfile, 'w');
chmod($uploadfile, 0777);
fwrite($savefile, $contents);
fclose($savefile);
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => $filename,
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
if ($attach_id) {
set_post_thumbnail( $new_post_id, $attach_id );
}
if ($new_post_id) {
$data['status']='Post added Successfully.';
}
else{
$data['status']='post failed..';
}
}else{
$data['status']=' Please provide correct post details.';
}
return ($data);
}
콜백 함수에 전달되는 오브젝트 파라미터는 WP_REST_REQUST 오브젝트로,get_body()
를 반환하는 메서드payload/post body
HTTP Post Request를 지정합니다.
function create_city_from_data(WP_REST_Request $req) {
$body = $req->get_body()
return ['req' => $body];
}
나는 오늘 이 기사를 읽으면서 이것에 대해 알게 되었다.
또, 메뉴얼을 검색할 필요가 있는 경우(위의 「」와 같이) 메서드시그니처내의 오브젝트 타입을 선언할 수도 있습니다.
CURL 요청:
$url = $your_url; // your url should like: http://host.com/wp-json/v1/'.$key
$post_string = json_encode($post_data);// make json string of post data
$ch = curl_init(); //curl initialisation
curl_setopt($ch, CURLOPT_URL, $url); // add url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // get return value
curl_setopt($ch, CURLOPT_POST, true); // false for GET request
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); // add post data
curl_setopt($crl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($post_string))
);// add header
$output = curl_exec($ch);
curl_close($ch); // close curl
$error = curl_error($ch); // get error
if(!$error){
return json_decode($output);
}else{
return $error;
}
PLUGIN 컨텍스트의 요청 처리:
public static function handle_requests(WP_REST_Request $request){
$return_data = [];
//get GET params
$key = $request['key'];
//get POST values
$post_data = json_decode($request->get_body());
//$return_data = $post_data;
if ( empty( $return_data ) ) {
return new WP_Error( 'error', 'Invalid Request', array( 'status' => 404 ) );
}else{
return $return_data;
}
}
WP REST API 액션:
add_action( 'rest_api_init', function () {
register_rest_route( '/v1', '/(?P<key>[\w]+)', array(
'methods' => ['GET', 'POST'],
'callback' => 'YOUR_CLASS::handle_requests',
'permission_callback' => '__return_true'
) );
} );
//permission_callback need to add for wordpress newer versions.
언급URL : https://stackoverflow.com/questions/41362277/wp-rest-api-custom-end-point-post-request
'programing' 카테고리의 다른 글
json.dumps와 json.load의 차이점은 무엇입니까? (0) | 2023.02.14 |
---|---|
wp_nav_menu() 현재 메뉴 항목에 "액티브" 클래스를 추가하는 방법(간단한 방법) (0) | 2023.02.14 |
여러 프로파일이 활성화되지 않은 경우 조건부로 Bean을 선언하려면 어떻게 해야 합니까? (0) | 2023.02.14 |
스프링 부트 2.4.0 핸들러 타입InterceptorAdapter는 사용되지 않습니다. (0) | 2023.02.14 |
"좋아요"를 사용하여 MongoDB에 문의하는 방법 (0) | 2023.02.14 |