LLMS_Abstract_Email_Provider
Source Source
File: includes/abstracts/llms-abstract-email-provider.php
abstract class LLMS_Abstract_Email_Provider {
/**
* Connector's ID.
*
* @var string
*/
protected $id = '';
/**
* Array of supported providers.
*
* @var array
*/
protected $providers = array(
'mailhawk',
'sendwp',
);
/**
* Configures the response returned when `do_remote_install()` is successful.
*
* @since 3.40.0
*
* @return array
*/
abstract protected function do_remote_install_success();
/**
* Retrieve the settings area HTML for the connect button
*
* @since 3.40.0
*
* @return string
*/
abstract protected function get_connect_setting();
/**
* Retrieve description text to be used in the settings area.
*
* @since 3.40.0
*
* @return string
*/
abstract protected function get_description();
/**
* Retrieve the connector's name / title.
*
* @since 3.40.0
*
* @return string
*/
abstract protected function get_title();
/**
* Determines if connector plugin is connected for sending.
*
* @since 3.40.0
*
* @return boolean
*/
abstract protected function is_connected();
/**
* Determines if connector plugin is installed
*
* @since 3.40.0
*
* @return boolean
*/
abstract protected function is_installed();
/**
* Constructor.
*
* @since 3.40.0
*
* @return void
*/
public function __construct() {
/**
* Filter the available email providers
*
* @since 3.40.0
*
* @param string[] $this->providers List of email provider ids.
*/
$this->providers = apply_filters( 'llms_email_delivery_providers', $this->providers );
/**
* Dynamically adjust the priority.
*
* A "connected" provider will always load first, ensuring
* that it can disable the other providers.
*
* When no providers are connected, they'll all load at 10
* and display in alphabetical order as a result of the order
* the files are included.
*/
$priority = $this->is_connected() ? 5 : 10;
add_action( 'admin_init', array( $this, 'init' ), $priority );
}
/**
* Initialize the Connector
*
* @since 3.40.0
*
* @return void
*/
public function init() {
// Disable other email delivery services if the current connector is already connected.
if ( $this->is_connected() ) {
$this->disable_other_providers();
}
/**
* Disable the Connector class and settings
*
* The dynamic portion of this filter, `{$this->id}`, refers
* to the id of the email provider. See `$this->providers` for a list of supported providers.
*
* @since 3.40.0
*
* @param bool $disabled Whether or not this class is disabled.
*/
if ( apply_filters( "llms_disable_{$this->id}", false ) ) {
return;
}
add_filter( 'llms_email_delivery_services', array( $this, 'add_settings' ) );
add_action( 'wp_ajax_llms_' . $this->id . '_remote_install', array( $this, 'ajax_callback_remote_install' ) );
add_action( 'admin_print_footer_scripts', array( $this, 'output_js' ) );
}
/**
* Determines if the plugin is already installed and activates it if it is
*
* @since 3.40.0
*
* @return boolean|WP_Error `true` when plugin is installed and successfully activated.
* `WP_Error` when plugin is installed and there was an error activating it.
* `false` when plugin is not installed.
*/
protected function activate_already_installed_plugin() {
$is_plugin_installed = false;
foreach ( get_plugins() as $path => $details ) {
if ( false === strpos( $path, '/' . $this->id . '.php' ) ) {
continue;
}
$is_plugin_installed = true;
$activate = activate_plugin( $path );
if ( is_wp_error( $activate ) ) {
return $activate;
}
break;
}
return $is_plugin_installed;
}
/**
* Add Settings.
*
* @since 3.40.0
*
* @param array $settings Existing settings.
* @return array
*/
public function add_settings( $settings ) {
// Short circuit if missing authorization.
if ( ! current_user_can( 'install_plugins' ) ) {
return $settings;
}
$new_settings = array(
array(
'id' => $this->id . '_title',
'type' => 'subtitle',
'title' => $this->get_title(),
'desc' => $this->is_connected() ? '' : $this->get_description(),
),
array(
'id' => $this->id . '_connect',
'type' => 'custom-html',
'value' => $this->get_connect_setting(),
),
);
return array_merge( $settings, $new_settings );
}
/**
* Ajax callback for installing the connector's plugin.
*
* @since 3.40.0
*
* @return void
*/
public function ajax_callback_remote_install() {
$ret = $this->do_remote_install();
ob_clean();
wp_send_json( $ret, ! empty( $ret['status'] ) ? $ret['status'] : 200 );
}
/**
* Determines if the current user can perform the remote installation.
*
* @since 3.40.0
*
* @return true|array
*/
protected function can_remote_install() {
if ( ! llms_verify_nonce( '_llms_' . $this->id . '_nonce', 'llms-' . $this->id . '-install' ) ) {
return array(
'code' => 'llms_' . $this->id . '_install_nonce_failure',
'message' => esc_html__( 'Security check failed.', 'lifterlms' ),
'status' => 401,
);
} elseif ( ! current_user_can( 'install_plugins' ) ) {
return array(
'code' => 'llms_' . $this->id . '_install_unauthorized',
'message' => esc_html__( 'You do not have permission to perform this action.', 'lifterlms' ),
'status' => 403,
);
}
return true;
}
/**
* Automatically disables other providers when the current provider is connected.
*
* @since 3.40.0
*
* @return void.
*/
protected function disable_other_providers() {
$disable = array_diff( $this->providers, array( $this->id ) );
foreach ( $disable as $id ) {
add_filter( 'llms_disable_' . $id, '__return_true' );
}
}
/**
* Validate installation request and perform the plugin install or return errors.
*
* @since 3.40.0
*
* @return array
*/
protected function do_remote_install() {
$can_install = $this->can_remote_install();
if ( true !== $can_install ) {
return $can_install;
}
$install = $this->install();
if ( is_wp_error( $install ) ) {
return array(
'code' => $install->get_error_code(),
'message' => $install->get_error_message(),
'status' => 400,
);
}
return $this->do_remote_install_success();
}
/**
* Install the plugin via the WP plugin installer.
*
* @since 3.40.0
*
* @return boolean|WP_Error Error object or `true` when successful.
*/
protected function install() {
// Check if the plugin already exists and activate it if it is.
$ret = $this->activate_already_installed_plugin();
// Plugin doesn't exist, install it.
if ( false === $ret ) {
$ret = $this->install_plugin();
}
// Final check to ensure the connector is installed and activated.
if ( true === $ret && ! $this->is_installed() ) {
// Translators: %s = title of the email delivery plugin.
return new WP_Error( 'llms_' . $this->id . '_not_found', sprtinf( __( '%s plugin not found. Please try again.', 'lifterlms' ), $this->get_title() ), $install );
}
return $ret;
}
/**
* Install the plugin via the WP Plugin Repo.
*
* @since 3.40.0
*
* @return boolean|WP_Error `true` on success, error object otherwise.
*/
protected function install_plugin() {
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
include_once ABSPATH . 'wp-admin/includes/file.php';
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
// Use the WordPress Plugins API to get the plugin download link.
$api = plugins_api(
'plugin_information',
array(
'slug' => $this->id,
)
);
if ( is_wp_error( $api ) ) {
return $api;
}
// Use the AJAX upgrader skin to quietly install the plugin.
$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
$install = $upgrader->install( $api->download_link );
if ( is_wp_error( $install ) ) {
return $install;
}
$activate = activate_plugin( $upgrader->plugin_info() );
if ( is_wp_error( $activate ) ) {
return $activate;
}
return true;
}
/**
* Determine if inline scripts and styles should be output.
*
* @since 3.40.0
* @since 5.9.0 Stop using deprecated `FILTER_SANITIZE_STRING`.
*
* @return bool
*/
protected function should_output_inline() {
// Short circuit if unauthorized.
if ( ! current_user_can( 'install_plugins' ) ) {
return false;
}
$screen = get_current_screen();
return ( 'lifterlms_page_llms-settings' === $screen->id && 'engagements' === llms_filter_input( INPUT_GET, 'tab' ) && ! $this->is_connected() );
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor.
- activate_already_installed_plugin — Determines if the plugin is already installed and activates it if it is
- add_settings — Add Settings.
- ajax_callback_remote_install — Ajax callback for installing the connector's plugin.
- can_remote_install — Determines if the current user can perform the remote installation.
- disable_other_providers — Automatically disables other providers when the current provider is connected.
- do_remote_install — Validate installation request and perform the plugin install or return errors.
- do_remote_install_success — Configures the response returned when `do_remote_install()` is successful.
- get_connect_setting — Retrieve the settings area HTML for the connect button
- get_description — Retrieve description text to be used in the settings area.
- get_title — Retrieve the connector's name / title.
- init — Initialize the Connector
- install — Install the plugin via the WP plugin installer.
- install_plugin — Install the plugin via the WP Plugin Repo.
- is_connected — Determines if connector plugin is connected for sending.
- is_installed — Determines if connector plugin is installed
- output_css — Deprecated. — deprecated
- should_output_inline — Determine if inline scripts and styles should be output.
Changelog Changelog
| Version | Description |
|---|---|
| 6.0.0 | Removed the deprecated LLMS_Abstract_Email_Provider::output_css() method. |
| 3.40.0 | Introduced. |