/wp-content/plugins/learnpress/inc/admin/class-lp-modal-search-items.php
PHP | 369 lines | 220 code | 57 blank | 92 comment | 27 complexity | d85d696f6ce09fb8c5d221773d8db9ea MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause
- <?php
- /**
- * Class LP_Modal_Search_Items.
- *
- * @author ThimPress
- * @package LearnPress/Classes
- * @version 3.0.0
- */
- /**
- * Prevent loading this file directly
- */
- defined( 'ABSPATH' ) || exit();
- if ( ! class_exists( 'LP_Modal_Search_Items' ) ) {
- /**
- * Class LP_Modal_Search_Items
- */
- class LP_Modal_Search_Items {
- /**
- * @var array
- */
- protected $_options = array();
- /**
- * @var array
- */
- protected $_query_args = array();
- /**
- * @var array
- */
- protected $_items = array();
- /**
- * @var bool
- */
- protected $_changed = true;
- /**
- * LP_Modal_Search_Items constructor.
- *
- * @param string $options
- */
- public function __construct( $options = '' ) {
- add_action( 'admin_print_footer_scripts', array( $this, 'js_template' ) );
- $this->_options = wp_parse_args(
- $options,
- array(
- 'type' => '',
- 'context' => '',
- 'context_id' => '',
- 'exclude' => '',
- 'term' => '',
- 'add_button' => __( 'Add', 'learnpress' ),
- 'close_button' => __( 'Close', 'learnpress' ),
- 'title' => __( 'Search items', 'learnpress' ),
- 'limit' => 10,
- 'paged' => 1
- )
- );
- if ( is_string( $this->_options['exclude'] ) ) {
- $this->_options['exclude'] = explode( ',', $this->_options['exclude'] );
- }
- add_filter( 'learn-press/modal-search-items/exclude', array(
- $this,
- 'exclude_items'
- ), 10, 4 );
- add_filter( 'learn-press/modal-search-items/args', array(
- $this,
- 'query_args'
- ), 10, 3 );
- // add_filter( 'learn-press/modal-search-items/not-found', array(
- // $this,
- // '_modal_search_items_not_found'
- // ), 10, 2 );
- }
- /**
- * Build query args from object options and get posts.
- *
- * @return array
- */
- protected function _get_items() {
- global $wpdb;
- $current_items = array();
- $current_items_in_order = learn_press_get_request( 'current_items' );
- $user = learn_press_get_current_user();
- $term = $this->_options['term'];
- $type = $this->_options['type'];
- $context = $this->_options['context'];
- $context_id = $this->_options['context_id'];
- if ( $current_items_in_order ) {
- foreach ( $current_items_in_order as $item ) {
- $sql = "SELECT meta_value
- FROM {$wpdb->prefix}learnpress_order_itemmeta
- WHERE meta_key = '_course_id'
- AND learnpress_order_item_id = $item";
- $id = $wpdb->get_results( $sql, OBJECT );
- array_push( $current_items, $id[0]->meta_value );
- }
- }
- // @since 3.0.0
- $exclude = array_unique( (array) apply_filters( 'learn-press/modal-search-items/exclude', $this->_options['exclude'], $type, $context, $context_id ) );
- // @deprecated
- $exclude = array_unique( (array) apply_filters( 'learn_press_modal_search_items_exclude', $exclude, $type, $context, $context_id ) );
- if ( is_array( $exclude ) ) {
- $exclude = array_map( 'intval', $exclude );
- }
- $paged = max( 1, $this->_options['paged'] );
- $args = array(
- 'post_type' => array( $type ),
- 'post_status' => 'publish',
- 'order' => 'ASC',
- 'orderby' => 'parent title',
- 'exclude' => $exclude,
- 'posts_per_page' => $this->_options['limit'],
- 'offset' => ( $paged - 1 ) * $this->_options['limit']
- );
- if ( $context_id = apply_filters( 'learn-press/modal-search-items/context-id', $context_id, $context ) ) {
- $args['author'] = get_post_field( 'post_author', $context_id );
- }
- if ( $term ) {
- $args['s'] = $term;
- }
- // @since 3.0.0
- $this->_query_args = apply_filters( 'learn-press/modal-search-items/args', $args, $context, $context_id );
- // @deprecated
- $this->_query_args = apply_filters( 'learn_press_filter_admin_ajax_modal_search_items_args', $this->_query_args, $context, $context_id );
- if ( $posts = get_posts( $this->_query_args ) ) {
- $this->_items = wp_list_pluck( $posts, 'ID' );
- }
- return $this->_items;
- }
- /**
- * Get the items
- *
- * @return array
- */
- public function get_items() {
- if ( $this->_changed ) {
- $this->_get_items();
- }
- return $this->_items;
- }
- /**
- * Get pagination in html.
- *
- * @param bool $html
- *
- * @return array|string
- */
- function get_pagination( $html = true ) {
- $pagination = '';
- if ( $items = $this->get_items() ) {
- $args = $this->_query_args;
- if ( ! empty( $args['exclude'] ) ) {
- $args['post__not_in'] = $args['exclude'];
- }
- $q = new WP_Query( $args );
- if ( $this->_options['paged'] && $q->max_num_pages > 1 ) {
- $pagenum_link = html_entity_decode( get_pagenum_link() );
- $query_args = array();
- $url_parts = explode( '?', $pagenum_link );
- if ( isset( $url_parts[1] ) ) {
- wp_parse_str( $url_parts[1], $query_args );
- }
- $pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link );
- $pagenum_link = trailingslashit( $pagenum_link ) . '%_%';
- $pagination = array(
- 'base' => $pagenum_link,
- 'total' => $q->max_num_pages,
- 'current' => max( 1, $this->_options['paged'] ),
- 'mid_size' => 1,
- 'add_args' => array_map( 'urlencode', $query_args ),
- 'prev_text' => __( '<', 'learnpress' ),
- 'next_text' => __( '>', 'learnpress' ),
- 'type' => ''
- );
- if ( $html ) {
- $pagination = paginate_links( $pagination );
- }
- }
- $this->_changed = false;
- }
- return $pagination;
- }
- /**
- * Return string of list items
- *
- * @return string
- */
- public function get_html_items() {
- ob_start();
- if ( $items = $this->get_items() ) {
- foreach ( $items as $id => $item ) {
- $type = get_post_type( $item );
- $type_object = get_post_type_object( $type );
- $type_name = $type_object ? $type_object->labels->singular_name : '';
- printf( '
- <li class="%s" data-id="%2$d" data-type="%4$s" data-text="%3$s">
- <label>
- <input type="checkbox" value="%2$d" name="selectedItems[]">
- <span class="lp-item-text">%3$s (%5$s - #%6$s)</span>
- </label>
- </li>
- ', 'lp-result-item', $item, esc_attr( get_the_title( $item ) ), $type, $type_name, $item );
- }
- } else {
- // @since 3.0.0
- $item_not_found = apply_filters( 'learn-press/modal-search-items/not-found', __( 'No item found', 'learnpress' ), $this->_options['type'] );
- // @deprecated
- $item_not_found = apply_filters( 'learn_press_modal_search_items_not_found', $item_not_found );
- echo '<li>' . $item_not_found . '</li>';
- }
- return ob_get_clean();
- }
- /**
- * JS Modal template.
- */
- public function js_template() {
- $view = learn_press_get_admin_view( 'modal-search-items' );
- include $view;
- }
- /**
- * @param array $args
- * @param string $context
- * @param string $context_id
- *
- * @return mixed
- */
- public static function query_args( $args, $context, $context_id ) {
- if ( ( LP_ORDER_CPT === get_post_type( $context_id ) ) && ( LP_COURSE_CPT === $args['post_type'] ) ) {
- if ( ! empty( $args['author'] ) ) {
- unset( $args['author'] );
- }
- }
- return $args;
- }
- /**
- * Filter to exclude the items has already added to it's parent.
- * Each item only use one time
- *
- * @param $exclude
- * @param $type
- * @param string $context
- * @param null $context_id
- *
- * @return array
- */
- public static function exclude_items( $exclude, $type, $context = '', $context_id = null ) {
- global $wpdb;
- $used_items = array();
- switch ( $type ) {
- case 'lp_lesson':
- case 'lp_quiz':
- $query = $wpdb->prepare( "
- SELECT item_id
- FROM {$wpdb->prefix}learnpress_section_items si
- INNER JOIN {$wpdb->prefix}learnpress_sections s ON s.section_id = si.section_id
- INNER JOIN {$wpdb->posts} p ON p.ID = s.section_course_id
- WHERE %d
- AND p.post_type = %s
- ", 1, LP_COURSE_CPT );
- $used_items = $wpdb->get_col( $query );
- break;
- case 'lp_question':
- $query = $wpdb->prepare( "
- SELECT question_id
- FROM {$wpdb->prefix}learnpress_quiz_questions AS qq
- INNER JOIN {$wpdb->posts} q ON q.ID = qq.quiz_id
- WHERE %d
- AND q.post_type = %s
- ", 1, LP_QUIZ_CPT );
- $used_items = $wpdb->get_col( $query );
- break;
- }
- if ( $used_items && $exclude ) {
- $exclude = array_merge( $exclude, $used_items );
- } else if ( $used_items ) {
- $exclude = $used_items;
- }
- return is_array( $exclude ) ? array_unique( $exclude ) : array();
- }
- /**
- * @param $message
- * @param $type
- *
- * @return string
- */
- public static function items_not_found( $message, $type ) {
- switch ( $type ) {
- case LP_LESSON_CPT:
- $message = __( 'There are no available lessons for this course, please use ', 'learnpress' );
- $message .= '<a target="_blank" href="' . admin_url( 'post-new.php?post_type=lp_lesson' ) . '">' . esc_html__( 'Add new item', 'learnpress' ) . '</a>';
- break;
- case LP_QUIZ_CPT:
- $message = __( 'There are no available quizzes for this course, please use ', 'learnpress' );
- $message .= '<a target="_blank" href="' . admin_url( 'post-new.php?post_type=lp_quiz' ) . '">' . esc_html__( 'Add new item', 'learnpress' ) . '</a>';
- break;
- case LP_QUESTION_CPT:
- $message = __( 'There are no available questions for this quiz, please use ', 'learnpress' );
- $message .= '<a target="_blank" href="' . admin_url( 'post-new.php?post_type=lp_question' ) . '">' . esc_html__( 'Add new item', 'learnpress' ) . '</a>';
- break;
- }
- return $message;
- }
- /**
- * @return bool|LP_Modal_Search_Items
- */
- public static function instance() {
- static $instance = false;
- if ( ! $instance ) {
- $instance = new self();
- }
- return $instance;
- }
- }
- }