includes/admin/class.llms.admin.reviews.php
<?php
/**
* Admin Reviews
*
* @package LifterLMS/Admin/Classes
*
* @since Unknown
* @version Unknown
*/
defined( 'ABSPATH' ) || exit;
/**
* Admin Reviews class
*
* This class handles the admin side of the reviews.
* It is responsible for creating the meta box on the course
* page (and in the future the membership page).
*
* @since Unknown
*/
class LLMS_Admin_Reviews {
public static $prefix = '_';
/**
* The constructor for the class. It adds the methods here to the appropriate
* actions. The actions are for:
* 1) Creating the custom column set in the llms_review post screen
* 2) Making a column sortable
* 3) Adding content to the column
* 4) Outputting the content.
* 5) Adding the meta boxes to the course page
* 6) Handling the saving of the data
*
* @return void
*/
public function __construct() {
add_action( 'manage_llms_review_posts_columns', array( $this, 'init' ) );
add_action( 'manage_edit-llms_review_sortable_columns', array( $this, 'make_columns_sortable' ) );
add_action( 'manage_llms_review_posts_custom_column', array( $this, 'generate_column_data' ), 10, 2 );
add_filter( 'llms_metabox_fields_lifterlms_course_options', array( $this, 'add_review_meta_boxes' ) );
add_action( 'save_post', array( $this, 'save_review_meta_boxes' ) );
}
/**
* This function generates the custom column set. It takes in
* the array of standard columns, then modifies that set to
* contain the needed fields.
*
* @param array $columns The array of standard WP columns
*
* @return array The updated array of columns.
*/
public function init( $columns ) {
unset( $columns['date'] );
unset( $columns['comments'] );
$columns['title'] = __( 'Review Title', 'lifterlms' );
$columns['course'] = __( 'Course Reviewed', 'lifterlms' );
$columns['author'] = __( 'Review Author', 'lifterlms' );
$columns['date'] = __( 'Review Date', 'lifterlms' );
return $columns;
}
/**
* This function makes the 'Course' column sortable
*
* @param array $columns Array of sortable columns
* @return array Updated column array.
*/
public function make_columns_sortable( $columns ) {
$columns['course'] = 'course';
return $columns;
}
/**
* This function entered the information into the course section
* of the llms_review post page. It takes the column that is being
* worked on, as well as the comment ID, then echoes the content
* required.
*
* @param string $column Type of column being worked on
* @param int $post_id ID of comment
*
* @return void
*/
public function generate_column_data( $column, $post_id ) {
switch ( $column ) {
case 'course':
echo ( wp_get_post_parent_id( $post_id ) != 0 ) ? esc_html( get_the_title( wp_get_post_parent_id( $post_id ) ) ) : '';
break;
}
}
/**
* This function builds the additional content that is added
* to the course meta box. It builds the additional fields and
* then returns the updated array of fields
*
* @param array $content Array of meta fields
*
* @return array Updated array of meta fields
*/
public function add_review_meta_boxes( $content ) {
/**
* This array is what holds the updated fields.
* It is created in such a way so that a plugin
* can latch onto it to extend the review functionality
*
* @var array
*/
$fields = array(
array(
'type' => 'checkbox',
'label' => __( 'Enable Reviews', 'lifterlms' ),
'desc' => __( 'Select to enable reviews.', 'lifterlms' ),
'id' => self::$prefix . 'llms_reviews_enabled',
'class' => '',
'value' => '1',
'desc_class' => 'd-3of4 t-3of4 m-1of2',
'group' => '',
),
array(
'type' => 'checkbox',
'label' => __( 'Display Reviews', 'lifterlms' ),
'desc' => __( 'Select to display reviews on the page.', 'lifterlms' ),
'id' => self::$prefix . 'llms_display_reviews',
'class' => 'llms-num-reviews-top',
'value' => '1',
'desc_class' => 'd-3of4 t-3of4 m-1of2',
'group' => 'llms-num-reviews-top',
),
array(
'type' => 'number',
'min' => '0',
'label' => __( 'Number of Reviews', 'lifterlms' ),
'desc' => __( 'Number of reviews to display on the page.', 'lifterlms' ),
'id' => self::$prefix . 'llms_num_reviews',
'class' => 'input-full',
'value' => '',
'desc_class' => 'd-all',
'group' => 'bottom llms-num-reviews-bottom',
),
array(
'type' => 'checkbox',
'label' => __( 'Prevent Multiple Reviews', 'lifterlms' ),
'desc' => __( 'Select to prevent a user from submitting more than one review.', 'lifterlms' ),
'id' => self::$prefix . 'llms_multiple_reviews_disabled',
'class' => '',
'value' => '1',
'desc_class' => 'd-3of4 t-3of4 m-1of2',
'group' => '',
),
);
if ( has_filter( 'llms_review_fields' ) ) {
$fields = apply_filters( 'llms_review_fields', $fields );
}
$metaboxtab = array(
'title' => __( 'Reviews', 'lifterlms' ),
'fields' => $fields,
);
array_push( $content, $metaboxtab );
return $content;
}
/**
* Save metabox fields.
*
* @since Unknown
* @since 5.9.0 Stop using deprecated `FILTER_SANITIZE_STRING`.
*
* @return void
*/
public function save_review_meta_boxes() {
$post_id = llms_filter_input( INPUT_POST, 'post_ID', FILTER_SANITIZE_NUMBER_INT );
if ( ! $post_id ) {
return;
}
$post_type = get_post_type( $post_id );
if ( 'course' !== $post_type ) {
return;
}
// phpcs:disable WordPress.Security.NonceVerification.Missing -- Nonce verified by core before triggering hook.
$enabled = ( isset( $_POST['_llms_reviews_enabled'] ) ) ? llms_filter_input_sanitize_string( INPUT_POST, '_llms_reviews_enabled' ) : '';
$display = ( isset( $_POST['_llms_display_reviews'] ) ) ? llms_filter_input_sanitize_string( INPUT_POST, '_llms_display_reviews' ) : '';
$num = ( isset( $_POST['_llms_num_reviews'] ) ) ? llms_filter_input_sanitize_string( INPUT_POST, '_llms_num_reviews' ) : 0;
$multiple = ( isset( $_POST['_llms_multiple_reviews_disabled'] ) ) ? llms_filter_input_sanitize_string( INPUT_POST, '_llms_multiple_reviews_disabled' ) : '';
update_post_meta( $post_id, '_llms_reviews_enabled', $enabled );
update_post_meta( $post_id, '_llms_display_reviews', $display );
update_post_meta( $post_id, '_llms_num_reviews', $num );
update_post_meta( $post_id, '_llms_multiple_reviews_disabled', $multiple );
// phpcs:enable WordPress.Security.NonceVerification.Missing
}
}
return new LLMS_Admin_Reviews();