123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- <?php
- /*
- Description: A framework for building theme options.
- Author: Devin Price
- Author URI: http://www.wptheming.com
- License: GPLv2
- Version: 1.4
- */
- /*
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- /* If the user can't edit theme options, no use running this plugin */
- add_action('init', 'optionsframework_rolescheck' );
- function optionsframework_rolescheck () {
- if ( current_user_can( 'edit_theme_options' ) ) {
- // If the user can edit theme options, let the fun begin!
- add_action( 'admin_menu', 'optionsframework_add_page');
- add_action( 'admin_init', 'optionsframework_init' );
- add_action( 'admin_init', 'optionsframework_mlu_init' );
- add_action( 'wp_before_admin_bar_render', 'optionsframework_adminbar' );
- }
- }
- /* Loads the file for option sanitization */
- add_action('init', 'optionsframework_load_sanitization' );
- function optionsframework_load_sanitization() {
- require_once dirname( __FILE__ ) . '/options-sanitize.php';
- }
- /*
- * Creates the settings in the database by looping through the array
- * we supplied in options.php. This is a neat way to do it since
- * we won't have to save settings for headers, descriptions, or arguments.
- *
- * Read more about the Settings API in the WordPress codex:
- * http://codex.wordpress.org/Settings_API
- *
- */
- function optionsframework_init() {
- // Include the required files
- require_once dirname( __FILE__ ) . '/options-interface.php';
- require_once dirname( __FILE__ ) . '/options-medialibrary-uploader.php';
-
- // Loads the options array from the theme
- if ( $optionsfile = locate_template( array('includes/options.php') ) ) {
- require_once($optionsfile);
- }
- else if (file_exists( dirname( __FILE__ ) . '/includes/options.php' ) ) {
- require_once dirname( __FILE__ ) . '/includes/options.php';
- }
-
- $optionsframework_settings = get_option('optionsframework' );
-
- // Updates the unique option id in the database if it has changed
- optionsframework_option_name();
-
- // Gets the unique id, returning a default if it isn't defined
- if ( isset($optionsframework_settings['id']) ) {
- $option_name = $optionsframework_settings['id'];
- }
- else {
- $option_name = 'optionsframework';
- }
-
- // If the option has no saved data, load the defaults
- if ( ! get_option($option_name) ) {
- optionsframework_setdefaults();
- }
-
- // Registers the settings fields and callback
- register_setting( 'optionsframework', $option_name, 'optionsframework_validate' );
-
- // Change the capability required to save the 'optionsframework' options group.
- add_filter( 'option_page_capability_optionsframework', 'optionsframework_page_capability' );
- }
- /**
- * Ensures that a user with the 'edit_theme_options' capability can actually set the options
- * See: http://core.trac.wordpress.org/ticket/14365
- *
- * @param string $capability The capability used for the page, which is manage_options by default.
- * @return string The capability to actually use.
- */
- function optionsframework_page_capability( $capability ) {
- return 'edit_theme_options';
- }
- /*
- * Adds default options to the database if they aren't already present.
- * May update this later to load only on plugin activation, or theme
- * activation since most people won't be editing the options.php
- * on a regular basis.
- *
- * http://codex.wordpress.org/Function_Reference/add_option
- *
- */
- function optionsframework_setdefaults() {
-
- $optionsframework_settings = get_option('optionsframework');
- // Gets the unique option id
- $option_name = $optionsframework_settings['id'];
-
- /*
- * Each theme will hopefully have a unique id, and all of its options saved
- * as a separate option set. We need to track all of these option sets so
- * it can be easily deleted if someone wishes to remove the plugin and
- * its associated data. No need to clutter the database.
- *
- */
-
- if ( isset($optionsframework_settings['knownoptions']) ) {
- $knownoptions = $optionsframework_settings['knownoptions'];
- if ( !in_array($option_name, $knownoptions) ) {
- array_push( $knownoptions, $option_name );
- $optionsframework_settings['knownoptions'] = $knownoptions;
- update_option('optionsframework', $optionsframework_settings);
- }
- } else {
- $newoptionname = array($option_name);
- $optionsframework_settings['knownoptions'] = $newoptionname;
- update_option('optionsframework', $optionsframework_settings);
- }
-
- // Gets the default options data from the array in options.php
- $options = optionsframework_options();
-
- // If the options haven't been added to the database yet, they are added now
- $values = of_get_default_values();
-
- if ( isset($values) ) {
- add_option( $option_name, $values ); // Add option with default settings
- }
- }
- /* Add a subpage called "Theme Options" to the appearance menu. */
- if ( !function_exists( 'optionsframework_add_page' ) ) {
- function optionsframework_add_page() {
- $of_page = add_theme_page( __( 'Foto Theme Options', 'foto' ), __( 'Foto Theme Options', 'foto' ), 'edit_theme_options', 'options-framework','optionsframework_page');
-
- // Load the required CSS and javscript
- add_action('admin_enqueue_scripts', 'optionsframework_load_scripts');
- add_action( 'admin_print_styles-' . $of_page, 'optionsframework_load_styles' );
- }
-
- }
- /* Loads the CSS */
- function optionsframework_load_styles() {
- wp_enqueue_style('optionsframework', OPTIONS_FRAMEWORK_DIRECTORY . 'css/optionsframework.css');
- if ( !wp_style_is( 'wp-color-picker','registered' ) ) {
- wp_register_style('wp-color-picker', OPTIONS_FRAMEWORK_DIRECTORY . 'css/color-picker.min.css');
- }
- wp_enqueue_style( 'wp-color-picker' );
- }
- /* Loads the javascript */
- function optionsframework_load_scripts($hook) {
- if ( 'appearance_page_options-framework' != $hook )
- return;
- // Enqueue colorpicker scripts for versions below 3.5
- // for compatibility
-
- if ( !wp_script_is( 'wp-color-picker', 'registered' ) ) {
- wp_register_script( 'iris', OPTIONS_FRAMEWORK_DIRECTORY . 'js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), false, 1 );
- wp_register_script( 'wp-color-picker', OPTIONS_FRAMEWORK_DIRECTORY . 'js/color-picker.min.js', array( 'jquery', 'iris' ) );
- $colorpicker_l10n = array(
- 'clear' => __( 'Clear', 'foto' ),
- 'defaultString' => __( 'Default', 'foto' ),
- 'pick' => __( 'Select Color', 'foto' )
- );
- wp_localize_script( 'wp-color-picker', 'wpColorPickerL10n', $colorpicker_l10n );
- }
-
- // Enqueue custom option panel JS
- wp_enqueue_script( 'options-custom', OPTIONS_FRAMEWORK_DIRECTORY . 'js/options-custom.js', array( 'jquery','wp-color-picker' ) );
- // Inline scripts from options-interface.php
- add_action( 'admin_head', 'of_admin_head' );
- }
- function of_admin_head() {
- // Hook to add custom scripts
- do_action( 'optionsframework_custom_scripts' );
- }
- /*
- * Builds out the options panel.
- *
- * If we were using the Settings API as it was likely intended we would use
- * do_settings_sections here. But as we don't want the settings wrapped in a table,
- * we'll call our own custom optionsframework_fields. See options-interface.php
- * for specifics on how each individual field is generated.
- *
- * Nonces are provided using the settings_fields()
- *
- */
- if ( !function_exists( 'optionsframework_page' ) ) :
- function optionsframework_page() {
- settings_errors(); ?>
- <div id="optionsframework-wrap" class="wrap">
- <?php screen_icon( 'themes' ); ?>
- <h2 class="nav-tab-wrapper">
- <?php echo optionsframework_tabs(); ?>
- </h2>
- <div id="optionsframework-metabox" class="metabox-holder">
- <div id="optionsframework" class="postbox">
- <form action="options.php" method="post">
- <?php settings_fields('optionsframework'); ?>
- <?php optionsframework_fields(); /* Settings */ ?>
- <div id="optionsframework-submit">
- <input type="submit" class="button-primary" name="update" value="<?php esc_attr_e( 'Save Options', 'foto' ); ?>" />
- <input type="submit" class="reset-button button-secondary" name="reset" value="<?php esc_attr_e( 'Restore Defaults', 'foto' ); ?>" onclick="return confirm( '<?php print esc_js( __( 'Click OK to reset. Any theme settings will be lost!', 'foto' ) ); ?>' );" />
- <div class="clear"></div>
- </div>
- </form>
- </div> <!-- / #container -->
- </div>
- <?php do_action('optionsframework_after'); ?>
- </div> <!-- / .wrap -->
-
- <?php
- }
- endif;
- /**
- * Validate Options.
- *
- * This runs after the submit/reset button has been clicked and
- * validates the inputs.
- *
- * @uses $_POST['reset'] to restore default options
- */
- function optionsframework_validate( $input ) {
- /*
- * Restore Defaults.
- *
- * In the event that the user clicked the "Restore Defaults"
- * button, the options defined in the theme's options.php
- * file will be added to the option for the active theme.
- */
- if ( isset( $_POST['reset'] ) ) {
- add_settings_error( 'options-framework', 'restore_defaults', __( 'Default options restored.', 'foto' ), 'updated fade' );
- return of_get_default_values();
- }
-
- /*
- * Update Settings
- *
- * This used to check for $_POST['update'], but has been updated
- * to be compatible with the theme customizer introduced in WordPress 3.4
- */
-
- $clean = array();
- $options = optionsframework_options();
- foreach ( $options as $option ) {
- if ( ! isset( $option['id'] ) ) {
- continue;
- }
- if ( ! isset( $option['type'] ) ) {
- continue;
- }
- $id = preg_replace( '/[^a-zA-Z0-9._\-]/', '', strtolower( $option['id'] ) );
- // Set checkbox to false if it wasn't sent in the $_POST
- if ( 'checkbox' == $option['type'] && ! isset( $input[$id] ) ) {
- $input[$id] = false;
- }
- // Set each item in the multicheck to false if it wasn't sent in the $_POST
- if ( 'multicheck' == $option['type'] && ! isset( $input[$id] ) ) {
- foreach ( $option['options'] as $key => $value ) {
- $input[$id][$key] = false;
- }
- }
- // For a value to be submitted to database it must pass through a sanitization filter
- if ( has_filter( 'of_sanitize_' . $option['type'] ) ) {
- $clean[$id] = apply_filters( 'of_sanitize_' . $option['type'], $input[$id], $option );
- }
- }
-
- // Hook to run after validation
- do_action( 'optionsframework_after_validate', $clean );
-
- return $clean;
- }
- /**
- * Display message when options have been saved
- */
-
- function optionsframework_save_options_notice() {
- add_settings_error( 'options-framework', 'save_options', __( 'Options saved.', 'foto' ), 'updated fade' );
- }
- add_action( 'optionsframework_after_validate', 'optionsframework_save_options_notice' );
- /**
- * Format Configuration Array.
- *
- * Get an array of all default values as set in
- * options.php. The 'id','std' and 'type' keys need
- * to be defined in the configuration array. In the
- * event that these keys are not present the option
- * will not be included in this function's output.
- *
- * @return array Rey-keyed options configuration array.
- *
- * @access private
- */
-
- function of_get_default_values() {
- $output = array();
- $config = optionsframework_options();
- foreach ( (array) $config as $option ) {
- if ( ! isset( $option['id'] ) ) {
- continue;
- }
- if ( ! isset( $option['std'] ) ) {
- continue;
- }
- if ( ! isset( $option['type'] ) ) {
- continue;
- }
- if ( has_filter( 'of_sanitize_' . $option['type'] ) ) {
- $output[$option['id']] = apply_filters( 'of_sanitize_' . $option['type'], $option['std'], $option );
- }
- }
- return $output;
- }
- /**
- * Add Theme Options menu item to Admin Bar.
- */
- function optionsframework_adminbar() {
- global $wp_admin_bar;
- $wp_admin_bar->add_menu( array(
- 'parent' => 'appearance',
- 'id' => 'of_theme_options',
- 'title' => __( 'Theme Options', 'foto' ),
- 'href' => admin_url( 'themes.php?page=options-framework' )
- ));
- }
- if ( ! function_exists( 'of_get_option' ) ) {
- /**
- * Get Option.
- *
- * Helper function to return the theme option value.
- * If no value has been saved, it returns $default.
- * Needed because options are saved as serialized strings.
- */
-
- function of_get_option( $name, $default = false ) {
- $config = get_option( 'optionsframework' );
- if ( ! isset( $config['id'] ) ) {
- return $default;
- }
- $options = get_option( $config['id'] );
- if ( isset( $options[$name] ) ) {
- return $options[$name];
- }
- return $default;
- }
- }
|