<?php
/**
* LearnDash `[ld_infobar]` shortcode processing.
*
* @since 4.0.0
* @package LearnDash\Shortcodes
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use LearnDash\Core\Models\Product;
use LearnDash\Core\Utilities\Cast;
/**
* Builds the `[ld_infobar]` shortcode output.
*
* @global boolean $learndash_shortcode_used
*
* @since 4.0.0
*
* @param array $atts {
* An array of shortcode attributes.
*
* @type int $post_id ID of the content being displayed.
* @type int $course_id ID of the course when $post_id is a step such as a lesson/topic/quiz
* @type int $user_id ID of the user
*
* @param string $content The shortcode content. Default empty.
* @param string $shortcode_slug The shortcode slug. Default 'ld_infobar'.
*/
function learndash_infobar_shortcode( $atts = array(), $content = '', $shortcode_slug = 'ld_infobar' ) {
if ( learndash_is_active_theme( 'legacy' ) ) {
return $content;
}
global $learndash_shortcode_used;
static $shown_content = array();
if ( ! is_array( $atts ) ) {
$atts = array();
}
$viewed_post_id = (int) get_the_ID();
$atts_defaults = array(
'course_id' => '',
'post_id' => '',
'group_id' => '',
'user_id' => '',
);
$atts = shortcode_atts( $atts_defaults, $atts );
/** This filter is documented in includes/shortcodes/ld_course_resume.php */
$atts = apply_filters( 'learndash_shortcode_atts', $atts, $shortcode_slug );
if ( ! empty( $atts['user_id'] ) ) {
$atts['user_id'] = absint( $atts['user_id'] );
} else {
$atts['user_id'] = get_current_user_id();
}
if ( ! empty( $atts['course_id'] ) ) {
if ( learndash_get_post_type_slug( 'course' ) !== get_post_type( $atts['course_id'] ) ) {
$atts['course_id'] = 0;
}
}
if ( ! empty( $atts['post_id'] ) ) {
if ( ! in_array( get_post_type( $atts['post_id'] ), learndash_get_post_types( 'course' ), true ) ) {
$atts['post_id'] = 0;
}
}
if ( ! empty( $atts['group_id'] ) ) {
if ( learndash_get_post_type_slug( 'group' ) !== get_post_type( $atts['group_id'] ) ) {
$atts['group_id'] = 0;
}
}
// If the 'post_id' is set to '0' it will trigger showing the course lessons listing.
if ( '0' === $atts['post_id'] ) {
if ( ! empty( $atts['course_id'] ) ) {
$atts['post_id'] = $atts['course_id'];
}
} else {
if ( empty( $atts['post_id'] ) ) {
if ( ! empty( $viewed_post_id ) ) {
if ( in_array( get_post_type( $viewed_post_id ), learndash_get_post_types( 'course' ), true ) ) {
$atts['post_id'] = $viewed_post_id;
if ( empty( $atts['course_id'] ) ) {
$atts['course_id'] = learndash_get_course_id( $atts['post_id'] );
}
} elseif ( get_post_type( $viewed_post_id ) === learndash_get_post_type_slug( 'group' ) ) {
$atts['group_id'] = $viewed_post_id;
$atts['post_id'] = 0;
$atts['course_id'] = 0;
} else {
if ( ! empty( $atts['course_id'] ) ) {
$atts['post_id'] = $atts['course_id'];
} elseif ( ! empty( $atts['group_id'] ) ) {
$atts['post_id'] = $atts['group_id'];
}
}
}
}
}
$atts['group_id'] = Cast::to_int( $atts['group_id'] );
$atts['post_id'] = Cast::to_int( $atts['post_id'] );
$atts['course_id'] = Cast::to_int( $atts['course_id'] );
$atts['user_id'] = Cast::to_int( $atts['user_id'] );
// Override the user ID if the current user can't access the passed user ID's data.
$atts['user_id'] = learndash_shortcode_protect_user( $atts['user_id'] );
// Check post access.
if (
! learndash_shortcode_can_current_user_access_post( $atts['course_id'] )
|| ! learndash_shortcode_can_current_user_access_post( $atts['group_id'] )
|| ! learndash_shortcode_can_current_user_access_post( $atts['post_id'] )
) {
return '';
}
if ( ! empty( $atts['group_id'] ) ) {
$shown_content_key = $atts['group_id'] . '_' . $atts['user_id'];
} elseif ( ! empty( $atts['course_id'] ) ) {
$shown_content_key = $atts['course_id'] . '_' . $atts['post_id'] . '_' . $atts['user_id'];
}
if ( ( ! isset( $shown_content_key ) ) || ( empty( $shown_content_key ) ) ) {
return $content;
}
$shown_content[ $shown_content_key ] = '';
if ( ( ! empty( $atts['course_id'] ) ) && ( ! empty( $atts['post_id'] ) ) ) {
if ( $atts['course_id'] === $atts['post_id'] ) {
$course_status = learndash_course_status( $atts['course_id'], $atts['user_id'] );
$post_post = get_post( $atts['course_id'] );
} elseif ( ! empty( $atts['course_id'] ) && ! empty( $atts['post_id'] ) ) {
$course_status = learndash_is_item_complete( $atts['post_id'], $atts['user_id'], $atts['course_id'] );
if ( $course_status ) {
$course_status = 'complete';
} else {
$course_status = 'incomplete';
}
$post_post = get_post( $atts['post_id'] );
}
$context = learndash_get_post_type_key( $post_post->post_type );
$has_access = sfwd_lms_has_access( $atts['course_id'], $atts['user_id'] );
$shortcode_output = SFWD_LMS::get_template(
'modules/infobar.php',
array(
'context' => $context,
'course_id' => $atts['course_id'],
'user_id' => $atts['user_id'],
'has_access' => $has_access,
'course_status' => $course_status,
'post' => $post_post,
)
);
if ( ! empty( $shortcode_output ) ) {
$shown_content[ $shown_content_key ] .= $shortcode_output;
}
} elseif ( ! empty( $atts['group_id'] ) ) {
$post_post = get_post( $atts['group_id'] );
if ( $post_post instanceof WP_Post ) {
try {
$product = Product::create_from_post( $post_post );
$has_access = $product->user_has_access( $atts['user_id'] );
} catch ( InvalidArgumentException $e ) {
$has_access = false;
}
} else {
$has_access = false;
}
$group_status = learndash_get_user_group_status( $atts['group_id'], $atts['user_id'] );
$shortcode_output = SFWD_LMS::get_template(
'modules/infobar_group.php',
array(
'context' => 'group',
'group_id' => $atts['group_id'],
'user_id' => $atts['user_id'],
'has_access' => $has_access,
'group_status' => $group_status,
'post' => $post_post,
)
);
if ( ! empty( $shortcode_output ) ) {
$shown_content[ $shown_content_key ] .= $shortcode_output;
}
}
if ( ( isset( $shown_content[ $shown_content_key ] ) ) && ( ! empty( $shown_content[ $shown_content_key ] ) ) ) {
$content .= '<div class="learndash-wrapper learndash-wrap learndash-shortcode-wrap learndash-shortcode-wrap-' . $shortcode_slug . '-' . $shown_content_key . '">' . $shown_content[ $shown_content_key ] . '</div>';
$learndash_shortcode_used = true;
}
return $content;
}
add_shortcode( 'ld_infobar', 'learndash_infobar_shortcode', 10, 3 );