Created
June 7, 2017 16:53
-
-
Save panoslyrakis/5e25a23271048c049443597f466a4378 to your computer and use it in GitHub Desktop.
Adds a shortcode to display the support tickets list and single ticket in front end
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: Front end upfront support tickets | |
Plugin URI: https://premium.wpmudev.org/ | |
Description: Adds a shortcode to display the support tickets list and single ticket in front end | |
Author: Panos Lyrakis @ WPMUDEV | |
Author URI: https://premium.wpmudev.org/ | |
License: GPLv2 or later | |
*/ | |
if( ! class_exists( 'WPMUDEV_Inc_Support_Upfront_Front' ) ){ | |
class WPMUDEV_Inc_Support_Upfront_Front{ | |
private static $_instance = null; | |
private static $_tickets = null; | |
private static $_total_pages = null; | |
public static function get_instance() { | |
if ( is_null( self::$_instance ) ) { | |
self::$_instance = new WPMUDEV_Inc_Support_Upfront_Front(); | |
} | |
return self::$_instance; | |
} | |
private function __construct(){ | |
add_shortcode( 'support_system_upfront_tickets_front', array( $this, 'get_upfront_tickets' ) ); | |
add_action( 'wp_enqueue_scripts', array( $this, 'set_front_stylesheet' ), 10 ); | |
add_filter( 'query_vars', array( $this, 'set_query_vars' ), 10 ); | |
} | |
public function get_upfront_tickets( $atts, $content ){ | |
if( ! is_user_logged_in() ){ | |
return; | |
} | |
global $wpdb, $current_site; | |
$current_site_id = ! empty ( $current_site ) ? $current_site->id : 1; | |
$user = wp_get_current_user(); | |
$allowed_roles = array('editor', 'administrator', 'author'); | |
if( ! array_intersect($allowed_roles, $user->roles ) ){ | |
$this->error_message(); | |
} | |
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1; | |
$atts = shortcode_atts( array( | |
'per_page' => get_option( 'posts_per_page' ), | |
'page' => $paged, | |
'status' => 'all', | |
'view_by_superadmin' => null, | |
'blog_id' => false, | |
'user_in' => false, | |
'category' => false, | |
'priority' => false, | |
'site_id' => $current_site_id, | |
'count' => false, | |
'orderby' => 'ticket_updated', | |
'order' => 'desc', | |
's' => false | |
), $atts, 'get_upfront_tickets' ); | |
self::$_tickets = incsub_support_get_tickets( $atts ); | |
$found_tickets = incsub_support_get_tickets_count( $atts ); | |
self::$_total_pages = ceil( $found_tickets / $atts[ 'per_page' ] ); | |
if( get_query_var( 'tid' ) == '' ){ | |
return $this->ticket_list_template(); | |
} | |
$ticket_id = (int) get_query_var( 'tid' ); | |
return $this->ticket_single_template( $ticket_id ); | |
} | |
public function ticket_single_template( $ticket_id ){ | |
$ticket = incsub_support_get_ticket( $ticket_id ); | |
ob_start(); | |
?> | |
<div id="support-system"> | |
<div id="support-system-single-ticket"> | |
<?php if ( ! empty($ticket ) ): ?> | |
<div class="support-system-ticket row <?php echo esc_attr( $this->ticket_classes( $ticket ) ); ?>" id="support-system-ticket-<?php echo $ticket->ticket_id; ?>"> | |
<div class="large-12 columns"> | |
<h1 class="text-center support-system-ticket-title"><?php echo esc_attr( $ticket->title ); ?></h1> | |
<?php if ( incsub_support_is_ticket_closed( $ticket->ticket_id ) ): ?> | |
<div data-alert class="alert-box alert"> | |
<?php _e( 'This ticket is closed', INCSUB_SUPPORT_LANG_DOMAIN ); ?> | |
</div> | |
<?php endif; ?> | |
<ul class="row"> | |
<li class="small-3 large-2 columns"> | |
<?php echo get_avatar( $ticket->user_id, 96 ); ?><br/> | |
</li> | |
<li class="small-9 large-10 columns"> | |
<ul class="row inline-list support-system-ticket-meta"> | |
<li class="first"><?php echo $this->ticket_author( $ticket ); ?></li> | |
<li><?php echo $this->ticket_updated_date( $ticket ); ?></li> | |
</ul> | |
<div class="row support-system-ticket-message"> | |
<?php echo $ticket->message; ?> | |
</div> | |
<?php $attachments = $this->get_the_ticket_attachments( $ticket ); ?> | |
<?php if ( ! empty( $attachments ) ): ?> | |
<div class="row support-system-ticket-attachments"> | |
<h5><?php _e( 'Attachments', INCSUB_SUPPORT_LANG_DOMAIN ); ?></h5> | |
<ul> | |
<?php foreach ( $attachments as $attachment ): ?> | |
<li><a href="<?php echo esc_url( $attachment ); ?>" title="<?php printf( esc_attr__( 'Download %s attachment', INCSUB_SUPPORT_LANG_DOMAIN ), basename( $attachment ) ); ?>"><?php echo basename( $attachment ); ?></a></li> | |
<?php endforeach; ?> | |
</ul> | |
</div> | |
<?php endif; ?> | |
</li> | |
</ul> | |
</div> | |
</div> | |
<hr> | |
<div class="row"> | |
<div class="support-system-ticket-replies large-8 columns"> | |
<?php $this->ticket_replies( $ticket ); ?> | |
</div> | |
<div class="large-4 columns"> | |
<div class="row"> | |
<?php if ( ! incsub_support_is_staff() ): ?> | |
<?php | |
echo incsub_support_widget( | |
array( 'class' => 'panel support-system-ticket-details large-12 columns', 'title' => __( 'Ticket Details', INCSUB_SUPPORT_LANG_DOMAIN ) ), | |
'incsub_support_the_ticket_details_box' | |
); | |
?> | |
<?php else: ?> | |
<?php | |
echo incsub_support_widget( | |
array( 'class' => 'panel support-system-ticket-details support-system-staff-box large-12 columns', 'title' => __( 'Edit Ticket Details', INCSUB_SUPPORT_LANG_DOMAIN ) ), | |
'incsub_support_the_staff_box', | |
array( 'submit_class' => 'button expand' ) | |
); | |
?> | |
<?php endif; ?> | |
<?php if ( incsub_support_current_user_can( 'close_ticket', incsub_support_get_the_ticket_id() ) ): ?> | |
<?php | |
echo incsub_support_widget( | |
array( 'class' => 'panel support-system-close-ticket large-12 columns' ), | |
'incsub_support_the_open_close_box', | |
array( 'submit_class' => 'button tiny' ) | |
); | |
?> | |
<?php endif; ?> | |
</div> | |
</div> | |
</div> | |
<?php endif; ?> | |
</div> | |
</div> | |
<?php | |
return ob_get_clean(); | |
} | |
public function ticket_list_template(){ | |
$tickets = self::$_tickets; | |
ob_start(); | |
?> | |
<div style="clear:both; float: none;"></div> | |
<div id="support-system"> | |
<?php if ( ! empty( $tickets ) ): ?> | |
<ul class="support-system-tickets-list"> | |
<?php foreach ( $tickets as $ticket ): ?> | |
<ul class="support-system-ticket row <?php echo esc_attr( $this->ticket_classes( $ticket ) ); ?>" id="support-ticket-<?php echo $ticket->ticket_id; ?>"> | |
<li class="small-2 large-1 columns support-system-ticket-author-data"> | |
<?php echo get_avatar( $ticket->user_id , 48 ); ?> | |
</li> | |
<li class="small-10 large-11 columns support-system-ticket-content"> | |
<h2 class="support-system-ticket-title"> | |
<a href="<?php echo esc_url( incsub_support_get_the_ticket_permalink( $ticket->ticket_id ) ); ?>" title="<?php echo esc_attr( $ticket->title ); ?>"> | |
<?php echo $ticket->title; ?> | |
</a> | |
<?php | |
$this->ticket_badges( $ticket, | |
array( | |
'badge_base_class' => 'label', | |
'replies_badge_class' => 'secondary', | |
'status_badge_class' => 'success' | |
) | |
); | |
?> | |
</h2> | |
<div class="support-system-ticket-message"> | |
<?php echo $this->trim( $ticket->message ); ?> | |
</div> | |
<ul class="inline-list support-system-ticket-meta"> | |
<li class="support-system-byauthor"> | |
<span> | |
<?php echo sprintf( __( 'by <strong>%s</strong>', INCSUB_SUPPORT_LANG_DOMAIN ), $this->ticket_author( $ticket ) ); ?> | |
</span> | |
</li> | |
<li class="support-system-lastreply"> | |
<span> | |
<?php echo $this->ticket_updated_date( $ticket ); ?> | |
</span> | |
</li> | |
<li class="support-system-category"> | |
<span class="support-system-tag"> | |
<?php echo $this->ticket_category_link( $ticket ); ?> | |
</span> | |
</li> | |
</ul> | |
</li> | |
</ul> | |
<?php endforeach; ?> | |
</ul> | |
<div class="row"> | |
<div class="large-12 columns"> | |
<?php | |
$big = 999999999; // need an unlikely integer | |
$translated = __( 'Page', 'plugin-textdomain' ); // Supply translatable string | |
echo paginate_links( array( | |
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), | |
'format' => '?paged=%#%', | |
'current' => max( 1, get_query_var('paged') ), | |
'total' => self::$_total_pages, | |
'before_page_number' => '<span class="screen-reader-text">'.$translated.' </span>' | |
) ); | |
?> | |
</div> | |
</div> | |
<?php else: ?> | |
<h2 class="support-system-no-tickets-upfront"> | |
<?php _e( 'No tickets!!' ); ?> | |
</h2> | |
<?php endif; ?> | |
</div> | |
<?php | |
return ob_get_clean(); | |
} | |
function ticket_classes( $ticket ) { | |
$class = array(); | |
$class[] = "support-system-ticket-priority-" . $ticket->ticket_priority; | |
$class[] = "support-system-ticket-category-" . $ticket->cat_id; | |
$class[] = "support-system-ticket-staff-" . $ticket->admin_id; | |
$class[] = "support-system-ticket-status-" . $ticket->ticket_status; | |
/** | |
* Filters the HTML ticket class in the frontend | |
* | |
* @param String $classes Ticket HTML classes | |
*/ | |
return apply_filters( 'support_system_the_ticket_class', implode( ' ', $class ) ); | |
} | |
public function ticket_badges( $ticket, $args = array() ) { | |
$defaults = array( | |
'badge_base_class' => 'support-system-badge', | |
'replies_badge_class' => 'support-system-replies-badge', | |
'status_badge_class' => 'support-system-closed-badge' | |
); | |
$args = wp_parse_args( $args, $defaults ); | |
extract( $args ); | |
$badges = array(); | |
// Ticket status | |
$badges[] = '<span class="' . esc_attr( $badge_base_class . ' ' . $status_badge_class ) . '">' . incsub_support_get_ticket_status_name( $ticket->ticket_status ) . '</span>'; | |
// Replies number | |
$num_replies = number_format_i18n( $ticket->num_replies, 0 ); | |
$badges[] = '<span class="' . esc_attr( $badge_base_class . ' ' . $replies_badge_class ) . '">' . esc_html( sprintf( _n( '1 reply', '%s replies', $num_replies , INCSUB_SUPPORT_LANG_DOMAIN ), $num_replies ) ) . '</span>'; | |
$badges = implode( ' ', $badges ); | |
echo $badges; | |
} | |
public function ticket_author( $ticket ){ | |
$user = get_userdata( $ticket->user_id ); | |
if ( ! $user ) | |
return __( 'Unknown user', INCSUB_SUPPORT_LANG_DOMAIN ); | |
return $user->data->display_name; | |
} | |
public function ticket_last_reply_url( $ticket ) { | |
$url = incsub_support_get_the_ticket_permalink(); | |
$replies = $ticket->get_replies(); | |
$last_reply = end( $replies ); | |
$last_reply_id = $last_reply->message_id; | |
reset( $replies ); | |
$url .= '#support-system-reply-' . $last_reply_id; | |
return $url; | |
} | |
public function ticket_updated_date( $ticket ) { | |
return incsub_support_get_translated_date( $ticket->ticket_updated, true ); | |
} | |
public function ticket_category_link( $ticket ) { | |
$page = incsub_support_get_user_ticket_url( $ticket->ticket_id ); | |
$cat = incsub_support_get_ticket_category( $ticket->cat_id ); | |
$url = add_query_arg( 'ticket-cat-id', $cat->cat_id, $page ); | |
$url = remove_query_arg( 'tid', $url ); | |
return '<a href="' . esc_url( $url ) . '">' . $cat->cat_name . '</a>'; | |
} | |
public function get_the_ticket_attachments( $ticket ) { | |
$ticket_id = $ticket->ticket_id; | |
$ticket = incsub_support_get_ticket( $ticket_id ); | |
if ( ! $ticket ) | |
return array(); | |
$replies = $ticket->get_replies(); | |
$main_reply = wp_list_filter( $replies, array( 'is_main_reply' => true ) ); | |
return $main_reply[0]->attachments; | |
} | |
public function ticket_replies( $ticket ) { | |
$ticket_id = $ticket->ticket_id; | |
incsub_support_get_template( 'ticket-replies', $ticket_id ); | |
} | |
public function trim( $message, $length = 40, $sep = ' ...' ){ | |
return wp_trim_words( $message, $length, $sep ); | |
} | |
public function error_message(){ | |
?> | |
<div> | |
<?php _e( 'Nothing here!' ); ?> | |
</div> | |
<?php | |
} | |
public function set_front_stylesheet(){ | |
global $post; | |
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'support_system_upfront_tickets_front') ) { | |
wp_enqueue_style( 'suport-upfront2-tickets-style', INCSUB_SUPPORT_ASSETS_URL . 'css/incsub-support.css' ); | |
} | |
} | |
public function set_query_vars( $query_vars ){ | |
$query_vars[] = 'tid'; | |
return $query_vars; | |
} | |
} | |
add_action( 'plugins_loaded', function(){ | |
$GLOBALS['WPMUDEV_Inc_Support_Upfront_Front'] = WPMUDEV_Inc_Support_Upfront_Front::get_instance(); | |
}, 10 ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment