Main
Manage LifterLMS add-on plugins and themes.
Contents
Source Source
File: libraries/lifterlms-cli/src/Commands/AddOn/Main.php
class Main extends AbstractCommand {
// Include subcommands.
use Activate,
ChannelSet,
Deactivate,
Enumerate,
Get,
Install,
Uninstall,
Update;
/**
* Accepts an add-on array and converts it to the format used by the output method
*
* @since 0.0.1
*
* @param array|LLMS_Add_On $item_or_addon Add-on object or add-on item array array from `llms_get_add_ons()`.
* @return array Associative array containing all possible fields as used by the output method.
*/
private function format_item( $item_or_addon ) {
$addon = is_array( $item_or_addon ) ? llms_get_add_on( $item_or_addon ) : $item_or_addon;
$formatted = array(
'name' => $addon->get( 'slug' ),
'description' => $addon->get( 'description' ),
'status' => $addon->get_status(),
'license' => str_replace( 'license_', '', $addon->get_license_status() ),
'update' => $addon->has_available_update() ? 'available' : 'none',
'version' => $addon->is_installed() ? $addon->get_installed_version() : 'N/A',
'update_version' => $addon->get( 'version' ),
'title' => $addon->get( 'title' ),
'channel' => $addon->get_channel_subscription(),
'type' => $addon->get( 'type' ),
'file' => $addon->get( 'update_file' ),
'permalink' => $addon->get( 'permalink' ),
'changelog' => $addon->get( 'changelog' ),
'documentation' => $addon->get( 'documentation' ),
);
return $formatted;
}
/**
* Retrieve an array of available add-on slugs based on the supplied query criteria.
*
* This function passes data to `wp llms addon list` with specific filters and returns an associative
* array of add-on slugs from that list.
*
* This is used, mostly, to generate a list of available addons for various commands which provide an `--all` flag/option.
*
* @since 0.0.1
*
* @param string $status Add-on status, passed as the `--status` option to `llms addon list`.
* @param bool $check_license Whether or not the add-on should be licensed. This is used to determine what is installable / upgradeable.
* @param string $type Add-on type. Accepts 'all' (default), 'plugin' or 'theme'.
* @return string[] Array of add-on slugs meeting the specified filters.
*/
private function get_available_addons( $status, $check_license, $type = 'all' ) {
$list = \WP_CLI::runcommand(
"llms addon list --format=json --status={$status} --fields=name,license,type",
array(
'return' => true,
)
);
$list = array_filter(
json_decode( $list, true ),
function( $item ) use ( $check_license, $type ) {
return ( ( $check_license && 'active' === $item['license'] ) || ! $check_license ) && ( 'all' === $type || $type === $item['type'] );
}
);
return wp_list_pluck( $list, 'name' );
}
/**
* Retrieves an optionally filtered list of add-ons for use in the `list` command.
*
* @since 0.0.1
*
* @param array $assoc_args Associative array of command options.
* @param string $filter_field The optional name of the field to filter results by.
* @return array[] Array of add-on items.
*/
private function get_filtered_items( $assoc_args, $filter_field = '' ) {
$addons = llms_get_add_ons();
$list = array_filter(
$addons['items'],
function( $item ) {
return // Skip anything without a slug.
! empty( $item['slug'] ) &&
// Skip the LifterLMS core.
'lifterlms' !== $item['slug'] &&
// Skip third party add-ons.
! in_array( 'third-party', array_keys( $item['categories'] ), true );
}
);
// Format remaining items.
$list = array_map( array( $this, 'format_item' ), $list );
// Filter by field value.
if ( $filter_field ) {
$field_val = $assoc_args[ $filter_field ];
$list = array_filter(
$list,
function( $item ) use ( $filter_field, $field_val ) {
return $item[ $filter_field ] === $field_val;
}
);
}
// Alpha sort the list by slug.
usort(
$list,
function( $a, $b ) {
return strcmp( $a['name'], $b['name'] );
}
);
return $list;
}
/**
* Reusable loop function for handling commands which accept one or more slugs as the commands first argument
*
* @since 0.0.1
*
* @param string[] $slugs Array of add-on slugs, with or without the `lifterlms-` prefix.
* @param array $assoc_args Associative array of command options from the original command.
* @param string $callback Name of the method to use for handling a single add-on for the given command.
* The callback should accept three arguments:
* + @type string $slug Add-on slug for the current item.
* + @type LLMS_Add_On $addon Add-on object for the current item.
* + @type array $assoc_args Array of arguments from the initial command.
* The callback should return a truthy to signal success and
* a falsy to signal an error.
* @return array {
* Associative arrays containing details on the errors and successes encountered during the loop.
*
* @type int $errors Number of errors encountered in the loop.
* @type int $successes Number of success encountered in the loop.
* }
*/
private function loop( $slugs, $assoc_args, $callback ) {
$successes = 0;
$errors = 0;
foreach ( $slugs as $slug ) {
if ( empty( $slug ) ) {
\WP_CLI::warning( 'Ignoring ambiguous empty slug value.' );
continue;
}
$addon = $this->get_addon( $slug, true, 'warning' );
if ( empty( $addon ) ) {
$errors++;
continue;
}
if ( ! $this->$callback( $slug, $addon, $assoc_args ) ) {
$errors++;
continue;
}
$successes++;
}
return compact( 'errors', 'successes' );
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- format_item — Accepts an add-on array and converts it to the format used by the output method
- get_available_addons — Retrieve an array of available add-on slugs based on the supplied query criteria.
- get_filtered_items — Retrieves an optionally filtered list of add-ons for use in the `list` command.
- loop — Reusable loop function for handling commands which accept one or more slugs as the commands first argument
Changelog Changelog
| Version | Description |
|---|---|
| 0.0.1 | Introduced. |