LLMS_Blocks_Reusable
Manage customizations to reusable blocks
Contents
Source Source
File: libraries/lifterlms-blocks/includes/class-llms-blocks-reusable.php
class LLMS_Blocks_Reusable {
/**
* Constructor
*
* @since 2.0.0
*
* @return void
*/
public function __construct() {
add_action( 'rest_api_init', array( $this, 'rest_register_fields' ) );
add_filter( 'rest_wp_block_query', array( $this, 'mod_wp_block_query' ), 20, 2 );
}
/**
* Read rest field read callback
*
* @since 2.0.0
*
* @param array $obj Associative array representing the `wp_block` post.
* @param WP_REST_Request $request Request object.
* @return WP_Error|array Error when current user isn't authorized to read the data or the post association array on success.
*/
public function rest_callback_get( $obj, $request ) {
return llms_parse_bool( get_post_meta( $obj['id'], '_is_llms_field', true ) ) ? 'yes' : 'no';
}
/**
* Rest field update callback
*
* @since 2.0.0
*
* @param array $value Post association array.
* @param WP_Post $obj Post object for the `wp_block` post.
* @param string $key Field key.
* @return WP_Error|boolean Returns an error object when current user lacks permission to update the form or `true` on success.
*/
public function rest_callback_update( $value, $obj, $key ) {
$value = llms_parse_bool( $value ) ? 'yes' : 'no';
return update_post_meta( $obj->ID, '_is_llms_field', $value ) ? true : false;
}
/**
* Register custom rest fields
*
* @since 2.0.0
*
* @return void
*/
public function rest_register_fields() {
register_rest_field(
'wp_block',
'is_llms_field',
array(
'get_callback' => array( $this, 'rest_callback_get' ),
'update_callback' => array( $this, 'rest_callback_update' ),
)
);
}
/**
* Modify the rest request query used to list reusable blocks within the block editor
*
* Ensures that reusable blocks containing LifterLMS Form Fields can only be inserted/viewed
* in the context that we allow them to be used within.
*
* + When viewing a `wp_block` post, all reusable blocks should be displayed.
* + When viewing an `llms_form` post, only blocks that specify `is_llms_field` as 'yes' can be displayed.
* + When viewing any other post, any post with `is_llms_field` of 'yes' is excluded.
*
* @since 2.0.0
*
* @see [Reference]
* @link [URL]
*
* @param arrays $args WP_Query arguments.
* @param WP_REST_Request $request Request object.
* @return array
*/
public function mod_wp_block_query( $args, $request ) {
$referer = $request->get_header( 'referer' );
$screen = empty( $referer ) ? false : $this->get_screen_from_referer( $referer );
// We don't care about the screen or it's a reusable block screen.
if ( empty( $screen ) || 'wp_block' === $screen ) {
return $args;
}
// Add a meta query if it doesn't already exist.
if ( empty( $args['meta_query'] ) ) {
$args['meta_query'] = array(
'relation' => 'AND',
);
}
// Forms should show only blocks with forms and everything else should exclude blocks with forms.
$include_fields = 'llms_form' === $screen;
$args['meta_query'][] = $this->get_meta_query( $include_fields );
return $args;
}
/**
* Retrieve a meta query array depending on the post type of the referring rest request
*
* @since 2.0.0
*
* @param boolean $include_fields Whether or not to include form fields.
* @return array
*/
private function get_meta_query( $include_fields ) {
// Default query when including fields.
$meta_query = array(
'key' => '_is_llms_field',
'value' => 'yes',
);
// Excluding fields.
if ( ! $include_fields ) {
$meta_query = array(
'relation' => 'OR',
wp_parse_args(
array(
'compare' => '!=',
),
$meta_query
),
array(
'key' => '_is_llms_field',
'compare' => 'NOT EXISTS',
),
);
}
return $meta_query;
}
/**
* Determine the screen where a reusable blocks rest query originated
*
* The screen name will either be "widgets" or the WP_Post name of a registered WP_Post type.
*
* For any other screen we return `false` because we don't care about it.
*
* @since 2.0.0
* @since 2.3.1 Don't pass `null` to `basename()`.
*
* @param string $referer Referring URL for the REST request.
* @return string|boolean Returns the screen name or `false` if we don't care about the screen.
*/
private function get_screen_from_referer( $referer ) {
// Blockified widgets screen.
$url_path = wp_parse_url( $referer, PHP_URL_PATH );
if ( $url_path && 'widgets.php' === basename( $url_path ) ) {
return 'widgets';
}
$query_args = array();
wp_parse_str( wp_parse_url( $referer, PHP_URL_QUERY ), $query_args );
// Something else.
if ( empty( $query_args['post'] ) ) {
return false;
}
// Block editor for a WP_Post.
return get_post_type( $query_args['post'] );
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- get_meta_query — Retrieve a meta query array depending on the post type of the referring rest request
- get_screen_from_referer — Determine the screen where a reusable blocks rest query originated
- mod_wp_block_query — Modify the rest request query used to list reusable blocks within the block editor
- rest_callback_get — Read rest field read callback
- rest_callback_update — Rest field update callback
- rest_register_fields — Register custom rest fields
Changelog Changelog
| Version | Description |
|---|---|
| 2.0.0 | Introduced. |