File "class-lp-page-controller.php"
Full Path: /home/ubunrgit/public_html/wp-content/plugins/learnpress/inc/class-lp-page-controller.php
File size: 38.68 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Class LP_Page_Controller
*/
class LP_Page_Controller {
protected static $_instance = null;
protected $_shortcode_exists = false;
protected $_shortcode_tag = '[learn_press_archive_course]';
protected $_archive_contents = null;
/**
* Store the object has queried by WP.
*
* @var int
*/
protected $_queried_object = 0;
/**
* @var int
*/
protected $_filter_content_priority = 10000;
/**
* Flag for 404 content.
*
* @var bool
*/
protected $_is_404 = false;
/**
* LP_Page_Controller constructor.
*/
protected function __construct() {
add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ), 10 );
add_filter( 'template_include', array( $this, 'template_loader' ), 10 );
// Comment by tungnx
// add_filter( 'template_include', array( $this, 'template_content_item' ), 20 );
// add_filter( 'template_include', array( $this, 'maybe_redirect_quiz' ), 30 );
add_filter( 'template_include', array( $this, 'check_pages' ), 30 );
add_filter( 'template_include', array( $this, 'auto_shortcode' ), 50 );
add_filter( 'the_post', array( $this, 'setup_data_for_item_course' ) );
add_filter( 'request', array( $this, 'remove_course_post_format' ), 1 );
add_shortcode( 'learn_press_archive_course', array( $this, 'archive_content' ) );
add_filter( 'pre_get_document_title', array( $this, 'set_title_pages' ), 20, 1 );
// Yoast seo
add_filter( 'wpseo_opengraph_desc', array( $this, 'lp_desc_item_yoast_seo' ), 11, 1 );
add_filter( 'wpseo_metadesc', array( $this, 'lp_desc_item_yoast_seo' ), 11, 1 );
// edit link item course when form search default wp
add_filter( 'post_type_link', array( $this, 'post_type_link' ), 10, 2 );
// add_action( 'the_post', array( $this, 'learn_press_setup_object_data' ) );
// Set link profile to admin menu
add_action( 'admin_bar_menu', array( $this, 'learn_press_edit_admin_bar' ) );
add_action( 'plugins_loaded', array( $this, 'lp_rest_api_called' ) );
}
/**
* Optimize when Rest API LP called
*
* @return void
*/
public function lp_rest_api_called() {
if ( LP_Helper::isRestApiLP() ) {
if ( ! defined( 'SHORTINIT' ) ) {
define( 'SHORTINIT', true );
}
// Remove hook wp_loaded because query default WP run on it (it hooks 'pre_get_posts',...)
remove_all_actions( 'wp_loaded' );
}
}
/**
* When the_post is called, put course data into a global.
*
* Todo: after replace code LP::course()
*
* @param mixed $post
*
* @return LP_Course
*/
/*public function learn_press_setup_object_data( $post ) {
$object = null;
if ( is_int( $post ) ) {
$post = get_post( $post );
}
if ( ! $post ) {
return $object;
}
if ( LP_COURSE_CPT === $post->post_type ) {
if ( isset( $GLOBALS['course'] ) ) {
unset( $GLOBALS['course'] );
}
$object = learn_press_get_course( $post->ID );
LP()->global['course'] = $GLOBALS['course'] = $GLOBALS['lp_course'] = $object;
}
return $object;
}*/
/**
* Set link item course when form search default wp
*
* @param string $post_link
* @param object $post
*/
public function post_type_link( $post_link, $post ) {
// Set item's course permalink
$course_item_types = learn_press_get_course_item_types();
$item_id = $post->ID;
if ( in_array( $post->post_type, $course_item_types ) ) {
$section_id = LP_Section_DB::getInstance()->get_section_id_by_item_id( $item_id );
if ( ! $section_id ) {
return $post_link;
}
$course_id = LP_Section_DB::getInstance()->get_course_id_by_section( $section_id );
if ( ! $course_id ) {
return $post_link;
}
$course = learn_press_get_course( $course_id );
$post_link = $course->get_item_link( $item_id );
} elseif ( LP_COURSE_CPT === $post->post_type ) {
// Abort early if the placeholder rewrite tag isn't in the generated URL
if ( false === strpos( $post_link, '%' ) ) {
return $post_link;
}
// Get the custom taxonomy terms in use by this post
$terms = get_the_terms( $post->ID, 'course_category' );
if ( ! empty( $terms ) ) {
$terms = _learn_press_usort_terms_by_ID( $terms ); // order by ID
$category_object = apply_filters(
'learn_press_course_post_type_link_course_category',
$terms[0],
$terms,
$post
);
$category_object = get_term( $category_object, 'course_category' );
$course_category = $category_object->slug;
$parent = $category_object->parent;
if ( $parent ) {
$ancestors = get_ancestors( $category_object->term_id, 'course_category' );
foreach ( $ancestors as $ancestor ) {
$ancestor_object = get_term( $ancestor, 'course_category' );
$course_category = $ancestor_object->slug . '/' . $course_category;
}
}
} else {
// If no terms are assigned to this post, use a string instead (can't leave the placeholder there)
$course_category = _x( 'uncategorized', 'slug', 'learnpress' );
}
$find = array(
'%year%',
'%monthnum%',
'%day%',
'%hour%',
'%minute%',
'%second%',
'%post_id%',
'%category%',
'%course_category%',
);
$replace = array(
date_i18n( 'Y', strtotime( $post->post_date ) ),
date_i18n( 'm', strtotime( $post->post_date ) ),
date_i18n( 'd', strtotime( $post->post_date ) ),
date_i18n( 'H', strtotime( $post->post_date ) ),
date_i18n( 'i', strtotime( $post->post_date ) ),
date_i18n( 's', strtotime( $post->post_date ) ),
$post->ID,
$course_category,
$course_category,
);
$post_link = str_replace( $find, $replace, $post_link );
}
return $post_link;
}
private function has_block_template( $template_name ) {
if ( ! $template_name ) {
return false;
}
$has_template = false;
$template_name = str_replace( 'course', LP_COURSE_CPT, $template_name );
$template_filename = $template_name . '.html';
// Since Gutenberg 12.1.0, the conventions for block templates directories have changed,
// we should check both these possible directories for backwards-compatibility.
$possible_templates_dirs = array( 'templates', 'block-templates' );
// Combine the possible root directory names with either the template directory
// or the stylesheet directory for child themes, getting all possible block templates
// locations combinations.
$filepath = DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $template_filename;
$legacy_filepath = DIRECTORY_SEPARATOR . 'block-templates' . DIRECTORY_SEPARATOR . $template_filename;
$possible_paths = array(
get_stylesheet_directory() . $filepath,
get_stylesheet_directory() . $legacy_filepath,
get_template_directory() . $filepath,
get_template_directory() . $legacy_filepath,
);
// Check the first matching one.
foreach ( $possible_paths as $path ) {
if ( is_readable( $path ) ) {
$has_template = true;
break;
}
}
/**
* Filters the value of the result of the block template check.
*
* @since x.x.x
*
* @param boolean $has_template value to be filtered.
* @param string $template_name The name of the template.
*/
return (bool) apply_filters( 'learnpress_has_block_template', $has_template, $template_name );
}
/**
* Set title of pages
*
* 1. Title course archive page
* 2. Title item of course
* 3. Title page Profile
*
* @param string $title
*
* @return string
* @author tungnx
* @since 3.2.7.7
*/
public function set_title_pages( $title = '' ) {
global $wp_query;
$flag_title_course = false;
$course_archive_page_id = LP_Settings::instance()->get( 'courses_page_id', 0 );
// Set title course archive page
if ( ! empty( $course_archive_page_id ) && $wp_query->post &&
$course_archive_page_id == $wp_query->post->ID ) {
$title = get_the_title( $course_archive_page_id );
$flag_title_course = true;
} elseif ( learn_press_is_course() ) {
$item = LP_Global::course_item();
if ( $item ) {
$title = apply_filters( 'learn-press/document-course-title-parts', get_the_title() . ' → ' . $item->get_title(), $item );
$flag_title_course = true;
}
} elseif ( learn_press_is_courses() ) {
if ( learn_press_is_search() ) {
$title = __( 'Course Search Results', 'learnpress' );
} else {
$title = __( 'Courses', 'learnpress' );
}
$flag_title_course = true;
} elseif ( learn_press_is_profile() ) {
$profile = LP_Profile::instance();
$tab_slug = $profile->get_current_tab();
$tab = $profile->get_tab_at( $tab_slug );
if ( $page_id = learn_press_get_page_id( 'profile' ) ) {
$page_title = get_the_title( $page_id );
} else {
$page_title = '';
}
if ( $tab ) {
$title = join(
' ',
apply_filters(
'learn-press/document-profile-title-parts',
array(
$page_title,
'→',
$tab['title'],
)
)
);
}
$flag_title_course = true;
}
if ( $flag_title_course ) {
$title .= ' - ' . get_bloginfo( 'name', 'display' );
}
return apply_filters( 'learn-press/title-page', $title );
}
/**
* Set description of course's item for yoast seo
*
* @param $desc
*
* @return mixed
* @author tungnx
* @since 3.2.7.9
*/
public function lp_desc_item_yoast_seo( $desc ) {
if ( learn_press_is_course() ) {
$item = LP_Global::course_item();
if ( empty( $item ) ) {
return $desc;
}
$desc = get_post_meta( $item->get_id(), '_yoast_wpseo_metadesc', true );
}
return $desc;
}
public function check_pages( $template ) {
if ( learn_press_is_checkout() ) {
$available_gateways = LP_Gateways::instance()->get_available_payment_gateways();
if ( ! $available_gateways ) {
learn_press_add_message( __( 'No payment method is available.', 'learnpress' ), 'error' );
}
} else {
global $wp_query;
$logout_slug = learn_press_profile_logout_slug();
if ( $logout_slug && ( $wp_query->get( 'view' ) === $logout_slug ) ) {
wp_safe_redirect( str_replace( '&', '&', wp_logout_url( learn_press_get_page_link( 'profile' ) ) ) );
exit;
}
}
return $template;
}
/**
* Auto inserting a registered shortcode to a specific page
* if that page is viewing in single mode.
*
* @param string $template
*
* @return string;
* @since 3.3.0
*/
public function auto_shortcode( $template ) {
global $post;
$the_post = $post;
if ( $the_post && is_page( $the_post->ID ) ) {
// Filter here to insert the shortcode
$auto_shortcodes = apply_filters( 'learn-press/auto-shortcode-pages', array() );
if ( ! empty( $auto_shortcodes[ $the_post->ID ] ) ) {
$shortcode_tag = $auto_shortcodes[ $the_post->ID ];
preg_match( '/\[' . $shortcode_tag . '\s?(.*)\]/', $the_post->post_content, $results );
if ( empty( $results ) ) {
$content = $the_post->post_content . "[$shortcode_tag]";
$the_post->post_content = $content;
}
}
}
return $template;
}
/**
* @editor tungnx
* @modify 4.1.3 - comment - not use
*/
/*
public function maybe_redirect_quiz( $template ) {
$course = learn_press_get_course();
$quiz = LP_Global::course_item_quiz();
$user = learn_press_get_current_user();
$redirect = false;
if ( learn_press_is_review_questions() ) {
if ( ! $quiz->get_review_questions() ) {
$redirect = $course->get_item_link( $quiz->get_id() );
}
}
if ( LP_Global::quiz_question() && ! $user->has_started_quiz( $quiz->get_id(), $course->get_id() ) ) {
$redirect = $course->get_item_link( $quiz->get_id() );
}
if ( $redirect ) {
wp_redirect( $redirect );
exit();
}
return $template;
}*/
/**
* Load data for item of course
*
* @param $post
*
* @return mixed
* @editor tungnx
* Todo: should remove this function when load true type post's item
*/
public function setup_data_for_item_course( $post ): WP_Post {
/**
* @var WP $wp
* @var WP_Query $wp_query
* @var LP_Course $lp_course
* @var LP_Course_Item|LP_Quiz|LP_Lesson $lp_course_item
*/
global $wp, $wp_query, $lp_course_item;
$lp_course = learn_press_get_course();
if ( LP_COURSE_CPT !== $post->post_type ) {
return $post;
}
$course = learn_press_get_course( $post->ID );
if ( ! $course ) {
return $post;
}
/**
* @deprecated v4.1.6.1 LP()->global['course'], $GLOBALS['course']
*/
LP()->global['course'] = $GLOBALS['course'] = $GLOBALS['lp_course'] = $course;
if ( wp_verify_nonce( LP_Request::get( 'preview' ), 'preview-' . $post->ID ) ) {
$GLOBALS['preview_course'] = $post->ID;
}
$vars = $wp->query_vars;
if ( empty( $vars['course-item'] ) ) {
return $post;
}
if ( ! $wp_query->is_main_query() ) {
return $post;
}
try {
// If item name is set in query vars
if ( ! is_numeric( $vars['course-item'] ) ) {
$item_type = $vars['item-type'];
$post_item = learn_press_get_post_by_name( $vars['course-item'], $item_type );
} else {
$post_item = get_post( absint( $vars['course-item'] ) );
}
if ( ! $post_item ) {
return $post;
}
/**
* Comment for reason some page-builder run wrong
*
* 1. Anywhere elementor
* 2. WPBakery
*/
/*$section_id = LP_Section_DB::getInstance()->get_section_id_by_item_id( $post_item->ID );
if ( ! $section_id ) {
throw new Exception( __( 'The item is not assigned to any section', 'learnpress' ) );
}
$course_id = LP_Section_DB::getInstance()->get_course_id_by_section( $section_id );
if ( ! $course_id ) {
throw new Exception( __( 'The item is not assigned to any course', 'learnpress' ) );
}
if ( $course_id != $post->ID ) {
throw new Exception( __( 'The item is not assigned to this course', 'learnpress' ) );
}*/
$lp_course_item = apply_filters( 'learn-press/single-course-request-item', LP_Course_Item::get_item( $post_item->ID, $course->get_id() ) );
if ( ! $lp_course_item ) {
return $post;
}
$lp_course->set_viewing_item( $lp_course_item );
} catch ( Exception $ex ) {
learn_press_add_message( $ex->getMessage(), 'error' );
}
return $post;
}
/**
* Set page 404
*
* @return mixed
* @editor tungnx
* @reason not use
* @deprecated 4.0.0
*/
/*
public function set_404( $is_404 ) {
global $wp_query;
$wp_query->is_404 = $this->_is_404 = (bool) $is_404;
}*/
public function is_404() {
return apply_filters( 'learn-press/query/404', $this->_is_404 );
}
public function template_content_item( $template ) {
/**
* @var LP_Course $lp_course
* @var LP_Course_Item $lp_course_item
* @var LP_User $lp_user
*/
global $lp_course, $lp_course_item, $lp_user;
do_action( 'learn-press/parse-course-item', $lp_course_item, $lp_course );
return $template;
}
/**
* In preview mode, if there is a 'post_format' in query var
* wp check and replace our post-type to post. This make preview
* course item become 404
*
* @param $qv
*
* @return mixed
*/
public function remove_course_post_format( $qv ) {
if ( ! empty( $qv['post_type'] ) && LP_COURSE_CPT === $qv['post_type'] ) {
if ( ! empty( $qv['post_format'] ) ) {
unset( $qv['post_format'] );
}
}
return $qv;
}
/**
* @return bool
*/
protected function _is_archive() {
return learn_press_is_courses() || learn_press_is_course_tag() || learn_press_is_course_category() || learn_press_is_search() || learn_press_is_course_tax();
}
/**
* @return bool
*/
protected function _is_single() {
return learn_press_is_course() && is_single();
}
/**
* Load content of course depending on query.
*
* @param string $template
*
* @return bool|string
*/
public function template_loader( $template ) {
if ( is_embed() ) {
return $template;
}
// $this->_maybe_redirect_courses_page();
$default_template = $this->get_page_template();
if ( $default_template ) {
$templates = $this->get_page_templates( $default_template );
/**
* Disable override templates in theme by default since LP 4.0.0
*/
if ( learn_press_override_templates() ) {
$new_template = locate_template( $templates );
}
if ( ! isset( $new_template ) || ! $new_template ) {
$new_template = LP_TEMPLATE_PATH . $default_template;
}
$template = $new_template;
}
return $template;
}
/**
* Get the default filename for a template.
*
* @return string
* @since 4.0.0
*/
private function get_page_template() {
$page_template = '';
if ( is_singular( LP_COURSE_CPT ) ) {
if ( ! self::has_block_template( 'single-course' ) ) {
$page_template = 'single-course.php';
}
if ( $this->_is_single() ) {
global $post;
setup_postdata( $post );
$course_item = LP_Global::course_item();
if ( $course_item && ! self::has_block_template( 'content-single-course-item' ) ) {
$page_template = 'content-single-item.php';
}
}
} elseif ( learn_press_is_course_taxonomy() ) {
$object = get_queried_object();
if ( is_tax( 'course_category' ) || is_tax( 'course_tag' ) ) {
$page_template = 'taxonomy-' . $object->taxonomy . '.php';
if ( self::has_block_template( 'taxonomy-' . $object->taxonomy ) ) {
$page_template = '';
} elseif ( ! file_exists( learn_press_locate_template( $page_template ) ) && ! self::has_block_template( 'archive-course' ) ) {
$page_template = 'archive-course.php';
}
} elseif ( ! self::has_block_template( 'archive-course' ) ) {
$page_template = 'archive-course.php';
}
} elseif ( ( is_post_type_archive( LP_COURSE_CPT ) || ( ! empty( learn_press_get_page_id( 'courses' ) ) && is_page( learn_press_get_page_id( 'courses' ) ) ) ) && ! self::has_block_template( 'archive-course' ) ) {
$page_template = 'archive-course.php';
} elseif ( learn_press_is_checkout() && ! self::has_block_template( 'page-lp_checkout' ) ) {
$page_template = 'pages/checkout.php';
}
return apply_filters( 'learn-press/page-template', $page_template );
}
private function get_page_templates( $default_template ) {
$templates = apply_filters( 'learn-press/page-templates', array(), $default_template );
if ( is_page_template() ) {
$page_template = get_page_template_slug();
if ( $page_template ) {
$validated_file = validate_file( $page_template );
if ( 0 === $validated_file ) {
$templates[] = $page_template;
} else {
error_log( "LearnPress: Unable to validate template path: \"$page_template\". Error Code: $validated_file." );
}
}
}
if ( is_singular( LP_COURSE_CPT ) ) {
$object = get_queried_object();
$name_decoded = urldecode( $object->post_name );
if ( $name_decoded !== $object->post_name ) {
$templates[] = "single-course-{$name_decoded}.php";
}
$templates[] = "single-product-{$object->post_name}.php";
}
if ( learn_press_is_course_taxonomy() ) {
$object = get_queried_object();
$templates[] = 'taxonomy-' . $object->taxonomy . '-' . $object->slug . '.php';
$templates[] = learn_press_template_path( true ) . 'taxonomy-' . $object->taxonomy . '-' . $object->slug . '.php';
$templates[] = 'taxonomy-' . $object->taxonomy . '.php';
$templates[] = learn_press_template_path( true ) . 'taxonomy-' . $object->taxonomy . '.php';
}
$templates[] = $default_template;
$templates[] = learn_press_template_path( true ) . $default_template;
return array_unique( $templates );
}
/**
* Filter to allow search more templates in theme for wp page template hierarchy.
* Theme twentytwenty used 'singular.php' instead of 'page.php'
*
* @param array $templates
*
* @return array
* @since 3.x.x
*/
public function page_template_hierarchy( $templates ) {
$templates = array_merge( $templates, array( 'singular.php' ) );
return $templates;
}
/**
* @return bool
* @editor tungnx - comment 4.1.6.6
*/
// protected function _maybe_redirect_courses_page() {
// /**
// * If is archive course page and a static page is used for displaying courses
// * we need to redirect it to the right page
// */
// if ( ! is_post_type_archive( LP_COURSE_CPT ) ) {
// return false;
// }
//
// /**
// * @var WP_Query $wp_query
// * @var WP_Rewrite $wp_rewrite
// */
// global $wp_query, $wp_rewrite;
//
// $page_id = learn_press_get_page_id( 'courses' );
//
// if ( $page_id && ( empty( $wp_query->queried_object_id ) || ! empty( $wp_query->queried_object_id ) && $page_id != $wp_query->queried_object_id ) ) {
// $redirect = trailingslashit( learn_press_get_page_link( 'courses' ) );
//
// if ( ! empty( $wp_query->query['paged'] ) ) {
// if ( $wp_rewrite->using_permalinks() ) {
// $redirect = $redirect . 'page/' . $wp_query->query['paged'] . '/';
// } else {
// $redirect = add_query_arg( 'paged', $wp_query->query['paged'], $redirect );
// }
// }
//
// if ( isset( $_GET ) ) {
// $_GET = array_map( 'stripslashes_deep', $_GET );
// foreach ( $_GET as $k => $v ) {
// $redirect = add_query_arg( $k, urlencode( $v ), $redirect );
// }
// }
//
// if ( $page_id != get_option( 'page_on_front' ) && ! learn_press_is_current_url( $redirect ) ) {
// wp_redirect( $redirect );
// exit();
// }
// }
//
// return false;
// }
public function archive_content() {
ob_start();
learn_press_get_template( 'content-archive-course.php' );
return ob_get_clean();
}
/**
* @param $title
*
* @return mixed
*/
public function page_title( $title ) {
global $wp_query;
if ( ! empty( $wp_query->queried_object_id ) ) {
$title['title'] = get_the_title( $wp_query->queried_object_id );
}
return $title;
}
/**
* Load archive courses content.
*
* @param string $template
*
* @return string
*/
public function _load_archive_courses( $template ) {
if ( ! defined( 'LEARNPRESS_IS_COURSES' ) ) {
define( 'LEARNPRESS_IS_COURSES', learn_press_is_courses() );
}
if ( ! defined( 'LEARNPRESS_IS_TAG' ) ) {
define( 'LEARNPRESS_IS_TAG', learn_press_is_course_tag() );
}
if ( ! defined( 'LEARNPRESS_IS_CATEGORY' ) ) {
define( 'LEARNPRESS_IS_CATEGORY', learn_press_is_course_category() );
}
if ( ! defined( 'LEARNPRESS_IS_TAX' ) ) {
define( 'LEARNPRESS_IS_TAX', learn_press_is_course_tax() );
}
if ( ! defined( 'LEARNPRESS_IS_SEARCH' ) ) {
define( 'LEARNPRESS_IS_SEARCH', learn_press_is_search() );
}
if ( LEARNPRESS_IS_COURSES || LEARNPRESS_IS_TAG || LEARNPRESS_IS_CATEGORY || LEARNPRESS_IS_SEARCH || LEARNPRESS_IS_TAX ) {
global $wp_query;
// PHP 7
LP()->wp_query = clone $wp_query;
$template = get_page_template();
/**
* Fix in case a static page is used for archive course page and
* it's slug is the same with course archive slug (courses).
* In this case, WP know it as a course archive page not a
* single page.
*/
$course_page_id = learn_press_get_page_id( 'courses' );
$course_page_slug = get_post_field( 'post_name', $course_page_id );
if ( ! LEARNPRESS_IS_CATEGORY && $course_page_id && $course_page_slug ) {
if ( $course_page_slug == 'courses' ) {
$wp_query->queried_object_id = $course_page_id;
$this->queried_object = $wp_query->queried_object = get_post( $course_page_id );
add_filter( 'document_title_parts', array( $this, 'page_title' ) );
}
}
$wp_query->posts_per_page = 1;
$wp_query->nopaging = true;
$wp_query->post_count = 1;
// If we don't have a post, load an empty one
if ( ! empty( $this->_queried_object ) ) {
$wp_query->post = $this->_queried_object;
} elseif ( empty( $wp_query->post ) || learn_press_is_courses() /* -> Fixed: archive course page displays name of first course */ ) {
$wp_query->post = new WP_Post( new stdClass() );
} elseif ( $wp_query->post->post_type != 'page' ) {
// Do not show content of post if it is not a page
$wp_query->post->post_content = '';
}
$content = $wp_query->post->post_content;
preg_match( '/\[learn_press_archive_course\s?(.*)\]/', $content, $results );
$this->_shortcode_exists = ! empty( $results );
if ( empty( $results ) ) {
$content = wpautop( $content ) . $this->_shortcode_tag;
} else {
$this->_shortcode_tag = $results[0];
}
$has_filter = false;
if ( has_filter( 'the_content', 'wpautop' ) ) {
$has_filter = true;
remove_filter( 'the_content', 'wpautop' );
}
// $content = do_shortcode( $content );
if ( $has_filter ) {
// add_filter( 'the_content', 'wpautop' );
}
$this->_archive_contents = do_shortcode( $this->_shortcode_tag );
if ( class_exists( 'SiteOrigin_Panels' ) ) {
if ( class_exists( 'SiteOrigin_Panels' ) &&
has_filter( 'the_content', array( SiteOrigin_Panels::single(), 'generate_post_content' ) )
) {
remove_shortcode( 'learn_press_archive_course' );
add_filter(
'the_content',
array(
$this,
'the_content_callback',
),
$this->_filter_content_priority
);
}
} else {
$content = do_shortcode( $content );
}
if ( empty( $wp_query->post->ID ) || LEARNPRESS_IS_CATEGORY ) {
$wp_query->post->ID = 0;
}
$wp_query->post->filter = 'raw';
if ( learn_press_is_course_category() ) {
$wp_query->post->post_title = single_term_title( '', false );
}
$wp_query->post->post_content = $content;
$wp_query->posts = array( $wp_query->post );
if ( is_post_type_archive( LP_COURSE_CPT ) || LEARNPRESS_IS_CATEGORY ) {
$wp_query->is_page = false;
$wp_query->is_archive = true;
$wp_query->is_single = false;
} else {
$wp_query->found_posts = 1;
$wp_query->is_single = true;
$wp_query->is_preview = false;
$wp_query->is_archive = false;
$wp_query->is_date = false;
$wp_query->is_year = false;
$wp_query->is_month = false;
$wp_query->is_day = false;
$wp_query->is_time = false;
$wp_query->is_author = false;
$wp_query->is_category = false;
$wp_query->is_tag = false;
$wp_query->is_tax = false;
$wp_query->is_search = false;
$wp_query->is_feed = false;
$wp_query->is_comment_feed = false;
$wp_query->is_trackback = false;
$wp_query->is_home = false;
$wp_query->is_404 = false;
$wp_query->is_comments_popup = false;
$wp_query->is_paged = false;
$wp_query->is_admin = false;
$wp_query->is_attachment = false;
$wp_query->is_singular = false;
$wp_query->is_posts_page = false;
$wp_query->is_post_type_archive = false;
}
}
return $template;
}
/**
* Query courses if page is archive courses
*
* @param $q WP_Query
*
* @return WP_Query
* @editor tungnx
* @modify 4.1.2
* @throws Exception
*/
public function pre_get_posts( WP_Query $q ): WP_Query {
// Affect only the main query and not in admin
if ( ! $q->is_main_query() && ! is_admin() ) {
return $q;
}
// Exclude item not assign
if ( $q->is_search() ) {
// Exclude item not assign any course
$course_item_types = learn_press_get_course_item_types();
$list_ids_exclude = array();
foreach ( $course_item_types as $item_type ) {
$filter = new LP_Post_Type_Filter();
$filter->post_type = $item_type;
$exclude_item = LP_Course_DB::getInstance()->get_item_ids_unassigned( $filter );
$exclude_item = LP_Course_DB::get_values_by_key( $exclude_item );
$list_ids_exclude = array_merge( $list_ids_exclude, $exclude_item );
}
// Exclude question not assign any quiz
$question_ids = LP_Question_DB::getInstance()->get_questions_not_assign_quiz();
$question_ids = LP_Course_DB::get_values_by_key( $question_ids );
$list_ids_exclude = array_merge( $list_ids_exclude, $question_ids );
if ( ! empty( $list_ids_exclude ) ) {
$q->set( 'post__not_in', $list_ids_exclude );
}
}
$is_archive_course = false;
// Handle 404 if user are viewing course item directly.
$this->set_link_item_course_default_wp_to_page_404( $q );
$this->_queried_object = ! empty( $q->queried_object_id ) ? $q->queried_object : false;
/**
* If current page is used for courses page
* Set on both: "Homepage" and "Posts page" on Reading Settings
*/
$page_courses_id = learn_press_get_page_id( 'courses' );
if ( $q->is_home() && 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $page_courses_id ) {
$is_archive_course = 1;
// $q->is_home = false;
// $q->set( 'page_id', get_option( 'page_on_front' ) );
}
/**
* If current page is used for courses page and set as "Homepage"
*/
if ( $q->is_page() && 'page' == get_option( 'show_on_front' ) && $page_courses_id && $q->get( 'page_id' ) == $page_courses_id ) {
$is_archive_course = 1;
/*
global $wp_post_types;
$course_page = get_post( $page_courses_id );
$this->_queried_object = $course_page;
$wp_post_types[ LP_COURSE_CPT ]->ID = $course_page->ID;
$wp_post_types[ LP_COURSE_CPT ]->post_title = $course_page->post_title;
$wp_post_types[ LP_COURSE_CPT ]->post_name = $course_page->post_name;
$wp_post_types[ LP_COURSE_CPT ]->post_type = $course_page->post_type;
$wp_post_types[ LP_COURSE_CPT ]->ancestors = get_ancestors( $course_page->ID, $course_page->post_type );*/
}
// Set custom posts per page
if ( $this->_is_archive() ) {
$is_archive_course = 1;
}
$apply_lazy_load_for_theme = apply_filters( 'lp/page/courses/query/lazy_load', false );
if ( $is_archive_course ) {
if ( ( LP_Settings_Courses::is_ajax_load_courses() && ! LP_Settings_Courses::is_no_load_ajax_first_courses() ) ) {
LP()->template( 'course' )->remove_callback( 'learn-press/after-courses-loop', 'loop/course/pagination.php', 10 );
/**
* If page is archive course - query set posts_per_page = 1
* For fastest - because when page loaded - call API to load list courses
*
* Current, apply only for LP, not apply for theme Thimpress, because theme override
*/
$q->set( 'posts_per_page', 1 );
$q->set( 'posts_per_archive_page', 1 );
$q->set( 'nopaging', true );
} else {
$limit = LP_Settings::get_option( 'archive_course_limit', 6 );
$q->set( 'posts_per_page', $limit );
// $q->set( 'cache_results', true ); // it default true
// Search courses by keyword
$q->set( 's', $_REQUEST['c_search'] ?? '' );
// Meta query
$meta_query = [];
if ( isset( $_REQUEST['sort_by'] ) ) {
if ( 'on_paid' === $_REQUEST['sort_by'] ) {
$meta_query[] = array(
'key' => '_lp_price',
'value' => 0,
'compare' => '>',
);
}
if ( 'on_free' === $_REQUEST['sort_by'] ) {
$meta_query[] = array(
'key' => '_lp_price',
'value' => 0,
'compare' => '=',
);
}
}
$q->set( 'meta_query', $meta_query );
// End Meta query
// Tax query
$tax_query = [];
$term_ids_str = LP_Helper::sanitize_params_submitted( urldecode( $_REQUEST['term_id'] ?? '' ) );
if ( ! empty( $term_ids_str ) ) {
$term_ids = explode( ',', $term_ids_str );
$tax_query[] = array(
'taxonomy' => 'course_category',
'field' => 'term_id',
'terms' => $term_ids,
'operator' => 'IN',
);
}
$q->set( 'tax_query', $tax_query );
// End Tax query
// Author query
if ( isset( $_REQUEST['c_author'] ) ) {
$author_ids = LP_Helper::sanitize_params_submitted( $_REQUEST['c_author'] );
$q->set( 'author__in', $author_ids );
}
// End Author query
// Order query
if ( isset( $_REQUEST['order_by'] ) ) {
$order_by = LP_Helper::sanitize_params_submitted( $_REQUEST['order_by'] );
$order = 'DESC';
switch ( $order_by ) {
case 'post_title':
$order_by = 'title';
$order = 'ASC';
break;
default:
$order_by = 'date';
break;
}
$q->set( 'orderby', $order_by );
$q->set( 'order', $order );
}
$q = apply_filters( 'lp/page-courses/query/legacy', $q );
/*if ( isset( $_REQUEST['isPageLoad'] ) ) {
$filter_courses = new LP_Course_Filter();
$filter_courses->only_fields = [ 'ID' ];
$filter_courses->limit = 1000;
$filter_courses->max_limit = 1000;
$filter_courses->post_title = LP_Helper::sanitize_params_submitted( $_REQUEST['c_search'] ?? '' );
$fields_str = LP_Helper::sanitize_params_submitted( urldecode( $_REQUEST['c_fields'] ?? '' ) );
$fields_exclude_str = LP_Helper::sanitize_params_submitted( urldecode( $_REQUEST['c_exclude_fields'] ?? '' ) );
if ( ! empty( $fields_str ) ) {
$fields = explode( ',', $fields_str );
$filter_courses->fields = $fields;
}
if ( ! empty( $fields_exclude_str ) ) {
$fields_exclude = explode( ',', $fields_exclude_str );
$filter_courses->exclude_fields = $fields_exclude;
}
$filter_courses->post_author = LP_Helper::sanitize_params_submitted( $_REQUEST['c_author'] ?? 0 );
$author_ids_str = LP_Helper::sanitize_params_submitted( $_REQUEST['c_authors'] ?? 0 );
if ( ! empty( $author_ids_str ) ) {
$author_ids = explode( ',', $author_ids_str );
$filter_courses->post_authors = $author_ids;
}
$term_ids_str = LP_Helper::sanitize_params_submitted( urldecode( $_REQUEST['term_id'] ?? '' ) );
if ( ! empty( $term_ids_str ) ) {
$term_ids = explode( ',', $term_ids_str );
$filter_courses->term_ids = $term_ids;
}
$on_sale = absint( $_REQUEST['on_sale'] ?? '0' );
1 === $on_sale ? $filter_courses->sort_by[] = 'on_sale' : '';
$on_feature = absint( $_REQUEST['on_feature'] ?? '0' );
1 === $on_feature ? $filter_courses->sort_by[] = 'on_feature' : '';
$filter_courses->order_by = LP_Helper::sanitize_params_submitted( ! empty( $_REQUEST['order_by'] ) ? $_REQUEST['order_by'] : 'post_date' );
$filter_courses->order = LP_Helper::sanitize_params_submitted( ! empty( $_REQUEST['order'] ) ? $_REQUEST['order'] : 'DESC' );
$filter_courses = apply_filters( 'lp/api/courses/filter', $filter_courses, $_REQUEST );
$courses = LP_Course::get_courses( $filter_courses );
$course_ids = array( -1 ); // Set if empty $course_ids will return 'no courses found' message
if ( ! empty( $courses ) ) {
$course_ids = LP_Database::getInstance()->get_values_by_key( $courses );
}
$q->set( 'post__in', $course_ids );
}*/
}
}
return $q;
}
/**
* Handle 404 if user are viewing course item directly.
* Example: http://example.com/lesson/slug-lesson
* Apply for user not admin, instructor, co-instructor
*
* @param WP_Query $q
*
* @return mixed
* @editor tungnx
* @since 3.2.7.5
*/
public function set_link_item_course_default_wp_to_page_404( $q ) {
if ( ! $q->is_main_query() || is_admin() ) {
return $q;
}
$post_type_apply_404 = array( LP_LESSON_CPT, LP_QUIZ_CPT, LP_QUESTION_CPT, 'lp_assignment' );
if ( isset( $q->query_vars['post_type'] ) && in_array( $q->query_vars['post_type'], $post_type_apply_404 ) ) {
$flag_load_404 = true;
$user = wp_get_current_user();
$post_author = 0;
if ( $user ) {
$post = null;
if ( isset( $_GET['preview_id'] ) ) {
$post_id = absint( $_GET['preview_id'] );
$post = get_post( $post_id );
$post_author = $post->post_author;
} elseif ( isset( $_GET['preview'] ) && isset( $_GET['p'] ) ) {
$post_id = absint( $_GET['p'] );
$post = get_post( $post_id );
$post_author = $post->post_author;
} else {
$post_author = LP_Database::getInstance()->getPostAuthorByTypeAndSlug( $q->query_vars['post_type'], $q->query_vars[ $q->query_vars['post_type'] ] );
}
if ( $user->has_cap( 'administrator' ) ) {
$flag_load_404 = false;
} elseif ( $user->has_cap( LP_TEACHER_ROLE ) && $post_author == $user->ID ) {
$flag_load_404 = false;
}
}
$flag_load_404 = apply_filters( 'learnpress/page/set-link-item-course-404', $flag_load_404, $post_author, $user );
if ( $flag_load_404 ) {
learn_press_404_page();
$q->set( 'post_type', '' );
}
}
return $q;
}
public function the_content_callback( $content ) {
if ( $this->_archive_contents ) {
preg_match( '/\[learn_press_archive_course\s?(.*)\]/', $content, $results );
$this->_shortcode_exists = ! empty( $results );
if ( $this->_shortcode_exists ) {
$this->_shortcode_tag = $results[0];
$content = str_replace( $this->_shortcode_tag, $this->_archive_contents, $content );
} else {
$content .= $this->_archive_contents;
}
}
return $content;
}
/**
* Check is page Become a teacher
*
* @return bool|mixed|void
* @since 3.2.8
* @author tungnx
*/
public static function is_page_become_a_teacher() {
$page_id = learn_press_get_page_id( 'become_a_teacher' );
if ( $page_id && is_page( $page_id ) ) {
return true;
}
return apply_filters( 'learnpress/is-page/become-a-teacher', false );
}
/**
* Get page current on frontend
*
* @return string
* @since 3.2.8
* @author tungnx
*/
public static function page_current(): string {
if ( learn_press_is_checkout() ) {
return LP_PAGE_CHECKOUT;
} elseif ( LP_Global::course_item_quiz() ) {
return LP_PAGE_QUIZ;
} elseif ( learn_press_is_course() && is_single() && LP_Global::course_item() ) {
return LP_PAGE_SINGLE_COURSE_CURRICULUM;
} elseif ( learn_press_is_courses() ) {
return LP_PAGE_COURSES;
} elseif ( learn_press_is_course() ) {
return LP_PAGE_SINGLE_COURSE;
} elseif ( self::is_page_become_a_teacher() ) {
return LP_PAGE_BECOME_A_TEACHER;
} elseif ( learn_press_is_profile() ) {
return LP_PAGE_PROFILE;
} else {
return apply_filters( 'learnpress/page/current', '' );
}
}
public static function instance() {
if ( is_admin() ) {
return null;
}
if ( ! self::$_instance ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* Add user profile link into admin bar
*
* @editor tungnx
* @version 1.0.1
* @since 3.0.0
*/
public function learn_press_edit_admin_bar() {
global $wp_admin_bar;
$current_user = wp_get_current_user();
if ( ! in_array( LP_TEACHER_ROLE, $current_user->roles ) && ! in_array( 'administrator', $current_user->roles ) ) {
return;
}
$page_profile_id = learn_press_get_page_id( 'profile' );
if ( $page_profile_id && get_post_status( $page_profile_id ) != 'trash' ) {
$user_id = $current_user->ID;
$wp_admin_bar->add_menu(
array(
'id' => 'course_profile',
'parent' => 'user-actions',
'title' => get_the_title( $page_profile_id ),
'href' => learn_press_user_profile_link( $user_id, false ),
)
);
}
}
}
return LP_Page_Controller::instance();