gocodebox/lifterlms

View on GitHub
includes/admin/class.llms.admin.reviews.php

Summary

Maintainability
A
2 hrs
Test Coverage
F
0%
<?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();