$setting ) $checked[$index] = checked( 1, $setting ? 1 : 0, false ); self::_fieldRenderer( 'checkbox', compact( 'id', 'name', 'values', 'checked', 'labels' ) ); } // Renders a radiobox. More than one value should be provided as an option group. static function radiobuttonRenderer( $args ) { $setting = AlsoInThisSeries::config( $args[ 'id' ] ); $id = AlsoInThisSeries::slug . '_' . $args[ 'id' ]; $name = AlsoInThisSeries::slug . "[{$args[ 'id' ]}]"; $values = (array) $args[ 'value' ]; array_walk( $values, 'esc_attr' ); $checked = array(); $labels = (array) $args[ 'label' ]; foreach( $values as $index => $value ) $checked[$index] = checked( $value, $setting, false ); self::_fieldRenderer( 'radiobutton', compact( 'id', 'name', 'values', 'checked', 'labels' ) ); } // Validates raw input from option submission. static function validateFields( $fields ) { $validated = array(); foreach( $fields as $field => $value ) { if( ! $sanction = isset( self::$registeredfields[ $field ] ) ? self::$registeredfields[ $field ] : false ) continue; $valid = true; if( ! empty( $sanction[ 'args' ][ 'raw' ] ) ) ;//allow raw elseif( is_scalar( $value ) ) $value = sanitize_text_field( $value ); elseif( is_array( $value ) ) $value = array_map( 'sanitize_text_field', $value ); switch( $sanction[ 'type' ] ) { case 'textfield' : if( $sanction[ 'value' ] && ! preg_match( "/{$sanction[ 'value' ]}/", $value ) ) { add_settings_error( AlsoInThisSeries::slug, 'invalid-value', "'{$sanction[ 'title' ]}' Invalid input" ); $valid = false; break; } break; case 'checkbox' : case 'radiobox' : if( is_scalar( $sanction[ 'value' ] ) && $value != $sanction[ 'value' ] ) { $valid = false; add_settings_error( AlsoInThisSeries::slug, 'invalid-value', "'{$sanction[ 'title' ]}' Invalid input" ); } elseif( is_array( $sanction[ 'value' ] ) && array_diff( (array) $value, $sanction[ 'value' ] ) ) { $valid = false; add_settings_error( AlsoInThisSeries::slug, 'invalid-value', "'{$sanction[ 'title' ]}' Invalid input" ); } default : } if( $valid ) $validated[ $field ] = $value; } return apply_filters( 'alsointhisseries_validate_fields', $validated, $fields ); } // Adds theme option to sanctioned list. Should be called when a field is added. private static function _addFieldFilter( $type, $id, $title, $value, $args ) { self::$registeredfields[ $id ] = compact( 'type', 'title', 'value', 'args' ); } // Delegates UI rendering to the template fragment loader. private static function _fieldRenderer( $type, $params ) { extract( $params ); include( "views/admin/optionsfield-{$type}.php" ); } } // Register admin functionality. add_action( 'admin_menu', array( 'AlsoInThisSeriesAdmin', 'admin_menu' ) ); add_action( 'admin_init', array( 'AlsoInThisSeriesAdmin', 'admin_init' ) ); add_action( 'add_meta_boxes', array( 'AlsoInThisSeriesAdmin', 'add_meta_boxes' ) ); add_action( 'save_post', array( 'AlsoInThisSeriesAdmin', 'save_post' ) ); add_filter( 'manage_posts_columns', array( 'AlsoInThisSeriesAdmin', 'manage_posts_columns' ) ); add_filter( 'manage_posts_custom_column', array( 'AlsoInThisSeriesAdmin', 'manage_posts_custom_column' ) );