Settings api
This commit is contained in:
parent
63f8eebd6a
commit
b27aed5753
|
@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
*
|
*
|
||||||
* @class WC_Integration
|
* @class WC_Integration
|
||||||
* @extends WC_Settings_API
|
* @extends WC_Settings_API
|
||||||
* @version 2.0.0
|
* @version 2.6.0
|
||||||
* @package WooCommerce/Abstracts
|
* @package WooCommerce/Abstracts
|
||||||
* @category Abstract Class
|
* @category Abstract Class
|
||||||
* @author WooThemes
|
* @author WooThemes
|
||||||
|
@ -19,24 +19,54 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
abstract class WC_Integration extends WC_Settings_API {
|
abstract class WC_Integration extends WC_Settings_API {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Admin Options.
|
* yes or no based on whether the integration is enabled.
|
||||||
*
|
* @var string
|
||||||
* Setup the gateway settings screen.
|
|
||||||
* Override this in your gateway.
|
|
||||||
*/
|
*/
|
||||||
public function admin_options() { ?>
|
public $enabled = 'yes';
|
||||||
|
|
||||||
<h3><?php echo isset( $this->method_title ) ? $this->method_title : __( 'Settings', 'woocommerce' ) ; ?></h3>
|
/**
|
||||||
|
* Integration title.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $method_title = '';
|
||||||
|
|
||||||
<?php echo isset( $this->method_description ) ? wpautop( $this->method_description ) : ''; ?>
|
/**
|
||||||
|
* Integration description.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $method_description = '';
|
||||||
|
|
||||||
<table class="form-table">
|
/**
|
||||||
<?php $this->generate_settings_html(); ?>
|
* Return the title for admin screens.
|
||||||
</table>
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_method_title() {
|
||||||
|
return apply_filters( 'woocommerce_integration_title', $this->method_title, $this );
|
||||||
|
}
|
||||||
|
|
||||||
<!-- Section -->
|
/**
|
||||||
<div><input type="hidden" name="section" value="<?php echo $this->id; ?>" /></div>
|
* Return the description for admin screens.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_method_description() {
|
||||||
|
return apply_filters( 'woocommerce_integration_description', $this->method_description, $this );
|
||||||
|
}
|
||||||
|
|
||||||
<?php
|
/**
|
||||||
|
* Output the gateway settings screen.
|
||||||
|
*/
|
||||||
|
public function admin_options() {
|
||||||
|
echo '<h2>' . esc_html( $this->get_method_title() ) . '</h2>';
|
||||||
|
echo wp_kses_post( wpautop( $this->get_method_description() ) );
|
||||||
|
echo '<div><input type="hidden" name="section" value="' . esc_attr( $this->id ) . '" /></div>';
|
||||||
|
parent::admin_options();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init settings for gateways.
|
||||||
|
*/
|
||||||
|
public function init_settings() {
|
||||||
|
parent::init_settings();
|
||||||
|
$this->enabled = ! empty( $this->settings['enabled'] ) && 'yes' === $this->settings['enabled'] ? 'yes' : 'no';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,6 +127,14 @@ abstract class WC_Payment_Gateway extends WC_Settings_API {
|
||||||
parent::admin_options();
|
parent::admin_options();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init settings for gateways.
|
||||||
|
*/
|
||||||
|
public function init_settings() {
|
||||||
|
parent::init_settings();
|
||||||
|
$this->enabled = ! empty( $this->settings['enabled'] ) && 'yes' === $this->settings['enabled'] ? 'yes' : 'no';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the return url (thank you page).
|
* Get the return url (thank you page).
|
||||||
*
|
*
|
||||||
|
@ -194,7 +202,6 @@ abstract class WC_Payment_Gateway extends WC_Settings_API {
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function is_available() {
|
public function is_available() {
|
||||||
|
|
||||||
$is_available = ( 'yes' === $this->enabled ) ? true : false;
|
$is_available = ( 'yes' === $this->enabled ) ? true : false;
|
||||||
|
|
||||||
if ( WC()->cart && 0 < $this->get_order_total() && 0 < $this->max_amount && $this->max_amount < $this->get_order_total() ) {
|
if ( WC()->cart && 0 < $this->get_order_total() && 0 < $this->max_amount && $this->max_amount < $this->get_order_total() ) {
|
||||||
|
|
|
@ -42,12 +42,6 @@ abstract class WC_Settings_API {
|
||||||
*/
|
*/
|
||||||
public $form_fields = array();
|
public $form_fields = array();
|
||||||
|
|
||||||
/**
|
|
||||||
* Sanitized fields after validation.
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $sanitized_fields = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the form fields after they are initialized.
|
* Get the form fields after they are initialized.
|
||||||
* @return array of options
|
* @return array of options
|
||||||
|
@ -65,6 +59,7 @@ abstract class WC_Settings_API {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the name of the option in the WP DB.
|
* Return the name of the option in the WP DB.
|
||||||
|
* @since 2.6.0
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function get_option_key() {
|
public function get_option_key() {
|
||||||
|
@ -72,28 +67,84 @@ abstract class WC_Settings_API {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process and save options.
|
* Get a fields type. Defaults to "text" if not set.
|
||||||
* @return bool was anything saved?
|
* @param array $field
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function process_admin_options() {
|
public function get_field_type( $field ) {
|
||||||
$this->validate_settings_fields();
|
return empty( $field['type'] ) ? 'text' : $field['type'];
|
||||||
|
|
||||||
if ( count( $this->errors ) > 0 ) {
|
|
||||||
$this->display_errors();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
update_option( $this->get_option_key(), apply_filters( 'woocommerce_settings_api_sanitized_fields_' . $this->id, $this->sanitized_fields ) );
|
|
||||||
$this->init_settings();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display admin error messages.
|
* Get a field's posted and validated value.
|
||||||
*
|
* @return string
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
*/
|
||||||
public function display_errors() {}
|
public function get_field_value( $key, $field ) {
|
||||||
|
$type = $this->get_field_type( $field );
|
||||||
|
|
||||||
|
// Look for a validate_FIELDID_field method for special handling
|
||||||
|
if ( method_exists( $this, 'validate_' . $key . '_field' ) ) {
|
||||||
|
return $this->{'validate_' . $key . '_field'}( $key );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for a validate_FIELDTYPE_field method
|
||||||
|
if ( method_exists( $this, 'validate_' . $type . '_field' ) ) {
|
||||||
|
return $this->{'validate_' . $type . '_field'}( $key );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to text
|
||||||
|
return $this->validate_text_field( $key );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes and saves options.
|
||||||
|
*
|
||||||
|
* If there is an error thrown, will continue to save and validate fields, but will leave the erroring field out.
|
||||||
|
*
|
||||||
|
* @return bool was anything saved?
|
||||||
|
*/
|
||||||
|
public function process_admin_options() {
|
||||||
|
$this->init_settings();
|
||||||
|
$this->errors = array();
|
||||||
|
|
||||||
|
foreach ( $this->get_form_fields() as $key => $field ) {
|
||||||
|
if ( ! empty( $field['type'] ) && in_array( $field['type'], array( 'title' ) ) ) {
|
||||||
|
continue; // Exclude certain types from saving
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$value = $this->get_field_value( $key, $field );
|
||||||
|
$this->settings[ $key ] = $value;
|
||||||
|
} catch ( Exception $e ) {
|
||||||
|
$this->errors[] = $e->getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( count( $this->errors ) > 0 ) {
|
||||||
|
$this->display_errors();
|
||||||
|
}
|
||||||
|
|
||||||
|
return update_option( $this->get_option_key(), apply_filters( 'woocommerce_settings_api_sanitized_fields_' . $this->id, $this->settings ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the data on the "Settings" form.
|
||||||
|
* @deprecated 2.6.0 No longer used
|
||||||
|
*/
|
||||||
|
public function validate_settings_fields( $form_fields = array() ) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display admin error messages.
|
||||||
|
*/
|
||||||
|
public function display_errors() {
|
||||||
|
echo '<div id="woocommerce_errors" class="error notice is-dismissible">';
|
||||||
|
|
||||||
|
foreach ( $this->errors as $error ) {
|
||||||
|
echo '<p>' . wp_kses_post( $error ) . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise Settings.
|
* Initialise Settings.
|
||||||
|
@ -106,27 +157,20 @@ abstract class WC_Settings_API {
|
||||||
* @uses get_option(), add_option()
|
* @uses get_option(), add_option()
|
||||||
*/
|
*/
|
||||||
public function init_settings() {
|
public function init_settings() {
|
||||||
|
|
||||||
// Load form_field settings.
|
|
||||||
$this->settings = get_option( $this->get_option_key(), null );
|
$this->settings = get_option( $this->get_option_key(), null );
|
||||||
|
|
||||||
if ( ! $this->settings || ! is_array( $this->settings ) ) {
|
if ( ! is_array( $this->settings ) ) {
|
||||||
|
|
||||||
$this->settings = array();
|
$this->settings = array();
|
||||||
|
|
||||||
// If there are no settings defined, load defaults.
|
// If there are no settings defined, load defaults.
|
||||||
if ( $form_fields = $this->get_form_fields() ) {
|
if ( $form_fields = $this->get_form_fields() ) {
|
||||||
|
|
||||||
foreach ( $form_fields as $k => $v ) {
|
foreach ( $form_fields as $k => $v ) {
|
||||||
$this->settings[ $k ] = isset( $v['default'] ) ? $v['default'] : '';
|
$this->settings[ $k ] = isset( $v['default'] ) ? $v['default'] : '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $this->settings ) && is_array( $this->settings ) ) {
|
$this->settings = array_map( array( $this, 'format_settings' ), $this->settings );
|
||||||
$this->settings = array_map( array( $this, 'format_settings' ), $this->settings );
|
|
||||||
$this->enabled = isset( $this->settings['enabled'] ) && $this->settings['enabled'] == 'yes' ? 'yes' : 'no';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -193,15 +237,12 @@ abstract class WC_Settings_API {
|
||||||
|
|
||||||
$html = '';
|
$html = '';
|
||||||
foreach ( $form_fields as $k => $v ) {
|
foreach ( $form_fields as $k => $v ) {
|
||||||
|
$type = $this->get_field_type( $field );
|
||||||
|
|
||||||
if ( ! isset( $v['type'] ) || ( $v['type'] == '' ) ) {
|
if ( method_exists( $this, 'generate_' . $type . '_html' ) ) {
|
||||||
$v['type'] = 'text'; // Default to "text" field type.
|
$html .= $this->{'generate_' . $type . '_html'}( $k, $v );
|
||||||
}
|
|
||||||
|
|
||||||
if ( method_exists( $this, 'generate_' . $v['type'] . '_html' ) ) {
|
|
||||||
$html .= $this->{'generate_' . $v['type'] . '_html'}( $k, $v );
|
|
||||||
} else {
|
} else {
|
||||||
$html .= $this->{'generate_text_html'}( $k, $v );
|
$html .= $this->generate_text_html( $k, $v );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,45 +721,6 @@ abstract class WC_Settings_API {
|
||||||
return ob_get_clean();
|
return ob_get_clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate the data on the "Settings" form.
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
* @param array $form_fields (default: array())
|
|
||||||
*/
|
|
||||||
public function validate_settings_fields( $form_fields = array() ) {
|
|
||||||
if ( empty( $form_fields ) ) {
|
|
||||||
$form_fields = $this->get_form_fields();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->sanitized_fields = array();
|
|
||||||
|
|
||||||
foreach ( $form_fields as $key => $field ) {
|
|
||||||
|
|
||||||
// Default to "text" field type.
|
|
||||||
$type = empty( $field['type'] ) ? 'text' : $field['type'];
|
|
||||||
|
|
||||||
// Look for a validate_FIELDID_field method for special handling
|
|
||||||
if ( method_exists( $this, 'validate_' . $key . '_field' ) ) {
|
|
||||||
$field = $this->{'validate_' . $key . '_field'}( $key );
|
|
||||||
|
|
||||||
// Exclude certain types from saving
|
|
||||||
} elseif ( in_array( $type, array( 'title' ) ) ) {
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Look for a validate_FIELDTYPE_field method
|
|
||||||
} elseif ( method_exists( $this, 'validate_' . $type . '_field' ) ) {
|
|
||||||
$field = $this->{'validate_' . $type . '_field'}( $key );
|
|
||||||
|
|
||||||
// Fallback to text
|
|
||||||
} else {
|
|
||||||
$field = $this->validate_text_field( $key );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->sanitized_fields[ $key ] = $field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate Text Field.
|
* Validate Text Field.
|
||||||
*
|
*
|
||||||
|
@ -728,7 +730,6 @@ abstract class WC_Settings_API {
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function validate_text_field( $key ) {
|
public function validate_text_field( $key ) {
|
||||||
|
|
||||||
$text = $this->get_option( $key );
|
$text = $this->get_option( $key );
|
||||||
$field = $this->get_field_key( $key );
|
$field = $this->get_field_key( $key );
|
||||||
|
|
||||||
|
@ -748,7 +749,6 @@ abstract class WC_Settings_API {
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function validate_price_field( $key ) {
|
public function validate_price_field( $key ) {
|
||||||
|
|
||||||
$text = $this->get_option( $key );
|
$text = $this->get_option( $key );
|
||||||
$field = $this->get_field_key( $key );
|
$field = $this->get_field_key( $key );
|
||||||
|
|
||||||
|
@ -839,7 +839,7 @@ abstract class WC_Settings_API {
|
||||||
*/
|
*/
|
||||||
public function validate_checkbox_field( $key ) {
|
public function validate_checkbox_field( $key ) {
|
||||||
$field = $this->get_field_key( $key );
|
$field = $this->get_field_key( $key );
|
||||||
return isset( $_POST[ $field ] ) && '1' === $_POST[ $field ] ) ? 'yes' : 'no';
|
return isset( $_POST[ $field ] ) && '1' === $_POST[ $field ] ? 'yes' : 'no';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,7 +23,7 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
|
||||||
* - global-settings Non-instance settings screens. Enabled by default for BW compatibility with methods before instances existed.
|
* - global-settings Non-instance settings screens. Enabled by default for BW compatibility with methods before instances existed.
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $supports = array( 'global-settings' );
|
public $supports = array( 'global-settings' );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unique ID for the shipping method - must be set.
|
* Unique ID for the shipping method - must be set.
|
||||||
|
@ -54,8 +54,11 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $enabled = 'yes';
|
public $enabled = 'yes';
|
||||||
|
|
||||||
/** @var string User set title */
|
/**
|
||||||
|
* Shipping method title for the frontend.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
public $title;
|
public $title;
|
||||||
|
|
||||||
/** @var bool True if the method is available. */
|
/** @var bool True if the method is available. */
|
||||||
|
@ -73,10 +76,10 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
|
||||||
/** @var float Minimum fee for the method */
|
/** @var float Minimum fee for the method */
|
||||||
public $minimum_fee = null;
|
public $minimum_fee = null;
|
||||||
|
|
||||||
/** @var bool Enabled for disabled */
|
/**
|
||||||
public $enabled = false;
|
* This is an array of rates - methods must populate this array to register shipping costs.
|
||||||
|
* @var array
|
||||||
/** @var array This is an array of rates - methods must populate this array to register shipping costs */
|
*/
|
||||||
public $rates = array();
|
public $rates = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,6 +143,7 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the name of the option in the WP DB.
|
* Return the name of the option in the WP DB.
|
||||||
|
* @since 2.6.0
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function get_option_key() {
|
public function get_option_key() {
|
||||||
|
@ -159,6 +163,14 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
|
||||||
parent::admin_options();
|
parent::admin_options();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init settings for shipping methods.
|
||||||
|
*/
|
||||||
|
public function init_settings() {
|
||||||
|
parent::init_settings();
|
||||||
|
$this->enabled = ! empty( $this->settings['enabled'] ) && 'yes' === $this->settings['enabled'] ? 'yes' : 'no';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the shipping title which is user set.
|
* Return the shipping title which is user set.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue