wordpress:settings_api
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 다음 판 | 이전 판 | ||
| wordpress:settings_api [2016/01/28 14:49] – 만듦 changwoo | wordpress:settings_api [2016/04/30 18:50] (현재) – [예제 코드] 버그 수정 changwoo | ||
|---|---|---|---|
| 줄 19: | 줄 19: | ||
| [[http:// | [[http:// | ||
| - | | + | register_setting( $option_group, |
| * option_group: | * option_group: | ||
| 줄 25: | 줄 25: | ||
| * sanitize_callback: | * sanitize_callback: | ||
| - | | + | unregister_setting( $option_group, |
| | | ||
| MVC 패턴 관점에서 설명하자면 세팅의 < | MVC 패턴 관점에서 설명하자면 세팅의 < | ||
| 줄 31: | 줄 31: | ||
| ===== 필드와 섹션 ===== | ===== 필드와 섹션 ===== | ||
| - | | + | add_settings_field( $id, $title, $callback, $page, $section, $args ) |
| * id: 이 필드의 태그가 가질 id. 이 id는 실제로 html 태그의 id 속성으로도 되어야 한다. 하지만 세팅값을 저장하고 불러오는 데 있어 id가 반드시 필요한 것은 아니다. | * id: 이 필드의 태그가 가질 id. 이 id는 실제로 html 태그의 id 속성으로도 되어야 한다. 하지만 세팅값을 저장하고 불러오는 데 있어 id가 반드시 필요한 것은 아니다. | ||
| 줄 45: | 줄 45: | ||
| - | | + | add_settings_section( $id, $title, $callback, $page ) |
| * id: 이 섹션의 태그가 가질 id. add_settings_field() 함수의 id 인자와 같은 역할을 한다. | * id: 이 섹션의 태그가 가질 id. add_settings_field() 함수의 id 인자와 같은 역할을 한다. | ||
| 줄 67: | 줄 67: | ||
| </ | </ | ||
| - | | + | settings_fields( $option_group ) |
| 이 함수는 < | 이 함수는 < | ||
| * option_group: | * option_group: | ||
| - | | + | do_settings_sections( $page ) |
| - | | + | do_settings_fields( $page, $section ) |
| | | ||
| 이 두 함수는 MVC 패턴에서 < | 이 두 함수는 MVC 패턴에서 < | ||
| 줄 80: | 줄 80: | ||
| ===== 에러 ===== | ===== 에러 ===== | ||
| - | | + | add_settings_error( $setting, $code, $message, $type ) |
| - | | + | get_settings_errors( $setting, $sanitize ) |
| - | | + | settings_errors( $setting, $sanitize, $hide_on_update ) |
| | | ||
| + | ===== 예제 코드 ===== | ||
| + | 다음은 아주 간단하게 세팅 API의 예제를 작성한 것이다. 위 장황한 설명보다 더욱 도움이 되리라 생각한다. | ||
| + | <code php hand-written-settings-sample.php> | ||
| + | <?php | ||
| + | /** | ||
| + | Plugin Name: My Settings | ||
| + | Version: 1.0 | ||
| + | Author: changwoo | ||
| + | Author URI: mailto:// | ||
| + | License: GPL2 or later | ||
| + | */ | ||
| + | |||
| + | /** | ||
| + | * 메뉴 집어넣는 코드 | ||
| + | */ | ||
| + | add_action( ' | ||
| + | function my_settings_admin_menu() { | ||
| + | |||
| + | add_submenu_page( | ||
| + | ' | ||
| + | 'my settings', | ||
| + | 'my settings', | ||
| + | ' | ||
| + | // | ||
| + | // page slug. | ||
| + | // add_settings_section(), | ||
| + | ' | ||
| + | ' | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * 메뉴 집어넣는 코드 콜백 | ||
| + | */ | ||
| + | function my_settings_output_settings() { ?> | ||
| + | |||
| + | <form method=" | ||
| + | |||
| + | <?php | ||
| + | // register_setting() 의 option_group 인자. | ||
| + | // 이 함수는 몇몇 hidden field 를 생성하는데, | ||
| + | // 그러므로 한 번에 submission 되는 form field 는 모두 같은 option group 이어야 제대로 처리된다는 뜻이다. | ||
| + | settings_fields( ' | ||
| + | ?> | ||
| + | |||
| + | <?php | ||
| + | // do_settings_sections 로 sections, 복수가 쓰인 것에 유의. | ||
| + | // 그러므로 인자는 섹션의 슬러그가 아닌, 페이지의 슬러그여야 한다. | ||
| + | do_settings_sections( ' | ||
| + | ?> | ||
| + | |||
| + | <?php | ||
| + | // 이건 뭐 그냥 템플릿 펑션. | ||
| + | submit_button(); | ||
| + | ?> | ||
| + | </ | ||
| + | |||
| + | <?php } | ||
| + | |||
| + | |||
| + | /** | ||
| + | * 필드 정의 부분. | ||
| + | */ | ||
| + | add_action( ' | ||
| + | |||
| + | /** | ||
| + | * 필드 정의 부분 콜백 | ||
| + | */ | ||
| + | function my_settings_register_settings() { | ||
| + | |||
| + | // 옵션 그룹이란, | ||
| + | // 워드프레스는 폼이 submission 될 때 POST 값에서 그룹이 미리 등록되었는지를 체크한다. | ||
| + | // register_setting 에서 두번째 인자는 옵션 값이다. | ||
| + | // 세 번째는 sanitization 콜백 함수. 문자열이라 오해하지 말 것. | ||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | |||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | register_setting( ' | ||
| + | |||
| + | // 하나의 옵션에 여러 값을 집어 넣는 테크닉이다. PHP 의 serialization 을 이용한다. | ||
| + | register_setting( ' | ||
| + | } | ||
| + | |||
| + | |||
| + | // 섹션과 필드 설정 | ||
| + | add_action( ' | ||
| + | function my_settings_sections_fields() { | ||
| + | |||
| + | // 섹션 A | ||
| + | add_settings_section( ' | ||
| + | |||
| + | add_settings_field( | ||
| + | // id 파라미터이지만, | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ); | ||
| + | |||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | |||
| + | // 섹션 B | ||
| + | add_settings_section( ' | ||
| + | |||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | |||
| + | // 섹션 C | ||
| + | add_settings_section( ' | ||
| + | |||
| + | // 한 옵션 키에 여러 값을 저장하기 | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | add_settings_field( ' | ||
| + | } | ||
| + | |||
| + | /** html 콜백 펑션 */ | ||
| + | function my_settings_common( $args ) { | ||
| + | |||
| + | $id = esc_attr( $args[' | ||
| + | $value = esc_attr( get_option( ' | ||
| + | |||
| + | printf( '< | ||
| + | } | ||
| + | |||
| + | /** html 콜백 펑션 */ | ||
| + | function my_settings_serialized( $args ) { | ||
| + | |||
| + | $id = esc_attr( $args[' | ||
| + | $opt = get_option( ' | ||
| + | $value = isset( $opt[ $args[' | ||
| + | |||
| + | printf( '< | ||
| + | } | ||
| + | |||
| + | // 옵션 값의 validation 처리 | ||
| + | // 어이없게도 아직 settings API 에는 제대로 된 validation 이 없고 일단 sanitize 만 되면 옵션 값은 모두 DB 로 돌진한다. | ||
| + | // 그러므로 만약 옵션 값이 자연수 100 이하의 값만 요구한다 하더라도, | ||
| + | // 그러므로 다음과 같은 우회 방법들을 적절히 찾는 것이 좋다. | ||
| + | // | ||
| + | // 1. 모든 옵션 값들은 디폴트 값을 갖게 하라. | ||
| + | // 2. sanitization 단계에서 validation 을 수행한다. validation 이 fail 하면 settings error 를 띄우고, | ||
| + | // 입력된 값을 세팅 디폴트로 수정한다. | ||
| + | // 3. 사실상 값이 무시된 것으로 간주할 수 있다. | ||
| + | |||
| + | function my_settings_custom_sanitize( $value ) { | ||
| + | |||
| + | $default = ' | ||
| + | |||
| + | $v = (int)$value; | ||
| + | if( ctype_digit( strval( $value ) ) && 0 < $value && $value < 101 ) { | ||
| + | |||
| + | return $value; | ||
| + | } | ||
| + | |||
| + | add_settings_error( ' | ||
| + | |||
| + | return $default; | ||
| + | } | ||
| + | </ | ||
wordpress/settings_api.1453992572.txt.gz · 마지막으로 수정됨: 2016/01/28 14:49 저자 changwoo
