LLMS_Blocks_Post_Instructors
Handle course & membership instructors data.
Contents
Source Source
File: libraries/lifterlms-blocks/includes/class-llms-blocks-post-instructors.php
class LLMS_Blocks_Post_Instructors {
/**
* Supported Post Types.
*
* @var array
*/
protected $post_types = array( 'course', 'llms_membership' );
/**
* Constructor.
*
* @since 1.0.0
*
* @return void
*/
public function __construct() {
add_action( 'init', array( $this, 'register_meta' ) );
add_action( 'save_post_course', array( $this, 'maybe_set_default_instructor' ), 50, 3 );
add_action( 'save_post_llms_membership', array( $this, 'maybe_set_default_instructor' ), 50, 3 );
}
/**
* Meta field update authorization callback.
*
* @since 1.0.0
*
* @param bool $allowed Is the update allowed.
* @param string $meta_key Meta keyname.
* @param int $object_id WP Object ID (post,comment,etc)...
* @param int $user_id WP User ID.
* @param string $cap requested capability.
* @param array $caps user capabilities.
* @return bool
*/
public function authorize_callback( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ) {
return user_can( $user_id, 'edit_post', $object_id );
}
/**
* Retrieve instructor information for a give object.
*
* @since 1.0.0
*
* @param array $obj Assoc. array of WP_Post data.
* @param WP_REST_Request $request Full details about the request.
* @return WP_Error|object Object containing the meta values by name, otherwise WP_Error object.
*/
public function get_callback( $obj, $request ) {
$ret = array();
$obj = llms_get_post( $obj['id'] );
if ( $obj ) {
$ret = $obj->instructors()->get_instructors( false );
foreach ( $ret as &$instructor ) {
$name = '';
$student = llms_get_student( $instructor['id'] );
if ( $student ) {
$name = $student->get_name();
}
$instructor['name'] = $name;
}
}
return $ret;
}
/**
* Automatically sets instructor data when a new course/membership is created.
*
* @since 1.6.0
*
* @link https://developer.wordpress.org/reference/hooks/save_post_post-post_type/
*
* @param int $post_id WP_Post ID.
* @param WP_Post $post Post object.
* @param bool $update Whether the save is an update (`true`) or a creation (`false`).
* @return bool
*/
public function maybe_set_default_instructor( $post_id, $post, $update ) {
if ( $update || ! $post->post_author ) {
return false;
}
$obj = llms_get_post( $post );
if ( ! $obj || ! is_a( $obj, 'LLMS_Post_Model' ) || ! in_array( $obj->get( 'type' ), $this->post_types, true ) ) {
return false;
}
remove_action( 'save_post_course', array( $this, 'maybe_set_instructors' ), 50, 3 );
$obj->instructors()->set_instructors( array( array( 'id' => $post->post_author ) ) );
return true;
}
/**
* Update instructor information for a given object.
*
* @since 1.0.0
* @since 1.7.1 Decode JSON prior to saving.
* @since 2.4.0 Fix access to non-existing variable when current user canno edit the course/membership.
*
* @param string $value Instructor data to add to the object (JSON).
* @param WP_Post $object WP_Post object.
* @param string $key Name of the field.
* @return null|WP_Error
*/
public function update_callback( $value, $object, $key ) {
if ( ! current_user_can( 'edit_post', $object->ID ) ) {
return new WP_Error(
'rest_cannot_update',
__( 'Sorry, you are not allowed to edit the object instructors.', 'lifterlms' ),
array(
'key' => $key,
'status' => rest_authorization_required_code(),
)
);
}
$value = json_decode( $value, true );
$obj = llms_get_post( $object );
if ( $obj ) {
$obj->instructors()->set_instructors( $value );
}
return null;
}
/**
* Register custom meta fields.
*
* @since 1.0.0
* @since 1.6.0 Use `$this->post_types` for loop.
* @since 1.7.1 Don't define a schema.
*
* @return void
*/
public function register_meta() {
foreach ( $this->post_types as $post_type ) {
register_rest_field(
$post_type,
'instructors',
array(
'get_callback' => array( $this, 'get_callback' ),
'update_callback' => array( $this, 'update_callback' ),
'schema' => null,
)
);
}
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor.
- authorize_callback — Meta field update authorization callback.
- get_callback — Retrieve instructor information for a give object.
- maybe_set_default_instructor — Automatically sets instructor data when a new course/membership is created.
- register_meta — Register custom meta fields.
- update_callback — Update instructor information for a given object.
Changelog Changelog
| Version | Description |
|---|---|
| 1.7.1 | Fix Core 5.3 compatibility issues with the instructors rest field. |
| 1.6.0 | Automatically store course/membership instructor with post_author data when the post is created. |
| 1.0.0 | Introduced. |