2013-08-06 1 views
1

Wordpress 용 사용자 정의 설정 페이지를 추가하는 데 문제가 있습니다. 특히 저장 옵션을 얻는 데 문제가 있습니다.Wordpress 사용자 정의 옵션이 저장되지 않습니다.

다른 예제와 다른 기능이 같은 것을 다르게 설명하기 때문에 이에 대한 설명서는 부족하고 일관성이없는 것처럼 보입니다.

wordpress codex의 최신 예제는 옵션을 저장하기 위해 sanitize 콜백 함수를 사용합니다. 그러나 add_settings_field() 문서에서는 옵션 저장이 배후에서 이루어져야한다고 말합니다. 어쨌든 세이브 콜백을 사용하는 것이 좋습니다.

나는 여러 가지 다른 접근법을 시도했으며 한 번에 내 코드가 필드 중 하나만 저장할 수 있었지만 전부는 아니 었습니다.

내 현재 코드 :

class wwtkSettings { 
public function __construct() { 
    if (is_admin()){ 
     add_action('admin_menu', array($this, 'add_plugin_page')); 
     add_action('admin_init', array($this, 'page_init')); 
    } 
} 

public function add_plugin_page(){ 
    add_options_page('WWTK Settings', 'WWTK settings', 'manage_options', 'wwtk-settings', array($this, 'create_admin_page')); 
} 

public function create_admin_page() { 
    ?> 
    <div class="wrap"> 
     <?php screen_icon(); ?> 
     <h2>WWTK Settings</h2> 
     <form method="post" action="options.php"> 
      <?php 
      settings_fields('wwtk-setting-group'); 
      do_settings_sections('wwtk-settings'); 
      ?> 
      <?php submit_button(); ?> 
     </form> 
    </div> 
    <?php 
} 

public function page_init() { 
    register_setting('wwtk-setting-group', 'wwtk-setting-group', array($this, 'wwtk_validate_options')); 

    add_settings_section(
     'wwtk-settings-section', 
     'Categories and pages', 
     array($this, 'print_section_info'), 
     'wwtk-settings' 
     ); 

    add_settings_field(
     'frontpage', 
     'Frontpage category:', 
     array($this, 'create_category_field'), 
     'wwtk-settings', 
     'wwtk-settings-section', 
     'frontpage' 
     ); 
    add_settings_field(
     'category1', 
     'Category & page 1', 
     array($this, 'create_category_field'), 
     'wwtk-settings', 
     'wwtk-settings-section', 
     'category1' 
     ); 
    add_settings_field(
     'category2', 
     'Category & page 2', 
     array($this, 'create_category_field'), 
     'wwtk-settings', 
     'wwtk-settings-section', 
     'category2' 
     ); 
    add_settings_field(
     'category3', 
     'Category & page 3', 
     array($this, 'create_category_field'), 
     'wwtk-settings', 
     'wwtk-settings-section', 
     'category3' 
     ); 
} 

//TODO: check if category and page exist. and sanitize! 
public function wwtk_validate_options($input) { 
    return $input; 
} 

public function print_section_info(){ 
    print 'Enter the names of categories that should be displayed on the page with the same name(both must exist):'; 
} 

public function create_category_field($args){ 
    ?><input type="text" id="<?php echo $args ?>" name="wwtk-setting-group" value="<?php echo get_option('wwtk-setting-group['.$args.']'); ?>" /><?php 
} 

}

+1

는 플러그인이 모든 코드인가? 나는 해결책을 찾고 있지만 도움이 필요한 모든 코드가 있는지 확인하고 싶습니다.) – Ian

+0

이것은 사용자 지정 테마 용이며 nav menues를 추가하고 축소판에 대한 지원을 추가하는 것을 제외하고는 전체 기능입니다. php. 도움을 주셔서 대단히 감사드립니다. – Jeger

+0

요점은 각 페이지에서 특정 유형의 게시물을 표시하기 위해 저장된 옵션을 이용하는 것입니다. 여러 가지 방법으로 실험하고 싶었지만 하나 이상의 사용자 지정 옵션을 저장하려고 할 때 막혔습니다. – Jeger

답변

2
/* code similar to your example */ 

class MySettingsPage{ 
/** 
* Holds the values to be used in the fields callbacks 
*/ 
private $options; 

/** 
* Start up 
*/ 
public function __construct() 
{ 
    add_action('admin_menu', array($this, 'add_plugin_page')); 
    add_action('admin_init', array($this, 'page_init')); 
} 

/** 
* Add options page 
*/ 
public function add_plugin_page() 
{ 
    // This page will be under "Settings" 
    add_options_page(
     'Settings Admin', 
     'My Settings', 
     'manage_options', 
     'my-setting-admin', 
     array($this, 'create_admin_page') 
    ); 
} 

/** 
* Options page callback 
*/ 
public function create_admin_page() 
{ 
    // Set class property 
    $this->options = get_option('my_option_name'); 
    ?> 
    <div class="wrap"> 
     <?php screen_icon(); ?> 
     <h2>My Settings</h2>   
     <form method="post" action="options.php"> 
     <?php 
      // This prints out all hidden setting fields 
      settings_fields('my_option_group'); 
      do_settings_sections('my-setting-admin'); 
      submit_button(); 
     ?> 
     </form> 
    </div> 
    <?php 
} 

/** 
* Register and add settings 
*/ 
public function page_init() 
{   
    register_setting(
     'my_option_group', // Option group 
     'my_option_name', // Option name 
     array($this, 'sanitize') // Sanitize 
    ); 

    add_settings_section(
     'setting_section_id', // ID 
     'My Custom Settings', // Title 
     array($this, 'print_section_info'), // Callback 
     'my-setting-admin' // Page 
    ); 

    add_settings_field(
     'id_number', // ID 
     'ID Number', // Title 
     array($this, 'id_number_callback'), // Callback 
     'my-setting-admin', // Page 
     'setting_section_id' // Section   
    );  

    add_settings_field(
     'title', 
     'Title', 
     array($this, 'title_callback'), 
     'my-setting-admin', 
     'setting_section_id' 
    );  
} 

/** 
* Sanitize each setting field as needed 
* 
* @param array $input Contains all settings fields as array keys 
*/ 
public function sanitize($input) 
{ 
    if(!is_numeric($input['id_number'])) 
     $input['id_number'] = ''; 

    if(!empty($input['title'])) 
     $input['title'] = sanitize_text_field($input['title']); 

    return $input; 
} 

/** 
* Print the Section text 
*/ 
public function print_section_info() 
{ 
    print 'Enter your settings below:'; 
} 

/** 
* Get the settings option array and print one of its values 
*/ 
public function id_number_callback() 
{ 
    printf(
     '<input type="text" id="id_number" name="my_option_name[id_number]" value="%s" />', 
     esc_attr($this->options['id_number']) 
    ); 
} 

/** 
* Get the settings option array and print one of its values 
*/ 
public function title_callback() 
{ 
    printf(
     '<input type="text" id="title" name="my_option_name[title]" value="%s" />', 
     esc_attr($this->options['title']) 
    ); 
} 
} 

if(is_admin()) 
    $my_settings_page = new MySettingsPage(); 
관련 문제