Viết options page 2 form trên 1 trang

Đoạn code bên dưới sẽ tạo một trang options trong bảng điều khiển admin của WordPress. Nếu như thông thường, bạn tạo trang settings chỉ có 1 form và 1 nút lưu, bây giờ bạn cũng dựa vào Settings API của WordPress tạo trang settings có nhiều hơn 1 form.

<?php

abstract class HOCWP_Theme_Admin_Setting_Page {
	public $page_title;
	public $menu_title;
	public $capability;
	public $menu_slug;
	public $function = '';

	public $tabs;

	public $icon_url = '';
	public $position = null;

	public $is_submenu = true;
	public $parent_slug;

	public $option_name;
	public $settings;
	public $settings_section;
	public $settings_field;

	private $options;

	public function __construct() {
		$this->set_menu_info();
		$this->set_settings_info();
		add_action( 'admin_menu', array( $this, 'admin_menu_action' ) );
		add_action( 'admin_init', array( $this, 'settings_init' ) );
		$GLOBALS['hocwp_theme']->options[ $this->menu_slug ] = $this;
	}

	public function settings_init() {
		/**
		 * Register Setting
		 */
		$defaults = array(
			'option_group' => $this->menu_slug,
			'option_name'  => $this->menu_slug,
			'args'         => array( $this, 'sanitize' )
		);
		if ( ! is_array( $this->settings ) ) {
			$this->settings = array( $defaults );
		}
		foreach ( (array) $this->settings as $setting ) {
			$setting = wp_parse_args( $setting, $defaults );
			register_setting( $setting['option_group'], $setting['option_name'], $setting['args'] );
		}
		/**
		 * Add settings section
		 */
		$defaults = array(
			'page'         => $this->menu_slug,
			'callback'     => null,
			'option_group' => 'default'
		);
		foreach ( (array) $this->settings_section as $section ) {
			$section = wp_parse_args( $section, $defaults );
			add_settings_section( $section['id'], $section['title'], $section['callback'], $section['page'] );
		}
		/**
		 * Add Settings Field
		 */
		if ( ! isset( $this->option_name ) || empty( $this->option_name ) ) {
			$this->option_name = $this->menu_slug;
		}
		$defaults = array(
			'page'     => $this->menu_slug,
			'callback' => array( $this, 'field_callback' ),
			'section'  => 'default',
			'args'     => array(
				'type' => 'string'
			)
		);
		foreach ( (array) $this->settings_field as $field ) {
			$field = wp_parse_args( $field, $defaults );
			if ( ! isset( $field['args']['name'] ) ) {
				$field['args']['name'] = $field['id'];
			}
			if ( ! isset( $field['args']['option_name'] ) ) {
				$option_group = isset( $field['option_group'] ) ? $field['option_group'] : '';
				if ( isset( $this->settings[ $option_group ] ) && isset( $this->settings[ $option_group ]['option_name'] ) ) {
					$field['args']['option_name'] = $this->settings[ $option_group ]['option_name'];
				} else {
					$field['args']['option_name'] = $this->option_name;
				}
			}
			$field['args']['id'] = $field['id'];
			add_settings_field( $field['id'], $field['title'], $field['callback'], $field['page'], $field['section'], $field['args'] );
		}
	}

	public function field_callback( $args ) {
		$type = isset( $args['type'] ) ? $args['type'] : 'string';
		$name = isset( $args['name'] ) ? $args['name'] : '';
		$id   = isset( $args['id'] ) ? $args['id'] : '';
		if ( is_array( $name ) ) {
			if ( empty( $id ) ) {
				$id = implode( '_', $name );
			}
			$name = implode( '][', $name );
		}
		if ( empty( $id ) ) {
			$id = $name;
		}
		$name        = '[' . $name . ']';
		$option_name = isset( $args['option_name'] ) ? $args['option_name'] : '';
		$option_name .= $name;
		$input = new HOCWP_Theme_HTML_Tag( 'input' );
		$input->add_attribute( 'id', $id );
		$input->add_attribute( 'name', $option_name );
		switch ( $type ) {
			default:
				$input->add_attribute( 'type', 'text' );
		}
		$input->output();
	}

	public function sanitize( $input ) {
		$new_input = apply_filters( 'hocwp_sanitize_option', array(), $input, $this );
		$new_input = apply_filters( 'hocwp_sanitize_option_' . $this->menu_slug, array(), $input, $this );

		return $new_input;
	}

	public function admin_menu_action() {
		if ( empty( $this->page_title ) ) {
			$this->page_title = $this->menu_title;
		}
		if ( ! is_callable( $this->function ) ) {
			$this->function = array( $this, 'html' );
		}
		if ( empty( $this->capability ) ) {
			$this->capability = 'manage_options';
		}
		if ( $this->is_submenu ) {
			if ( empty( $this->parent_slug ) ) {
				$this->parent_slug = 'hocwp_theme';
			}
			add_submenu_page( $this->parent_slug, $this->page_title, $this->menu_title, $this->capability, $this->menu_slug, $this->function );
		} else {
			add_menu_page( $this->page_title, $this->menu_title, $this->capability, $this->menu_slug, $this->function, $this->icon_url, $this->position );
		}
	}

	abstract protected function set_menu_info();

	abstract protected function set_settings_info();

	abstract protected function html();
}

class HOCWP_Theme_Admin_Setting_Page_Development extends HOCWP_Theme_Admin_Setting_Page {
	public function set_menu_info() {
		$this->menu_title = __( 'Development', 'hocwp-theme' );
		$this->menu_slug  = 'hocwp_theme_development';
	}

	public function set_settings_info() {
		$this->tabs     = array(
			'release' => __( 'Release', 'hocwp-theme' ),
			'test'    => 'Test tab'
		);
		$this->settings = array(
			'test_group' => array(
				'option_group' => 'test_group',
				'option_name'  => 'test_name',
				'id'           => 'test',
				'title'        => 'Test Settings',
				'description'  => 'lorem ipsum',
				'sections'     => array(
					'test_section'
				)
			),
			'tit_group'  => array(
				'option_group' => 'tit_group',
				'option_name'  => 'tit_name',
				'id'           => 'tit',
				'title'        => 'tit setting',
				'description'  => 'lorem ipsum'
			)
		);
		array_pop( $this->settings );
		$this->settings_section = array(
			array(
				'id'    => 'test_sec',
				'title' => 'Test Section',
				'page'  => 'test_section'
			)
		);
		$this->settings_field   = array(
			array(
				'id'           => 'test_group_field',
				'title'        => 'Test field',
				'page'         => 'test_section',
				'section'      => 'test_sec',
				'option_group' => 'test_group',
				'args'         => array(
					'name' => array( 'test', 'group', 'field' )
				)
			)
		);
	}

	public function html() {
		load_template( HOCWP_THEME_CORE_PATH . '/admin/views/admin-page-development.php' );
	}
}

new HOCWP_Theme_Admin_Setting_Page_Development();

Đoạn code bên trên không thể chạy được khi bạn cóp dán mà không chỉnh sửa lại. Bạn có thể tham khảo hoặc chỉ dành cho các thành viên, lưu hành nội bộ.

Viết options page 2 form hoàn chỉnh

Đoạn code bên dưới là ví dụ hoàn chỉnh hơn, bạn có thể sao chép và bỏ vào tập tin functions.php của giao diện để chạy thử ngay.

class Test_Options {

	function __construct() {
		add_action( 'admin_menu', array( $this, 'add_plugin_settings_menu' ) );
		add_action( 'admin_init', array( $this, 'register_settings' ) );
	}

	function add_plugin_settings_menu() {
		// add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function )
		add_options_page( 'Test Plugin', 'Test', 'manage_options', 'test-plugin', array(
			$this,
			'create_plugin_settings_page'
		) );
	}

	function create_plugin_settings_page() {
		?>
		<div class="wrap">
			<h2>Settings</h2>

			<form method="post" action="options.php">
				<?php
				// This prints out all hidden setting fields
				// settings_fields( $option_group )
				settings_fields( 'main-settings-group' );
				// do_settings_sections( $page )
				do_settings_sections( 'test-plugin-main-settings-section' );
				?>
				<?php submit_button( 'Save Changes' ); ?>
			</form>

			<form method="post" action="options.php">
				<?php
				// This prints out all hidden setting fields
				// settings_fields( $option_group )
				settings_fields( 'additional-settings-group' );
				// do_settings_sections( $page )	
				do_settings_sections( 'test-plugin-additional-settings-section' );
				?>
				<?php submit_button( 'Save Changes' ); ?>
			</form>
		</div>
		<?php
	}

	function register_settings() {

		// add_settings_section( $id, $title, $callback, $page )
		add_settings_section(
			'main-settings-section',
			'Main Settings',
			array( $this, 'print_main_settings_section_info' ),
			'test-plugin-main-settings-section'
		);

		// add_settings_field( $id, $title, $callback, $page, $section, $args )
		add_settings_field(
			'some-setting',
			'Some Setting',
			array( $this, 'create_input_some_setting' ),
			'test-plugin-main-settings-section',
			'main-settings-section'
		);

		// register_setting( $option_group, $option_name, $sanitize_callback )
		register_setting( 'main-settings-group', 'test_plugin_main_settings_arraykey', array(
			$this,
			'plugin_main_settings_validate'
		) );

		// add_settings_section( $id, $title, $callback, $page )
		add_settings_section(
			'additional-settings-section',
			'Additional Settings',
			array( $this, 'print_additional_settings_section_info' ),
			'test-plugin-additional-settings-section'
		);

		// add_settings_field( $id, $title, $callback, $page, $section, $args )
		add_settings_field(
			'another-setting',
			'Another Setting',
			array( $this, 'create_input_another_setting' ),
			'test-plugin-additional-settings-section',
			'additional-settings-section'
		);

		// register_setting( $option_group, $option_name, $sanitize_callback )
		register_setting( 'additional-settings-group', 'test_plugin_additonal_settings_arraykey', array(
			$this,
			'plugin_additional_settings_validate'
		) );
	}

	function print_main_settings_section_info() {
		echo '<p>Main Settings Description.</p>';
	}

	function create_input_some_setting() {
		$options = get_option( 'test_plugin_main_settings_arraykey' );
		?><input type="text" name="test_plugin_main_settings_arraykey[some-setting]"
		         value="<?php echo $options['some-setting']; ?>" /><?php
	}

	function plugin_main_settings_validate( $arr_input ) {
		$options                 = get_option( 'test_plugin_main_settings_arraykey' );
		$options['some-setting'] = trim( $arr_input['some-setting'] );

		return $options;
	}

	function print_additional_settings_section_info() {
		echo '<p>Additional Settings Description.</p>';
	}

	function create_input_another_setting() {
		$options = get_option( 'test_plugin_additonal_settings_arraykey' );
		?><input type="text" name="test_plugin_additonal_settings_arraykey[another-setting]"
		         value="<?php echo $options['another-setting']; ?>" /><?php
	}

	function plugin_additional_settings_validate( $arr_input ) {
		$options                    = get_option( 'test_plugin_additonal_settings_arraykey' );
		$options['another-setting'] = trim( $arr_input['another-setting'] );

		return $options;
	}

}

new Test_Options();

Không có bình luận.

Bạn có thể trở thành người đầu tiên để lại bình luận.

Trả lời

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *