347 lines
9.1 KiB
PHP
347 lines
9.1 KiB
PHP
<?php
|
|
|
|
namespace EDD\Admin\Extensions;
|
|
|
|
use \EDD\Admin\Pass_Manager;
|
|
|
|
abstract class Extension {
|
|
|
|
/**
|
|
* The product ID. This only needs to be set if the extending class is
|
|
* for a single product.
|
|
*
|
|
* @since 2.11.4
|
|
* @var int
|
|
*/
|
|
protected $item_id;
|
|
|
|
/**
|
|
* The settings tab where this item will show.
|
|
*
|
|
* @since 2.11.4
|
|
* @var string
|
|
*/
|
|
protected $settings_tab = '';
|
|
|
|
/**
|
|
* The required AA pass level.
|
|
*/
|
|
const PASS_LEVEL = Pass_Manager::PERSONAL_PASS_ID;
|
|
|
|
/**
|
|
* The Extension Manager
|
|
*
|
|
* @var \EDD\Admin\Extensions\Extension_Manager
|
|
*/
|
|
protected $manager;
|
|
|
|
/**
|
|
* The settings section for this item.
|
|
*
|
|
* @since 2.11.5
|
|
* @var string
|
|
*/
|
|
protected $settings_section = 'general';
|
|
|
|
public function __construct() {
|
|
$this->manager = new \EDD\Admin\Extensions\Extension_Manager( static::PASS_LEVEL );
|
|
}
|
|
|
|
/**
|
|
* Whether the extension is activated.
|
|
*
|
|
* @since 2.11.4
|
|
* @return bool
|
|
*/
|
|
abstract protected function is_activated();
|
|
|
|
/**
|
|
* Output the settings field (installation helper).
|
|
*
|
|
* @return void
|
|
*/
|
|
public function settings_field() {
|
|
if ( $this->is_activated() ) {
|
|
return;
|
|
}
|
|
$this->do_single_extension_card();
|
|
}
|
|
|
|
/**
|
|
* Outputs a single extension card.
|
|
*
|
|
* @since 2.11.4
|
|
* @param false|int $item_id Optional: the individual extension product ID.
|
|
* @return void
|
|
*/
|
|
public function do_single_extension_card( $item_id = false ) {
|
|
if ( empty( $item_id ) && empty( $this->item_id ) ) {
|
|
return;
|
|
}
|
|
$product_data = $this->get_product_data( $item_id );
|
|
if ( ! $product_data || empty( $product_data->title ) ) {
|
|
return;
|
|
}
|
|
$this->manager->do_extension_card(
|
|
$product_data,
|
|
$this->get_button_parameters( $product_data, $item_id ),
|
|
$this->get_link_parameters( $product_data ),
|
|
$this->get_configuration( $product_data )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Gets the product data for a specific extension.
|
|
*
|
|
* @param false|int $item_id
|
|
* @return bool|ProductData|array False if there is no data; product data object if there is, or possibly an array of arrays.
|
|
*/
|
|
public function get_product_data( $item_id = false ) {
|
|
require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/class-extensions-api.php';
|
|
$api = new ExtensionsAPI();
|
|
$body = $this->get_api_body();
|
|
$api_item_id = $item_id ?: $this->item_id;
|
|
$product_data = $api->get_product_data( $body, $api_item_id );
|
|
if ( ! $product_data ) {
|
|
return false;
|
|
}
|
|
|
|
if ( $api_item_id ) {
|
|
return $product_data;
|
|
}
|
|
|
|
if ( $item_id && ! empty( $product_data[ $item_id ] ) ) {
|
|
return $product_data[ $item_id ];
|
|
}
|
|
|
|
return $product_data;
|
|
}
|
|
|
|
/**
|
|
* Gets the custom configuration for the extension.
|
|
*
|
|
* @since 2.11.4
|
|
* @param ProductData $product_data Optionally allows the product data to be parsed in the configuration.
|
|
* @return array
|
|
*/
|
|
protected function get_configuration( ProductData $product_data ) {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Formats a custom description array by running wpautop and converting it to a string.
|
|
*
|
|
* @since 2.11.4
|
|
* @param array $description The custom product description.
|
|
* @return string
|
|
*/
|
|
protected function format_description( array $description ) {
|
|
return implode( '', array_map( 'wpautop', $description ) );
|
|
}
|
|
|
|
/**
|
|
* Whether the current screen is an EDD setings screen.
|
|
*
|
|
* @since 2.11.4
|
|
* @return bool
|
|
*/
|
|
protected function is_edd_settings_screen() {
|
|
return edd_is_admin_page( 'settings', $this->settings_tab );
|
|
}
|
|
|
|
/**
|
|
* Whether the current screen is a download new/edit screen.
|
|
*
|
|
* @since 2.11.4
|
|
* @return bool
|
|
*/
|
|
protected function is_download_edit_screen() {
|
|
return edd_is_admin_page( 'download', 'edit' ) || edd_is_admin_page( 'download', 'new' );
|
|
}
|
|
|
|
/**
|
|
* Whether the section for an individual product can be registered/shown.
|
|
*
|
|
* @since 2.11.4
|
|
* @return bool
|
|
*/
|
|
protected function can_show_product_section() {
|
|
if ( ! $this->is_edd_settings_screen() ) {
|
|
return false;
|
|
}
|
|
if ( $this->is_activated() ) {
|
|
return false;
|
|
}
|
|
if ( ! $this->get_product_data() ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Gets the array for the body of the API request.
|
|
* Classes may need to override this (for example, to query a specific tag).
|
|
* Note that the first array key/value pair are used to create the option name.
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function get_api_body() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Gets the type for the button data-type attribute.
|
|
* This is intended to sync with the Products API request.
|
|
* Default is product.
|
|
*
|
|
* Really a shim for array_key_first.
|
|
*
|
|
* @param array $array
|
|
* @return string
|
|
*/
|
|
private function get_type( array $array ) {
|
|
$type = 'product';
|
|
if ( empty( $array ) ) {
|
|
return $type;
|
|
}
|
|
if ( function_exists( 'array_key_first' ) ) {
|
|
return array_key_first( $array );
|
|
}
|
|
foreach ( $array as $key => $unused ) {
|
|
return $key;
|
|
}
|
|
|
|
return $type;
|
|
}
|
|
|
|
/**
|
|
* Gets the button parameters.
|
|
* Classes should not need to replace this method.
|
|
*
|
|
* @param ProductData $product_data The extension data returned from the Products API.
|
|
* @param int|false $item_id Optional: the item ID.
|
|
* @return array
|
|
*/
|
|
protected function get_button_parameters( ProductData $product_data, $item_id = false ) {
|
|
if ( empty( $item_id ) ) {
|
|
$item_id = $this->item_id;
|
|
}
|
|
$body = $this->get_api_body();
|
|
$type = $this->get_type( $body );
|
|
$id = ! empty( $body[ $type ] ) ? $body[ $type ] : $this->item_id;
|
|
$button = array(
|
|
'type' => $type,
|
|
'id' => $id,
|
|
'product' => $item_id,
|
|
);
|
|
// If the extension is not installed, the button will prompt to install and activate it.
|
|
if ( ! $this->manager->is_plugin_installed( $product_data->basename ) ) {
|
|
if ( $this->manager->pass_can_download() ) {
|
|
$button = array(
|
|
/* translators: The extension name. */
|
|
'button_text' => sprintf( __( 'Log In to Your Account to Download %s', 'easy-digital-downloads' ), $product_data->title ),
|
|
'href' => $this->get_upgrade_url( $product_data, $item_id, true ),
|
|
'new_tab' => true,
|
|
'type' => $type,
|
|
);
|
|
} else {
|
|
$button = array(
|
|
/* translators: The extension name. */
|
|
'button_text' => sprintf( __( 'Upgrade Today to Access %s!', 'easy-digital-downloads' ), $product_data->title ),
|
|
'href' => $this->get_upgrade_url( $product_data, $item_id ),
|
|
'new_tab' => true,
|
|
'type' => $type,
|
|
);
|
|
}
|
|
} elseif ( ! empty( $product_data->basename ) && ! $this->manager->is_plugin_active( $product_data->basename ) ) {
|
|
// If the extension is installed, but not activated, the button will prompt to activate it.
|
|
$button['plugin'] = $product_data->basename;
|
|
$button['action'] = 'activate';
|
|
/* translators: The extension name. */
|
|
$button['button_text'] = sprintf( __( 'Activate %s', 'easy-digital-downloads' ), $product_data->title );
|
|
}
|
|
|
|
return $button;
|
|
}
|
|
|
|
/**
|
|
* Gets the upgrade URL for the button.
|
|
*
|
|
* @since 2.11.4
|
|
* @param ProductData $product_data The product data object.
|
|
* @param int $item_id The item/product ID.
|
|
* @param bool $has_access Whether the user already has access to the extension (based on pass level).
|
|
* @return string
|
|
*/
|
|
private function get_upgrade_url( ProductData $product_data, $item_id, $has_access = false ) {
|
|
if ( $has_access ) {
|
|
$url = 'https://easydigitaldownloads.com/your-account/your-downloads/';
|
|
} else {
|
|
$url = 'https://easydigitaldownloads.com/lite-upgrade';
|
|
}
|
|
|
|
$utm_parameters = array(
|
|
'utm_medium' => $this->settings_section,
|
|
'utm_content' => $product_data->slug,
|
|
);
|
|
|
|
return edd_link_helper(
|
|
$url,
|
|
$utm_parameters
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Gets the array of parameters for the link to configure the extension.
|
|
*
|
|
* @since 2.11.4
|
|
* @param ProductData $product_data The product data object.
|
|
* @return array
|
|
*/
|
|
protected function get_link_parameters( ProductData $product_data ) {
|
|
$configuration = $this->get_configuration( $product_data );
|
|
$tab = ! empty( $configuration['tab'] ) ? $configuration['tab'] : $product_data->tab;
|
|
$section = ! empty( $configuration['section'] ) ? $configuration['section'] : $product_data->section;
|
|
if ( empty( $tab ) && empty( $section ) ) {
|
|
return array(
|
|
/* translators: the plural Downloads label. */
|
|
'button_text' => sprintf( __( 'View %s', 'easy-digital-downloads' ), edd_get_label_plural() ),
|
|
'href' => add_query_arg(
|
|
array(
|
|
'post_type' => 'download',
|
|
),
|
|
admin_url( 'edit.php' )
|
|
),
|
|
);
|
|
}
|
|
|
|
return array(
|
|
/* translators: The extension name. */
|
|
'button_text' => sprintf( __( 'Configure %s', 'easy-digital-downloads' ), $product_data->title ),
|
|
'href' => edd_get_admin_url(
|
|
array(
|
|
'page' => 'edd-settings',
|
|
'tab' => urlencode( $tab ),
|
|
'section' => urlencode( $section ),
|
|
)
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Optionally hides the submit button on screens where it's not needed.
|
|
*
|
|
* @since 2.11.4
|
|
* @return void
|
|
*/
|
|
public function hide_submit_button() {
|
|
if ( ! $this->can_show_product_section() ) {
|
|
return;
|
|
}
|
|
?>
|
|
<style>p.submit{display:none;}</style>
|
|
<?php
|
|
}
|
|
}
|