/** * Register the widget for use in Appearance -> Widgets */ add_action( 'widgets_init', 'jetpack_goodreads_widget_init' ); function jetpack_goodreads_widget_init() { register_widget( 'WPCOM_Widget_Goodreads' ); } /** * Goodreads widget class * Display a user's Goodreads shelf. * Customize user_id, title, and shelf * */ class WPCOM_Widget_Goodreads extends WP_Widget { private $goodreads_widget_id = 0; function __construct() { parent::__construct( 'wpcom-goodreads', /** This filter is documented in modules/widgets/facebook-likebox.php */ apply_filters( 'jetpack_widget_name', __( 'Goodreads', 'jetpack' ) ), array( 'classname' => 'widget_goodreads', 'description' => __( 'Display your books from Goodreads', 'jetpack' ), 'customize_selective_refresh' => true, ) ); // For user input sanitization and display $this->shelves = array( 'read' => _x( 'Read', 'past participle: books I have read', 'jetpack' ), 'currently-reading' => __( 'Currently Reading', 'jetpack' ), 'to-read' => _x( 'To Read', 'my list of books to read', 'jetpack' ) ); if ( is_active_widget( '', '', 'wpcom-goodreads' ) || is_customize_preview() ) { add_action( 'wp_print_styles', array( $this, 'enqueue_style' ) ); } } function enqueue_style() { wp_enqueue_style( 'goodreads-widget', plugins_url( 'goodreads/css/goodreads.css', __FILE__ ) ); wp_style_add_data( 'goodreads-widget', 'rtl', 'replace' ); } function widget( $args, $instance ) { /** This action is documented in modules/widgets/gravatar-profile.php */ do_action( 'jetpack_stats_extra', 'widget_view', 'goodreads' ); /** This filter is documented in core/src/wp-includes/default-widgets.php */ $title = apply_filters( 'widget_title', isset( $instance['title'] ) ? $instance['title'] : '' ); if ( empty( $instance['user_id'] ) || 'invalid' === $instance['user_id'] ) { if ( current_user_can('edit_theme_options') ) { echo $args['before_widget']; echo '

' . sprintf( __( 'You need to enter your numeric user ID for the Goodreads Widget to work correctly. Full instructions.', 'jetpack' ), esc_url( admin_url( 'widgets.php' ) ), 'http://support.wordpress.com/widgets/goodreads-widget/#goodreads-user-id' ) . '

'; echo $args['after_widget']; } return; } if ( !array_key_exists( $instance['shelf'], $this->shelves ) ) return; $instance['user_id'] = absint( $instance['user_id'] ); // Set widget ID based on shelf. $this->goodreads_widget_id = $instance['user_id'] . '_' . $instance['shelf']; if ( empty( $title ) ) $title = esc_html__( 'Goodreads', 'jetpack' ); echo $args['before_widget']; echo $args['before_title'] . $title . $args['after_title']; $goodreads_url = 'https://www.goodreads.com/review/custom_widget/' . urlencode( $instance['user_id'] ) . '.' . urlencode( $instance['title'] ) . ':%20' . urlencode( $instance['shelf'] ) . '?cover_position=&cover_size=small&num_books=5&order=d&shelf=' . urlencode( $instance['shelf'] ) . '&sort=date_added&widget_bg_transparent=&widget_id=' . esc_attr( $this->goodreads_widget_id ) ; echo '
' . "\n"; echo '' . "\n"; echo $args['after_widget']; } function goodreads_user_id_exists( $user_id ) { $url = "http://www.goodreads.com/user/show/$user_id/"; $response = wp_remote_head( $url, array( 'httpversion'=>'1.1', 'timeout'=>3, 'redirection'=> 2 ) ); if ( wp_remote_retrieve_response_code( $response ) === 200 ) return true; else return false; } function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['user_id'] = trim( wp_kses( stripslashes( $new_instance['user_id'] ), array() ) ); if ( ! empty( $instance['user_id'] ) && ( ! isset( $old_instance['user_id'] ) || $instance['user_id'] !== $old_instance['user_id'] ) ) { if ( ! $this->goodreads_user_id_exists( $instance['user_id'] ) ) { $instance['user_id'] = 'invalid'; } } $instance['title'] = wp_kses( stripslashes( $new_instance['title'] ), array() ); $shelf = wp_kses( stripslashes( $new_instance['shelf'] ), array() ); if ( array_key_exists( $shelf, $this->shelves ) ) $instance['shelf'] = $shelf; return $instance; } function form( $instance ) { //Defaults $instance = wp_parse_args( (array) $instance, array( 'user_id' => '', 'title' => 'Goodreads', 'shelf' => 'read' ) ); echo '

'; } } Dan & Deno – Dan Moroney

Dan & Deno

img_2960Dan ran his campaign and was elected to the Village Board with Deno Andrews. Please take a moment to learn more about Deno at denoandrews.com.
In addition to having a similar vision for Oak Park, Dan and Deno both offer the following strengths:

  • Rooted in Oak Park: Both Dan and Deno were born and raised in Oak Park. The values of Oak Park are engrained in both of them. Furthermore, both Dan and Deno have made a living in Oak Park. They have spent their adult lives being active stakeholders in the community and working to make Oak Park a better place to live.
  • Independent Voices: Dan and Deno will come to the Village Board with no allegiance to any one person or party. While both will be eager to work with existing Board members, Dan and Deno will not be universally aligned with any agenda or preconceived plan.
  • Commitment & Enthusiasm: Voters of Oak Park will not find two candidates that are more hard working, enthusiastic and committed to doing the work required of a Trustee. Both Dan & Deno are self employed entrepreneurs that have set themselves up to fully commit to the demands of the Trustee position.
  • History of Seeing Opportunity and Tangible Accomplishments: Dan and Deno have both made their living seeing opportunity in Oak Park and working towards tangible successes. This approach will be brought to the Village Board to the benefit of the Oak Park community.

Make sure to cast ballots for both Dan Moroney and Deno Andrews on April 4, 2017!