Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save panoslyrakis/5e25a23271048c049443597f466a4378 to your computer and use it in GitHub Desktop.
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
<?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