id = $id; $this->title = $title; $this->capability = $capability; // Actions. add_action( 'admin_menu', array( &$this, 'add_page' ) ); add_action( 'admin_init', array( &$this, 'create_settings' ) ); add_action( 'admin_enqueue_scripts', array( &$this, 'scripts' ) ); } /** * Add Settings Theme page. */ public function add_page() { add_theme_page( $this->title, $this->title, $this->capability, $this->id, array( &$this, 'settings_page' ) ); } /** * Load options scripts. */ function scripts() { // Checks if is the settings page. if ( isset( $_GET['page'] ) && $this->id == $_GET['page'] ) { // Color Picker. wp_enqueue_style( 'wp-color-picker' ); wp_enqueue_script( 'wp-color-picker' ); // Media Upload. wp_enqueue_media(); // jQuery UI. wp_enqueue_script( 'jquery-ui-sortable' ); // Theme Options. wp_enqueue_style( 'odin-admin', get_template_directory_uri() . '/core/assets/css/admin.css', array(), null, 'all' ); wp_enqueue_script( 'odin-admin', get_template_directory_uri() . '/core/assets/js/admin.js', array( 'jquery' ), null, true ); // Localize strings. wp_localize_script( 'odin-admin', 'odinAdminParams', array( 'galleryTitle' => __( 'Add images in gallery', 'avalon-b' ), 'galleryButton' => __( 'Add in gallery', 'avalon-b' ), 'galleryRemove' => __( 'Remove image', 'avalon-b' ), 'uploadTitle' => __( 'Choose a file', 'avalon-b' ), 'uploadButton' => __( 'Add file', 'avalon-b' ), ) ); } } /** * Set settings tabs. * * @param array $tabs Settings tabs. */ public function set_tabs( $tabs ) { $this->tabs = $tabs; } /** * Set settings fields * * @param array $fields Settings fields. */ public function set_fields( $fields ) { $this->fields = $fields; } /** * Get current tab. * * @return string Current tab ID. */ protected function get_current_tab() { if ( isset( $_GET['tab'] ) ) { $current_tab = $_GET['tab']; } else { $current_tab = $this->tabs[0]['id']; } return $current_tab; } /** * Get the menu current URL. * * @return string Current URL. */ private function get_current_url() { $url = 'http'; if ( isset( $_SERVER['HTTPS'] ) && 'on' == $_SERVER['HTTPS'] ) { $url .= 's'; } $url .= '://'; if ( '80' != $_SERVER['SERVER_PORT'] ) { $url .= $_SERVER['SERVER_NAME'] . ' : ' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF']; } else { $url .= $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']; } return esc_url( $url ); } /** * Get tab navigation. * * @param string $current_tab Current tab ID. * * @return string Tab Navigation. */ protected function get_navigation( $current_tab ) { $html = ''; echo $html; } /** * Built settings page. */ public function settings_page() { // Get current tag. $current_tab = $this->get_current_tab(); // Opens the wrap. echo '
'; // Display the navigation menu. $this->get_navigation( $current_tab ); // Display erros. settings_errors(); // Creates the option form. echo '
'; foreach ( $this->tabs as $tabs ) { if ( $current_tab == $tabs['id'] ) { // Prints nonce, action and options_page fields. settings_fields( $tabs['id'] ); // Prints settings sections and settings fields. do_settings_sections( $tabs['id'] ); break; } } // Display submit button. submit_button(); // Closes the form. echo '
'; // Closes the wrap. echo '
'; } /** * Create settings. */ public function create_settings() { // Register settings fields. foreach ( $this->fields as $section => $items ) { // Register settings sections. add_settings_section( $section, $items['title'], '__return_false', $items['tab'] ); foreach ( $items['fields'] as $option ) { $type = isset( $option['type'] ) ? $option['type'] : 'text'; $args = array( 'id' => $option['id'], 'tab' => $items['tab'], 'section' => $section, 'options' => isset( $option['options'] ) ? $option['options'] : '', 'default' => isset( $option['default'] ) ? $option['default'] : '', 'attributes' => isset( $option['attributes'] ) ? $option['attributes'] : array(), 'description' => isset( $option['description'] ) ? $option['description'] : '' ); add_settings_field( $option['id'], $option['label'], array( &$this, 'callback_' . $type ), $items['tab'], $section, $args ); } } // Register settings. foreach ( $this->tabs as $tabs ) { register_setting( $tabs['id'], $tabs['id'], array( &$this, 'validate_input' ) ); } } /** * Get Option. * * @param string $tab Tab that the option belongs * @param string $id Option ID. * @param string $default Default option. * * @return array Item options. */ protected function get_option( $tab, $id, $default = '' ) { $options = get_option( $tab ); if ( isset( $options[ $id ] ) ) { $default = $options[ $id ]; } return $default; } /** * Build field attributes. * * @param array $attrs Attributes as array. * * @return string Attributes as string. */ protected function build_field_attributes( $attrs ) { $attributes = ''; if ( ! empty( $attrs ) ) { foreach ( $attrs as $key => $attr ) { $attributes .= ' ' . $key . '="' . $attr . '"'; } } return $attributes; } /** * Input field callback. * * @param array $args Arguments from the option. * * @return string Input field HTML. */ public function callback_input( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; // Sets default type. if ( ! isset( $attrs['type'] ) ) { $attrs['type'] = 'text'; } // Sets current option. $current = esc_html( $this->get_option( $tab, $id, $args['default'] ) ); $html = sprintf( '', $id, $tab, $current, $this->build_field_attributes( $attrs ) ); // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Text field callback. * * @param array $args Arguments from the option. * * @return string Text field HTML. */ public function callback_text( $args ) { // Sets regular text class. $args['attributes']['class'] = 'regular-text'; $this->callback_input( $args ); } /** * Textarea field callback. * * @param array $args Arguments from the option. * * @return string Textarea field HTML. */ public function callback_textarea( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; if ( ! isset( $attrs['cols'] ) ) { $attrs['cols'] = '60'; } if ( ! isset( $attrs['rows'] ) ) { $attrs['rows'] = '5'; } // Sets current option. $current = esc_textarea( $this->get_option( $tab, $id, $args['default'] ) ); $html = sprintf( '', $id, $tab, $current, $this->build_field_attributes( $attrs ) ); // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Editor field callback. * * @param array $args Arguments from the option. * * @return string Editor field HTML. */ public function callback_editor( $args ) { $tab = $args['tab']; $id = $args['id']; $options = $args['options']; // Sets current option. $current = wpautop( $this->get_option( $tab, $id, $args['default'] ) ); // Set default options. if ( empty( $options ) ) { $options = array( 'textarea_rows' => 10 ); } $options[ 'textarea_name' ] = $tab . '[' . $id . ']'; echo '
'; wp_editor( $current, $id, $options ); echo '
'; // Displays the description. if ( $args['description'] ) { echo sprintf( '

%s

', $args['description'] ); } } /** * Checkbox field callback. * * @param array $args Arguments from the option. * * @return string Checkbox field HTML. */ public function callback_checkbox( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; // Sets current option. $current = $this->get_option( $tab, $id, $args['default'] ); $html = sprintf( '', $id, $tab, checked( 1, $current, false ), $this->build_field_attributes( $attrs ) ); // Displays the description. if ( $args['description'] ) { $html .= sprintf( '', $id, $args['description'] ); } echo $html; } /** * Radio field callback. * * @param array $args Arguments from the option. * * @return string Radio field HTML. */ public function callback_radio( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; // Sets current option. $current = $this->get_option( $tab, $id, $args['default'] ); $html = ''; foreach( $args['options'] as $key => $label ) { $item_id = $id . '_' . $key; $key = sanitize_title( $key ); $html .= sprintf( '', $id, $tab, $key, checked( $current, $key, false ), $this->build_field_attributes( $attrs ) ); $html .= sprintf( '
', $item_id, $label ); } // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Select field callback. * * @param array $args Arguments from the option. * * @return string Select field HTML. */ public function callback_select( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; // Sets current option. $current = $this->get_option( $tab, $id, $args['default'] ); // If multiple add a array in the option. $multiple = ( in_array( 'multiple', $attrs ) ) ? '[]' : ''; $html = sprintf( ''; // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Color field callback. * * @param array $args Arguments from the option. * * @return string Color field HTML. */ public function callback_color( $args ) { // Sets color class. $args['attributes']['class'] = 'odin-color-field'; $this->callback_input( $args ); } /** * Upload field callback. * * @param array $args Arguments from the option. * * @return string Upload field HTML. */ public function callback_upload( $args ) { $tab = $args['tab']; $id = $args['id']; $attrs = $args['attributes']; // Sets current option. $current = esc_url( $this->get_option( $tab, $id, $args['default'] ) ); $html = sprintf( ' ', $id, $tab, $current, __( 'Select file', 'avalon-b' ), $this->build_field_attributes( $attrs ) ); // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Image field callback. * * @param array $args Arguments from the option. * * @return string Image field HTML. */ public function callback_image( $args ) { $tab = $args['tab']; $id = $args['id']; // Sets current option. $current = $this->get_option( $tab, $id, $args['default'] ); // Gets placeholder image. $image = get_template_directory_uri() . '/core/assets/images/placeholder.png'; $html = '
'; $html .= '' . $image . ''; if ( ! empty( $current ) ) { $image = wp_get_attachment_image_src( $current, 'thumbnail' ); $image = $image[0]; } $html .= sprintf( '', $id, $tab, $current, $image, __( 'Select image', 'avalon-b' ), __( 'Remove image', 'avalon-b' ) ); $html .= '
'; $html .= '
'; // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * Image Plupload field callback. * * @param array $args Arguments from the option. * * @return string Image Plupload field HTML. */ public function callback_image_plupload( $args ) { $tab = $args['tab']; $id = $args['id']; // Sets current option. $current = $this->get_option( $tab, $id, $args['default'] ); $html = ''; // Displays the description. if ( $args['description'] ) { $html .= sprintf( '

%s

', $args['description'] ); } echo $html; } /** * HTML callback. * * @param array $args Arguments from the option. * * @return string HTML. */ public function callback_html( $args ) { echo $args['description']; } /** * Sanitization fields callback. * * @param string $input The unsanitized collection of options. * * @return string The collection of sanitized values. */ public function validate_input( $input ) { // Create our array for storing the validated options. $output = array(); // Loop through each of the incoming options. foreach ( $input as $key => $value ) { // Check to see if the current option has a value. If so, process it. if ( isset( $input[ $key ] ) ) { $output[ $key ] = apply_filters( 'odin_theme_options_validate_' . $this->id, $value, $key ); } } return $output; } }