워드프레스 AJAX란 무엇인가?
AJAX(Asynchronous JavaScript and XML)는 웹 페이지를 새로고침하지 않고도 서버와 데이터를 주고받을 수 있는 기술이다. 워드프레스에서는 플러그인 개발 시 AJAX를 활용해 사용자 경험을 크게 개선할 수 있다. 특히 특정 div 컨테이너의 값을 동적으로 업데이트하는 데 매우 유용하다.
워드프레스의 AJAX는 admin-ajax.php를 통해 요청을 주고받으며, 보안과 관리의 편리함까지 제공한다. 이를 활용하면 실시간 댓글, 좋아요 버튼, 무한 스크롤, 필터링된 콘텐츠 출력 등 다양한 기능을 구현할 수 있다.
AJAX 워드프레스 플러그인 동작 원리
AJAX가 워드프레스 플러그인에서 어떻게 작동하는지 이해하려면 다음 흐름을 알아야 한다.
- 프론트엔드 요청: JavaScript (jQuery)로 AJAX 요청 발생.
- 서버 처리: 워드프레스가 functions.php 또는 플러그인 파일 내에서 요청을 처리.
- 응답 전달: 서버가 JSON, HTML, 또는 텍스트 데이터를 프론트엔드로 반환.
- 프론트엔드 업데이트: 반환된 데이터로 div 컨테이너 내용을 갱신.
이 과정을 통해 사이트는 페이지 전체를 새로고침할 필요 없이 부분적으로 업데이트된다.
AJAX 요청용 jQuery 코드 작성법
jQuery의 역할과 기본 구조
워드프레스 플러그인에서 AJAX를 쓰려면 jQuery 코드가 필요하다. 일반적인 패턴은 아래와 같다.
jQuery(document).ready(function($) {
$('#myButton').on('click', function(e) {
e.preventDefault();
var data = {
action: 'my_custom_action',
custom_param: '값'
};
$.post(my_ajax_object.ajax_url, data, function(response) {
$('#myDiv').html(response);
});
});
});
이 코드에서:
- my_ajax_object.ajax_url은 워드프레스의 admin-ajax.php 경로.
- action 값은 서버에서 후킹할 이름.
- response는 서버에서 반환한 데이터.
wp_localize_script 사용법
my_ajax_object는 wp_localize_script로 등록해야 한다.
wp_enqueue_script('my-script', plugin_dir_url(__FILE__) . 'js/my-script.js', array('jquery'), '1.0', true);
wp_localize_script('my-script', 'my_ajax_object', array('ajax_url' => admin_url('admin-ajax.php')));
이 작업 없이는 jQuery에서 AJAX 요청 경로를 알 수 없다.
functions.php에서 AJAX 요청 처리
add_action과 콜백 함수 연결
워드프레스는 AJAX 요청을 add_action 훅을 통해 처리한다.
add_action('wp_ajax_my_custom_action', 'my_custom_callback');
add_action('wp_ajax_nopriv_my_custom_action', 'my_custom_callback');
function my_custom_callback() {
$value = sanitize_text_field($_POST['custom_param']);
$response = '서버에서 반환한 값: ' . $value;
echo $response;
wp_die(); // 종료 필수
}
- wp_ajax_ + action 이름: 로그인한 사용자 요청.
- wp_ajax_nopriv_ + action 이름: 비로그인 사용자 요청.
- wp_die(): AJAX 요청 끝에서 꼭 호출해줘야 워드프레스가 정상 종료.
보안: nonce 사용하기
AJAX 요청 보안을 강화하려면 nonce를 활용한다.
wp_localize_script('my-script', 'my_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('my_nonce_action')
));
그리고 jQuery에서 이 nonce를 함께 전송한다.
div 컨테이너 값 변경 실전 예제
실제 UI에 적용하기
예를 들어, 상품 목록에서 필터 버튼 클릭 시 카테고리별 상품만 div에 출력하고 싶다면:
- HTML
<div id="product-list"></div>
<button class="filter-btn" data-category="books">책</button>
<button class="filter-btn" data-category="electronics">전자제품</button>
- jQuery
$('.filter-btn').on('click', function() {
var category = $(this).data('category');
$.post(my_ajax_object.ajax_url, {
action: 'filter_products',
category: category,
nonce: my_ajax_object.nonce
}, function(response) {
$('#product-list').html(response);
});
});
- PHP
add_action('wp_ajax_filter_products', 'filter_products_callback');
add_action('wp_ajax_nopriv_filter_products', 'filter_products_callback');
function filter_products_callback() {
check_ajax_referer('my_nonce_action', 'nonce');
$category = sanitize_text_field($_POST['category']);
$products = get_products_by_category($category);
foreach ($products as $product) {
echo '<div>' . esc_html($product->name) . '</div>';
}
wp_die();
}
get_products_by_category 함수 예제
function get_products_by_category($category) {
global $wpdb;
return $wpdb->get_results($wpdb->prepare(
"SELECT * FROM wp_products WHERE category = %s", $category
));
}
AJAX 워드프레스 플러그인 성능 최적화
1. 응답 데이터 최소화
불필요한 HTML, CSS, JavaScript를 응답 데이터에 넣지 말고 최소한의 데이터만 전송한다. 예: JSON으로 전송하고 jQuery에서 템플릿 처리.
2. 서버 쿼리 최적화
$wpdb->prepare로 SQL 인젝션을 막고, 반드시 인덱스가 잡힌 컬럼으로 쿼리 성능을 높인다.
3. 캐싱 활용
AJAX 요청마다 DB를 직접 조회하면 서버 부하가 크다. transient API나 외부 캐싱 플러그인을 활용해 자주 호출되는 데이터는 캐싱하자.
$cache = get_transient('filtered_products_' . $category);
if (false === $cache) {
$products = get_products_by_category($category);
set_transient('filtered_products_' . $category, $products, 12 * HOUR_IN_SECONDS);
} else {
$products = $cache;
}
실전 문제 해결: AJAX가 동작하지 않을 때 점검 리스트
1. admin-ajax.php 경로 확인
my_ajax_object.ajax_url 값이 올바른지 반드시 체크.
2. action 이름 일치 여부
프론트엔드와 서버에서 동일한 action 이름 사용.
3. nonce 미스매치
check_ajax_referer로 검사 시 nonce 값 누락 혹은 잘못된 값.
4. wp_die() 누락
PHP 콜백에서 wp_die()를 빠뜨리면 서버 응답이 꼬인다.
5. jQuery 충돌
다른 플러그인에서 jQuery 버전을 덮어쓰거나 $ 사용 충돌.
결론
워드프레스 AJAX를 완벽히 이해하면 페이지를 리로드하지 않고 동적인 사용자 경험을 제공할 수 있다. 이 글에서 배운 jQuery 요청, functions.php 처리, 보안, 성능 최적화까지 모두 적용해보면, 단순한 블로그부터 복잡한 전자상거래 사이트까지 확장성이 극대화된다.
단순히 복사해 붙여넣는 코드를 넘어, 왜 이렇게 설계되었는지 이해하고 적용하면 다른 사이트들과 차별화된 강력한 웹사이트를 만들 수 있다.
'자바스크립트' 카테고리의 다른 글
자바스크립트에서 가장 자주 사용되는 내장 함수 정리 (0) | 2024.03.05 |
---|