'method_name', 'in_widget_form' => array( 'function_to_add' => 'input_fields', 'priority' => 10, // Optional 'accepted_args' => 3, // Optional ), 'widget_update_callback' => array( 'function_to_add' => 'save_attributes', 'priority' => 10, // Optional 'accepted_args' => 4, // Optional ), ); } return array( // 'hook_name' => 'method_name', 'dynamic_sidebar_params' => 'insert_attributes', ); } /** * Variable to store field object. * * @var null */ private $fields_type = null; /** * Init the constructor * * @param array $options The plugin options. * @param Fields_Interface $fields_type Field object. */ public function __construct( array $options = array(), Fields_Interface $fields_type ) { $this->fields_type = $fields_type; $this->config = require( ITALYSTRAP_PLUGIN_PATH . 'config/widget-attributes.php' ); $this->new_input_fields = array( 'widget_css_id', 'widget_css_css' ); } /** * Create the Fields * * @access protected * @param WP_Widget $widget Widget Object. * @param array $instance The instance of the widget. * @param array $key The key of field's array to create the HTML field. * @param string $out The HTML form output. * @return string Return the HTML Fields */ protected function field_type( $widget, $instance, array $key, $out = '' ) { /* Set field id and name */ $key['_name'] = $widget->get_field_name( $key['id'] ); $key['_id'] = $widget->get_field_id( $key['id'] ); return $this->fields_type->render( $key, $instance ); } /** * Inject input fields into widget configuration form * * @since 0.1 * @wp_hook action in_widget_form * * @param WP_Widget $widget Widget object. * @param string $return The value to return. * @param array $instance The instance of the widget. * * @return NULL */ public function input_fields( $widget, $return, $instance ) { $instance = $this->get_attributes( $instance ); foreach ( $this->config as $key => $value ) { echo $this->field_type( $widget, $instance, $value ); // XSS ok. } return null; } /** * Get default attributes * * @since 0.1 * * @param array $instance Widget instance configuration. * * @return array */ protected function get_attributes( $instance ) { $instance = array_merge( array( 'widget_css_id' => '', 'widget_css_class' => '', ), $instance ); return $instance; } /** * Save attributes upon widget saving * * @since 0.1 * @wp_hook filter widget_update_callback * * @param array $instance Current widget instance configuration. * @param array $new_instance New widget instance configuration. * @param array $old_instance Old Widget instance configuration. * @param object $widget Widget object. * * @return array */ public function save_attributes( $instance, $new_instance, $old_instance, $widget ) { $instance['widget_css_id'] = $instance['widget_css_class'] = ''; // ID. if ( ! empty( $new_instance['widget_css_id'] ) ) { $instance['widget_css_id'] = apply_filters( 'widget_attribute_id', sanitize_html_class( $new_instance['widget_css_id'] ) ); } // Classes. if ( ! empty( $new_instance['widget_css_class'] ) ) { $instance['widget_css_class'] = apply_filters( 'widget_attribute_classes', implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $new_instance['widget_css_class'] ) ) ) ); } else { $instance['widget_css_class'] = ''; } return $instance; } /** * Insert attributes into widget markup * * @since 0.1 * @filter dynamic_sidebar_params * * @param array $params Widget parameters. * * @return Array */ public function insert_attributes( $params ) { global $wp_registered_widgets; $widget_id = $params[0]['widget_id']; $widget_obj = $wp_registered_widgets[ $widget_id ]; if ( ! isset( $widget_obj['callback'][0] ) || ! is_object( $widget_obj['callback'][0] ) ) { return $params; } $widget_options = get_option( $widget_obj['callback'][0]->option_name ); if ( empty( $widget_options ) ) { return $params; } $widget_num = $widget_obj['params'][0]['number']; if ( empty( $widget_options[ $widget_num ] ) ) { return $params; } $instance = $widget_options[ $widget_num ]; // ID. if ( ! empty( $instance['widget_css_id'] ) ) { $params[0]['before_widget'] = preg_replace( '/id=".*?"/', sprintf( 'id="%s"', $instance['widget_css_id'] ), $params[0]['before_widget'], 1 ); } // Classes. if ( ! empty( $instance['widget_css_class'] ) ) { $params[0]['before_widget'] = preg_replace( '/class="/', sprintf( 'class="%s ', $instance['widget_css_class'] ), $params[0]['before_widget'], 1 ); } return $params; } }