LLMS_Abstract_User_Engagement
Base model class for awarded engagements (certificates and achievements).
Source Source
File: includes/abstracts/llms-abstract-user-engagement.php
abstract class LLMS_Abstract_User_Engagement extends LLMS_Post_Model {
use LLMS_Trait_User_Engagement_Type;
/**
* Constructor.
*
* @since 6.0.0
*
* @param string|int|LLMS_Post_Model|WP_Post $model 'new', WP post id, instance of an extending class, instance of WP_Post.
* @param array $args Args to create the post, only applies when $model is 'new'.
* @return void
*/
public function __construct( $model, $args = array() ) {
$this->engagement_type = $this->model_post_type;
parent::__construct( $model, $args );
}
/**
* Called immediately after creating / inserting a new post into the database
*
* @since 6.0.0
*
* @return void
*/
protected function after_create() {
$this->sync( 'create' );
}
/**
* Delete the engagement
*
* @since 3.18.0
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @return void
*/
public function delete() {
/**
* Action fired immediately prior to the deletion of a user's awarded engagement.
*
* The dynamic portion of the hook name, `$this->model_post_type`,
* refers to the engagement type, either "achievement" or "certificate".
*
* @since 3.18.0
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @param LLMS_Abstract_User_Engagement $User_Engagement Achievement or certificate class object.
*/
do_action( "llms_before_delete_{$this->model_post_type}", $this );
global $wpdb;
$id = $this->get( 'id' );
$wpdb->delete( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
"{$wpdb->prefix}lifterlms_user_postmeta",
array(
'user_id' => $this->get_user_id(),
'meta_key' => $this->get_user_post_meta_key(), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
'meta_value' => $id, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
),
array( '%d', '%s', '%d' )
);
wp_delete_post( $id, true );
/**
* Action fired immediately after the deletion of a user's awarded engagement.
*
* The dynamic portion of the hook name, `$this->model_post_type`,
* refers to the engagement type, either "achievement" or "certificate".
*
* @since 3.18.0
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @param LLMS_Abstract_User_Engagement $User_Engagement Achievement or certificate class object.
*/
do_action( "llms_delete_{$this->model_post_type}", $this );
}
/**
* Retrieve the date the achievement was earned (created)
*
* @since 3.14.0
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @param string $format Date format string.
* @return string
*/
public function get_earned_date( $format = null ) {
$format = $format ? $format : get_option( 'date_format' );
return $this->get_date( 'date', $format );
}
/**
* Get the WP Post ID of the post which triggered the earning of the certificate
*
* This would be a lesson, course, section, track, etc...
*
* @since 3.8.0
* @since 4.5.0 Force return to an integer.
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @return int
*/
public function get_related_post_id() {
$meta = $this->get_user_postmeta();
return isset( $meta->post_id ) ? absint( $meta->post_id ) : $this->get( 'related' );
}
/**
* Retrieve the user ID of the user who earned the certificate
*
* @since 3.8.0
* @since 3.9.0 Unknown.
* @since 4.5.0 Force return to an integer.
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @return int
*/
public function get_user_id() {
$meta = $this->get_user_postmeta();
return isset( $meta->user_id ) ? absint( $meta->user_id ) : $this->get( 'author' );
}
/**
* Retrieve user postmeta data for the achievement or certificate.
*
* @since 3.8.0
* @since 6.0.0 Migrated from LLMS_User_Certificate and LLMS_User_Achievement.
*
* @return stdClass
*/
public function get_user_postmeta() {
global $wpdb;
return $wpdb->get_row( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$wpdb->prepare(
"SELECT user_id, post_id FROM {$wpdb->prefix}lifterlms_user_postmeta WHERE meta_value = %d AND meta_key = %s",
$this->get( 'id' ),
$this->get_user_post_meta_key()
)
);
}
/**
* Retrieve the user postmeta key recorded when the engagement is earned.
*
* @since 6.0.0
*
* @return string
*/
protected function get_user_post_meta_key() {
return sprintf( '_%s_earned', $this->model_post_type );
}
/**
* Determines if the achievement or certificate has been awarded.
*
* @since 6.0.0
*
* @return boolean
*/
public function is_awarded() {
if ( 'publish' !== $this->get( 'status' ) ) {
return false;
}
return (bool) $this->get( 'awarded' );
}
/**
* Allow child classes to merge the post content based on content from the template.
*
* @since 6.0.0
* @since 6.4.0 Added optional `$content` and `$load_reusable_blocks` parameters.
*
* @param string $content Optionally use the given content instead of `$this->content`.
* @param bool $load_reusable_blocks Optionally replace reusable blocks with their actual blocks.
* @return string
*/
public function merge_content( $content = null, $load_reusable_blocks = false ) {
if ( is_null( $content ) ) {
$content = $this->get( 'content', true );
}
if ( $load_reusable_blocks ) {
$blocks = parse_blocks( $content );
$blocks = LLMS_Forms::instance()->load_reusable_blocks( $blocks );
$content = serialize_blocks( $blocks );
}
return $content;
}
/**
* Update the awarded engagement by regenerating it from its template.
*
* @since 6.0.0
* @since 6.4.0 Added replacement of references to reusable blocks with their actual blocks.
*
* @param string $context Sync context. Either "update" for an update to an existing awarded engagement
* or "create" when the awarded engagement is being created.
* @return boolean Returns false if the parent doesn't exist, otherwise returns true.
*/
public function sync( $context = 'update' ) {
$template_id = $this->get( 'parent' );
$template = $this->get_user_engagement( $template_id, false );
if ( ! $template ) {
return false;
}
$this->set( 'title', get_post_meta( $template_id, "_llms_{$this->model_post_type}_title", true ) );
if ( get_post_thumbnail_id( $template_id ) !== get_post_thumbnail_id( $this->get( 'post' ) ) &&
! set_post_thumbnail( $this->get( 'post' ), get_post_thumbnail_id( $template_id ) )
) {
delete_post_thumbnail( $this->get( 'post' ) );
}
// Copy the content with optional merge codes, shortcodes, and optional block editor layout meta properties
// from the template to this awarded engagement.
$content = $template->get( 'content', true );
$this->set( 'content', $this->merge_content( $content, true ) );
$this->sync_meta( $template );
/**
* Action run after an awarded engagement is synchronized with its template.
*
* The dynamic portion of the hook name, `$this->model_post_type`,
* refers to the engagement type, either "achievement" or "certificate".
*
* @since 6.0.0
*
* @param LLMS_Abstract_User_Engagement $engagement Awarded engagement object.
* @param LLMS_Abstract_User_Engagement $template Engagement template object.
* @param string $context The context within which the synchronization is run.
* Either "create" or "update".
*/
do_action( "llms_{$this->model_post_type}_synchronized", $this, $template, $context );
return true;
}
/**
* This is a stub that allows extending classes to sync additional data from the template during a sync operation.
*
* @since 6.0.0
*
* @param LLMS_Abstract_User_Engagement $template
* @return void
*/
protected function sync_meta( $template ) {
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor.
- after_create — Called immediately after creating / inserting a new post into the database
- delete — Delete the engagement
- get_earned_date — Retrieve the date the achievement was earned (created)
- get_related_post_id — Get the WP Post ID of the post which triggered the earning of the certificate
- get_user_id — Retrieve the user ID of the user who earned the certificate
- get_user_post_meta_key — Retrieve the user postmeta key recorded when the engagement is earned.
- get_user_postmeta — Retrieve user postmeta data for the achievement or certificate.
- is_awarded — Determines if the achievement or certificate has been awarded.
- merge_content — Allow child classes to merge the post content based on content from the template.
- sync — Update the awarded engagement by regenerating it from its template.
- sync_meta — This is a stub that allows extending classes to sync additional data from the template during a sync operation.
Changelog Changelog
| Version | Description |
|---|---|
| 6.0.0 | Introduced. |