<?php /** * Widgets * * Widgets related funtions and widget registration. * * @package EDD * @subpackage Widgets * @copyright Copyright (c) 2018, Easy Digital Downloads, LLC * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License * @since 1.0 */ // Exit if accessed directly defined( 'ABSPATH' ) || exit; /* |-------------------------------------------------------------------------- | FRONT-END WIDGETS |-------------------------------------------------------------------------- | | - Cart Widget | - Categories / Tags Widget | */ /** * Cart Widget. * * Downloads cart widget class. * * @since 1.0 * @return void */ class edd_cart_widget extends WP_Widget { /** Constructor */ function __construct() { parent::__construct( 'edd_cart_widget', __( 'Downloads Cart', 'easy-digital-downloads' ), array( 'description' => __( 'Display the downloads shopping cart', 'easy-digital-downloads' ) ) ); add_filter( 'dynamic_sidebar_params', array( $this, 'cart_widget_class' ), 10, 1 ); } /** @see WP_Widget::widget */ function widget( $args, $instance ) { if ( ! empty( $instance['hide_on_checkout'] ) && edd_is_checkout() ) { return; } $args['id'] = ( isset( $args['id'] ) ) ? $args['id'] : 'edd_cart_widget'; $instance['title'] = ( isset( $instance['title'] ) ) ? $instance['title'] : ''; $title = apply_filters( 'widget_title', $instance['title'], $instance, $args['id'] ); echo $args['before_widget']; if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } do_action( 'edd_before_cart_widget' ); edd_shopping_cart( true ); do_action( 'edd_after_cart_widget' ); echo $args['after_widget']; } /** @see WP_Widget::update */ function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = strip_tags( $new_instance['title'] ); $instance['hide_on_checkout'] = ! empty( $new_instance['hide_on_checkout'] ); $instance['hide_on_empty'] = ! empty( $new_instance['hide_on_empty'] ); return $instance; } /** @see WP_Widget::form */ function form( $instance ) { $defaults = array( 'title' => '', 'hide_on_checkout' => false, 'hide_on_empty' => false, ); $instance = wp_parse_args( (array) $instance, $defaults ); ?> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title:', 'easy-digital-downloads' ); ?></label> <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>"/> </p> <!-- Hide on Checkout Page --> <p> <input <?php checked( $instance['hide_on_checkout'], true ); ?> id="<?php echo esc_attr( $this->get_field_id( 'hide_on_checkout' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'hide_on_checkout' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'hide_on_checkout' ) ); ?>"><?php _e( 'Hide on Checkout Page', 'easy-digital-downloads' ); ?></label> </p> <!-- Hide when cart is empty --> <p> <input <?php checked( $instance['hide_on_empty'], true ); ?> id="<?php echo esc_attr( $this->get_field_id( 'hide_on_empty' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'hide_on_empty' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'hide_on_empty' ) ); ?>"><?php _e( 'Hide if cart is empty', 'easy-digital-downloads' ); ?></label> </p> <?php } /** * Check if the widget needs to be hidden when empty. * * @since 2.7 * @param $params * * @return array */ public function cart_widget_class( $params ) { if ( strpos( $params[0]['widget_id'], 'edd_cart_widget' ) !== false ) { $instance_id = $params[1]['number']; $all_settings = $this->get_settings(); $instance_settings = $all_settings[ $instance_id ]; if ( ! empty( $instance_settings['hide_on_empty'] ) ) { $cart_quantity = edd_get_cart_quantity(); $class = empty( $cart_quantity ) ? 'cart-empty' : 'cart-not-empty'; $params[0]['before_widget'] = preg_replace( '/class="(.*?)"/', 'class="$1 edd-hide-on-empty ' . $class . '"', $params[0]['before_widget'] ); } } return $params; } } /** * Categories / Tags Widget. * * Downloads categories / tags widget class. * * @since 1.0 * @return void */ class edd_categories_tags_widget extends WP_Widget { /** Constructor */ function __construct() { parent::__construct( 'edd_categories_tags_widget', __( 'Downloads Categories / Tags', 'easy-digital-downloads' ), array( 'description' => __( 'Display the downloads categories or tags', 'easy-digital-downloads' ) ) ); } /** @see WP_Widget::widget */ function widget( $args, $instance ) { // Set defaults. $args['id'] = ( isset( $args['id'] ) ) ? $args['id'] : 'edd_categories_tags_widget'; $instance['title'] = ( isset( $instance['title'] ) ) ? $instance['title'] : ''; $instance['taxonomy'] = ( isset( $instance['taxonomy'] ) ) ? $instance['taxonomy'] : 'download_category'; $title = apply_filters( 'widget_title', $instance['title'], $instance, $args['id'] ); $tax = $instance['taxonomy']; $count = isset( $instance['count'] ) && $instance['count'] == 'on' ? 1 : 0; $hide_empty = isset( $instance['hide_empty'] ) && $instance['hide_empty'] == 'on' ? 1 : 0; echo $args['before_widget']; if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } do_action( 'edd_before_taxonomy_widget' ); echo "<ul class=\"edd-taxonomy-widget\">\n"; wp_list_categories( 'title_li=&taxonomy=' . $tax . '&show_count=' . $count . '&hide_empty=' . $hide_empty ); echo "</ul>\n"; do_action( 'edd_after_taxonomy_widget' ); echo $args['after_widget']; } /** @see WP_Widget::update */ function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = strip_tags( $new_instance['title'] ); $instance['taxonomy'] = strip_tags( $new_instance['taxonomy'] ); $instance['count'] = isset( $new_instance['count'] ) ? $new_instance['count'] : ''; $instance['hide_empty'] = isset( $new_instance['hide_empty'] ) ? $new_instance['hide_empty'] : ''; return $instance; } /** @see WP_Widget::form */ function form( $instance ) { // Set up some default widget settings. $defaults = array( 'title' => '', 'taxonomy' => 'download_category', 'count' => 'off', 'hide_empty' => 'off', ); $instance = wp_parse_args( (array) $instance, $defaults ); ?> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title:', 'easy-digital-downloads' ); ?></label> <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>"/> </p> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'taxonomy' ) ); ?>"><?php _e( 'Taxonomy:', 'easy-digital-downloads' ); ?></label> <select name="<?php echo esc_attr( $this->get_field_name( 'taxonomy' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'taxonomy' ) ); ?>"> <?php $category_labels = edd_get_taxonomy_labels( 'download_category' ); $tag_labels = edd_get_taxonomy_labels( 'download_tag' ); ?> <option value="download_category" <?php selected( 'download_category', $instance['taxonomy'] ); ?>><?php echo esc_html( $category_labels['name'] ); ?></option> <option value="download_tag" <?php selected( 'download_tag', $instance['taxonomy'] ); ?>><?php echo esc_html( $tag_labels['name'] ); ?></option> </select> </p> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>"><?php esc_html_e( 'Show Count:', 'easy-digital-downloads' ); ?></label> <input <?php checked( $instance['count'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>" type="checkbox" /> </p> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'hide_empty' ) ); ?>"><?php _e( 'Hide Empty Categories:', 'easy-digital-downloads' ); ?></label> <input <?php checked( $instance['hide_empty'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'hide_empty' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'hide_empty' ) ); ?>" type="checkbox" /> </p> <?php } } /** * Product Details Widget. * * Displays a product's details in a widget. * * @since 1.9 * @return void */ class EDD_Product_Details_Widget extends WP_Widget { /** Constructor */ public function __construct() { parent::__construct( 'edd_product_details', sprintf( __( '%s Details', 'easy-digital-downloads' ), edd_get_label_singular() ), array( 'description' => sprintf( __( 'Display the details of a specific %s', 'easy-digital-downloads' ), edd_get_label_singular() ), ) ); } /** @see WP_Widget::widget */ public function widget( $args, $instance ) { $args['id'] = ( isset( $args['id'] ) ) ? $args['id'] : 'edd_download_details_widget'; if ( ! empty( $instance['download_id'] ) ) { if ( 'current' === ( $instance['download_id'] ) ) { $instance['display_type'] = 'current'; unset( $instance['download_id'] ); } elseif ( is_numeric( $instance['download_id'] ) ) { $instance['display_type'] = 'specific'; } } if ( ! isset( $instance['display_type'] ) || ( 'specific' === $instance['display_type'] && ! isset( $instance['download_id'] ) ) || ( 'current' == $instance['display_type'] && ! is_singular( 'download' ) ) ) { return; } // set correct download ID. if ( 'current' == $instance['display_type'] && is_singular( 'download' ) ) { $download_id = get_the_ID(); } else { $download_id = absint( $instance['download_id'] ); } // Since we can take a typed in value, make sure it's a download we're looking for $download = get_post( $download_id ); if ( ! is_object( $download ) || 'download' !== $download->post_type ) { return; } // Variables from widget settings. $title = apply_filters( 'widget_title', $instance['title'], $instance, $args['id'] ); $download_title = $instance['download_title'] ? apply_filters( 'edd_product_details_widget_download_title', '<h3>' . get_the_title( $download_id ) . '</h3>', $download_id ) : ''; $purchase_button = $instance['purchase_button'] ? apply_filters( 'edd_product_details_widget_purchase_button', edd_get_purchase_link( array( 'download_id' => $download_id ) ), $download_id ) : ''; $categories = $instance['categories'] ? $instance['categories'] : ''; $tags = $instance['tags'] ? $instance['tags'] : ''; // Used by themes. Opens the widget. echo $args['before_widget']; // Display the widget title. if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } do_action( 'edd_product_details_widget_before_title' , $instance , $download_id ); // Download title. echo $download_title; do_action( 'edd_product_details_widget_before_purchase_button' , $instance , $download_id ); // Purchase button. echo $purchase_button; // Categories. $category_list = false; $category_label = ''; if ( $categories ) { $category_terms = (array) get_the_terms( $download_id, 'download_category' ); if ( $category_terms && ! is_wp_error( $category_terms ) ) { $category_list = get_the_term_list( $download_id, 'download_category', '', ', ' ); $category_count = count( $category_terms ); $category_labels = edd_get_taxonomy_labels( 'download_category' ); $category_label = $category_count > 1 ? $category_labels['name'] : $category_labels['singular_name']; } } // Tags. $tag_list = false; $tag_label = ''; if ( $tags ) { $tag_terms = (array) get_the_terms( $download_id, 'download_tag' ); if ( $tag_terms && ! is_wp_error( $tag_terms ) ) { $tag_list = get_the_term_list( $download_id, 'download_tag', '', ', ' ); $tag_count = count( $tag_terms ); $tag_taxonomy = edd_get_taxonomy_labels( 'download_tag' ); $tag_label = $tag_count > 1 ? $tag_taxonomy['name'] : $tag_taxonomy['singular_name']; } } $text = ''; if ( $category_list || $tag_list ) { $text .= '<p class="edd-meta">'; if ( $category_list ) { $text .= '<span class="categories">%1$s: %2$s</span><br/>'; } if ( $tag_list ) { $text .= '<span class="tags">%3$s: %4$s</span>'; } $text .= '</p>'; } do_action( 'edd_product_details_widget_before_categories_and_tags', $instance, $download_id ); printf( $text, $category_label, $category_list, $tag_label, $tag_list ); do_action( 'edd_product_details_widget_before_end', $instance, $download_id ); // Used by themes. Closes the widget. echo $args['after_widget']; } /** @see WP_Widget::form */ public function form( $instance ) { // Set up some default widget settings. $defaults = array( 'title' => sprintf( __( '%s Details', 'easy-digital-downloads' ), edd_get_label_singular() ), 'display_type' => 'current', 'download_id' => false, 'download_title' => 'on', 'purchase_button' => 'on', 'categories' => 'on', 'tags' => 'on', ); $instance = wp_parse_args( (array) $instance, $defaults ); ?> <?php if ( 'current' === ( $instance['download_id'] ) ) { $instance['display_type'] = 'current'; $instance['download_id'] = false; } elseif ( is_numeric( $instance['download_id'] ) ) { $instance['display_type'] = 'specific'; } ?> <!-- Title --> <p> <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title:', 'easy-digital-downloads' ) ?></label> <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" /> </p> <p> <?php _e( 'Display Type:', 'easy-digital-downloads' ); ?><br /> <input type="radio" onchange="jQuery(this).parent().next('.download-details-selector').hide();" <?php checked( 'current', $instance['display_type'], true ); ?> value="current" name="<?php echo esc_attr( $this->get_field_name( 'display_type' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'display_type' ) ); ?>-current"><label for="<?php echo esc_attr( $this->get_field_id( 'display_type' ) ); ?>-current"><?php _e( 'Current', 'easy-digital-downloads' ); ?></label> <input type="radio" onchange="jQuery(this).parent().next('.download-details-selector').show();" <?php checked( 'specific', $instance['display_type'], true ); ?> value="specific" name="<?php echo esc_attr( $this->get_field_name( 'display_type' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'display_type' ) ); ?>-specific"><label for="<?php echo esc_attr( $this->get_field_id( 'display_type' ) ); ?>-specific"><?php _e( 'Specific', 'easy-digital-downloads' ); ?></label> </p> <!-- Download --> <?php $display = 'current' === $instance['display_type'] ? ' style="display: none;"' : ''; ?> <p class="download-details-selector" <?php echo $display; ?>> <label for="<?php echo esc_attr( $this->get_field_id( 'download_id' ) ); ?>"><?php printf( __( '%s:', 'easy-digital-downloads' ), edd_get_label_singular() ); ?></label> <?php $download_count = wp_count_posts( 'download' ); ?> <?php if ( $download_count->publish < 1000 ) : ?> <?php $args = array( 'post_type' => 'download', 'posts_per_page' => -1, 'post_status' => 'publish', ); $downloads = get_posts( $args ); ?> <select class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'download_id' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'download_id' ) ); ?>"> <?php foreach ( $downloads as $download ) { ?> <option <?php selected( absint( $instance['download_id'] ), $download->ID ); ?> value="<?php echo esc_attr( $download->ID ); ?>"><?php echo esc_html( $download->post_title ); ?></option> <?php } ?> </select> <?php else: ?> <br /> <input type="text" value="<?php echo esc_attr( $instance['download_id'] ); ?>" placeholder="<?php printf( __( '%s ID', 'easy-digital-downloads' ), edd_get_label_singular() ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'download_id' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'download_id' ) ); ?>"> <?php endif; ?> </p> <!-- Download title --> <p> <input <?php checked( $instance['download_title'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'download_title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'download_title' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'download_title' ) ); ?>"><?php printf( __( 'Show %s Title', 'easy-digital-downloads' ), edd_get_label_singular() ); ?></label> </p> <!-- Show purchase button --> <p> <input <?php checked( $instance['purchase_button'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'purchase_button' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'purchase_button' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'purchase_button' ) ); ?>"><?php _e( 'Show Purchase Button', 'easy-digital-downloads' ); ?></label> </p> <!-- Show download categories --> <p> <?php $category_labels = edd_get_taxonomy_labels( 'download_category' ); ?> <input <?php checked( $instance['categories'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'categories' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'categories' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'categories' ) ); ?>"><?php printf( __( 'Show %s', 'easy-digital-downloads' ), $category_labels['name'] ); ?></label> </p> <!-- Show download tags --> <p> <?php $tag_labels = edd_get_taxonomy_labels( 'download_tag' ); ?> <input <?php checked( $instance['tags'], 'on' ); ?> id="<?php echo esc_attr( $this->get_field_id( 'tags' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'tags' ) ); ?>" type="checkbox" /> <label for="<?php echo esc_attr( $this->get_field_id( 'tags' ) ); ?>"><?php printf( __( 'Show %s', 'easy-digital-downloads' ), $tag_labels['name'] ); ?></label> </p> <?php do_action( 'edd_product_details_widget_form' , $instance ); ?> <?php } /** @see WP_Widget::update */ public function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = strip_tags( $new_instance['title'] ); $instance['download_id'] = strip_tags( $new_instance['download_id'] ); $instance['display_type'] = isset( $new_instance['display_type'] ) ? strip_tags( $new_instance['display_type'] ) : ''; $instance['download_title'] = isset( $new_instance['download_title'] ) ? $new_instance['download_title'] : ''; $instance['purchase_button'] = isset( $new_instance['purchase_button'] ) ? $new_instance['purchase_button'] : ''; $instance['categories'] = isset( $new_instance['categories'] ) ? $new_instance['categories'] : ''; $instance['tags'] = isset( $new_instance['tags'] ) ? $new_instance['tags'] : ''; do_action( 'edd_product_details_widget_update', $instance ); // If the new view is 'current download' then remove the specific download ID if ( 'current' === $instance['display_type'] ) { unset( $instance['download_id'] ); } return $instance; } } /** * Register Widgets. * * Registers the EDD Widgets. * * @since 1.0 * @return void */ function edd_register_widgets() { register_widget( 'edd_cart_widget' ); register_widget( 'edd_categories_tags_widget' ); register_widget( 'edd_product_details_widget' ); } add_action( 'widgets_init', 'edd_register_widgets' );