Admidio. * Version: 0.3.5 * Author: Ulrik Schoth * Author URI: http://fechten-in-waldkirch.de/kontakt/webmaster/ * Text Domain: admidio-events * Domain Path: /languages * * Module: admidio-events.php * Description: Widget management. * * Copyright (C) 2014 Ulrik Schoth * * 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 3 * 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, see . */ /** * Admidio Events Widget class. * This class handles everything that needs to be handled with the widget: Settings (functions *form* and *update*) and output (function *widget*). * * @since 0.3.1 * * @todo Error when setting feed cache time? Seems to be too short... * @todo Add screen shots for folder "assets" and finish readme.txt. */ class Admidio_Events_Widget extends WP_Widget { /** * Widget class initialization (set up widget name etc). * * @since 0.3.1 */ function __construct() { // Create widget. parent::__construct( 'admidio-events', // Base ID for CSS (usually appended by '-2', '-3', etc. depending on no of used widget instances). 'Admidio Events', // Name used on widget configuration page. array( 'classname' => 'admidio-events', // Class name for CSS. 'description' => __( 'Event data from Admidio.', 'admidio-events' ), // Description used on widget configuration page. ), array( 'width' => 400, 'height' => 200, ) ); // Register style sheet and scripts. add_action( 'wp_enqueue_scripts', array( $this, 'register_plugin_styles_and_scripts' ) ); } /** * Register and enqueue style sheet and javascript. * * @see http://codex.wordpress.org/Function_Reference/wp_register_style/ * @see https://codex.wordpress.org/Function_Reference/wp_enqueue_style/ * * @since 0.3.1 */ public function register_plugin_styles_and_scripts() { wp_enqueue_style( 'admidio-events', plugins_url( 'admidio-events.css', __FILE__ ), array(), '0.3.1' ); wp_enqueue_script( 'admidio-events-js', plugins_url( 'admidio-events.js', __FILE__ ), array( 'jquery' ), '0.3.1', true ); } /** * Echo the settings update form on backend. * * @since 0.3.1 * * @param array $instance - Current settings. */ function form( $instance ) { // Set up default widget settings. $defaults = array( 'title' => __( 'Upcoming Events', 'admidio-events' ), 'rss_feed' => '', 'no_of_items' => '5', 'show_date' => '0', 'start_expanded' => '0', ); $instance = wp_parse_args( (array) $instance, $defaults ); ?>

/>

/>

' . $title . '
' . $after_title; // Get RSS data and handle result. $rss_items = $this->get_rss_feed_data( $rss_feed, 20 ); if ( $rss_items === false ) { _e( 'Error when fetching event data.', 'admidio-events' ); } elseif ( empty( $rss_items ) ) { _e( 'No event data available.', 'admidio-events' ); } else { // Extract Admidio data from RSS items. $admidio_data = $this->extract_admidio_data( $rss_items ); // Sort items for date. ksort( $admidio_data ); $items_counter = 1; echo ""; } // After widget (defined by themes). echo $after_widget; } /** * Get rss feed data. * * @since 0.3.1 * * @param string $rss_feed_url * @param int $items_limit - Maximum number of items that are read from the rss url (0 = unlimited number). * * @return mixed Array with rss feed items (reversely sorted by publishing date) or empty array. False if error occurred. */ function get_rss_feed_data( $rss_feed_url, $items_limit ) { /** * Get RSS Feed. * @see https://codex.wordpress.org/Function_Reference/fetch_feed/ */ include_once( ABSPATH . WPINC . '/feed.php' ); // Change the feed cache lifetime from default value (12 hours) to 1 hour. add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'set_feed_cache_lifetime' ) ); // Get a SimplePie feed object from the specified feed url. $rss = fetch_feed( $rss_feed_url ); // Change the feed cache lifetime back to default value. remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'set_feed_cache_lifetime' ) ); if ( ! is_wp_error( $rss ) ) { // Checks that the object was created correctly // Figure out how many total items there are, but limit it to $items_limit. $maxitems = $rss->get_item_quantity( $items_limit ); if ( $maxitems>0) { // Build an array of all the items, starting with element 0 (first element). return $rss->get_items( 0, $maxitems ); } return array(); } return false; } /** * Set feed cache lifetime * * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/wp_feed_cache_transient_lifetime/ * @since 0.3.1 * * @param int $seconds - Time in seconds between cache recreation. * @return int New time. */ public function set_feed_cache_lifetime( $seconds ) { return 3600; } /** * Extract Admidio data from rss items. * * @since 0.3.1 * * @param array $rss_items * @return array Extracted Admidio data. */ function extract_admidio_data( $rss_items ) { $admidio_data = array(); foreach ( $rss_items as $item ) { // Remove date(s) from RSS title. $admidio_title = $item->get_title(); preg_match( '/^(\d{2}\.\d{2}\.\d{4})( - )?(\d{2}\.\d{2}\.\d{4})?\s/', $admidio_title, $matches ); if ( (count( $matches )==2) or (count( $matches )==4) ) { $admidio_title = str_replace( $matches[0],'',$admidio_title ); } // Get description, decode HTML entities back to characters, remove any number of break tags directly followed by link tag at the end. $admidio_description_raw = preg_replace( '/(
)+$/', '', htmlspecialchars_decode( $item->get_description(), ENT_QUOTES ) ); // Replace two "
" by one and delete any Line Feeds and Tabs. Strip tags except for break tags. $admidio_description = strip_tags( str_replace( array('

', "\n", "\t"), array('
','',''), $admidio_description_raw ), '
' ); // Get start date and convert formatting to make it usable for sorting and for pretty display. $admidio_start_date = substr( $admidio_description, 0, 10 ); $admidio_start_date_key = date_format( date_create_from_format( 'd.m.Y', $admidio_start_date), 'Y-m-d' ); $admidio_start_date_pretty = date_i18n( get_option( 'date_format' ), strtotime( $admidio_start_date_key ) ); // Get start time for finer sorting. $admidio_start_time_key = substr( $admidio_description, 11, 5 ); // Create array for sorting. $admidio_data[$admidio_start_date_key . ' ' . $admidio_start_time_key] = array( 'title' => $admidio_title, 'start_date' => $admidio_start_date_pretty, 'description' => $admidio_description ); } // foreach ( $rss_items as $item )... return $admidio_data; } } // class Admidio_Events_Widget ... /** * Register widget *Admidio_Events_Widget*. * * @since 0.3.1 */ add_action( 'widgets_init', function(){ register_widget( 'Admidio_Events_Widget' ); }); // Load language file. $plugin_dir = basename( dirname( __FILE__ ) ); load_plugin_textdomain( 'admidio-events', null, $plugin_dir . '/languages/' ); ?>