woocommerce/plugins/woo-ai/includes/class-woo-ai-settings.php

221 lines
6.5 KiB
PHP

<?php
/**
* Woo AI settings page module.
*
* @package Woo_AI
*/
defined( 'ABSPATH' ) || exit;
use Automattic\Jetpack\Constants;
/**
* Woo_AI_Settings Class.
*/
class Woo_AI_Settings {
/**
* Plugin instance.
*
* @var Woo_AI_Settings
*/
protected static $instance = null;
/**
* Settings ID.
*
* @var id
*/
protected $id = 'woo-ai-settings-tab';
/**
* Main Instance.
*/
public static function instance() {
self::$instance = is_null( self::$instance ) ? new self() : self::$instance;
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
add_action( 'admin_enqueue_scripts', array( $this, 'add_woo_ai_settings_script' ) );
add_action( 'woocommerce_settings_save_advanced', array( $this, 'action_save_woo_ai_settings_tab' ) );
add_action( 'woocommerce_settings_page_init', array( $this, 'add_ui' ) );
$this->add_sanitization_hooks();
}
/**
* Add UI related hooks.
*/
public function add_ui() {
add_filter( 'woocommerce_get_settings_advanced', array( $this, 'add_woo_ai_settings' ), 10, 2 );
}
/**
* Save settings.
*/
public function action_save_woo_ai_settings_tab() {
WC_Admin_Settings::save_fields(
$this->get_woo_ai_settings()
);
}
/**
* Add sanitization hooks.
*/
public function add_sanitization_hooks() {
$settings = $this->get_woo_ai_settings();
foreach ( $settings as $setting ) {
if ( in_array( $setting['type'], array( 'text', 'textarea' ), true ) ) {
add_filter( 'woocommerce_admin_settings_sanitize_option_' . $setting['id'], array( $this, 'strip_tags_field_value' ) );
}
}
}
/**
* Sanitize field value.
*
* @param string $raw_value The current section.
*/
public function strip_tags_field_value( $raw_value ) {
return wp_strip_all_tags( $raw_value ?? '' );
}
/**
* Add settings to the AI section.
*
* @param array $settings The original settings array.
* @param string $current_section The current section.
*/
public function add_woo_ai_settings( $settings = array(), $current_section = null ) {
if ( 'features' === $current_section ) {
$settings = array_merge(
$this->get_woo_ai_settings(),
$settings
);
}
return $settings;
}
/**
* Return array describing new settings.
*
* @return array Describing new AI settings.
*/
public function get_woo_ai_settings() {
// These are made available in the DOM and actually toggled client-side.
$tone_desc = array(
'informal' => __( 'Relaxed and friendly, as if you were having a conversation with a friend.', 'woocommerce' ),
'humorous' => __( 'Engage customers with a light-hearted and fun communication style.', 'woocommerce' ),
'neutral' => __( 'A balanced and impartial tone that uses casual expressions without slang.', 'woocommerce' ),
'youthful' => __( 'Bring energy and enthusiasm to your store with a friendly and cheeky tone.', 'woocommerce' ),
'formal' => __( 'Direct yet respectful, a formal tone sounds serious and professional.', 'woocommerce' ),
'motivational' => __( 'Passionate and inspiring, engage users with this upbeat tone.', 'woocommerce' ),
);
$markup_str = array_reduce(
array_keys( $tone_desc ),
function( $acc, $key ) use ( $tone_desc ) {
$value = $tone_desc[ $key ];
return $acc . '<span class="woo-ai-settings-tone-option" data-option="' . htmlspecialchars( $key ) . '">' . htmlspecialchars( $value ) . '</span>';
},
''
);
return array(
array(
'id' => 'woo_ai_title',
'type' => 'title',
'title' => __( 'Artificial Intelligence', 'woocommerce' ),
'desc' => __( "Save time by automating mundane parts of store management. This information will make AI-generated content, visuals, and setting more aligned with your store's goals and identity.", 'woocommerce' ),
),
array(
'title' => __( 'Enable AI', 'woocommerce' ),
'desc' => __( 'Enable AI features in your store', 'woocommerce' ),
'id' => 'woo_ai_enable_checkbox',
'default' => 'yes',
'type' => 'checkbox',
),
array(
'title' => __( 'Tone of voice', 'woocommerce' ),
'id' => 'woo_ai_tone_of_voice_select',
'css' => 'min-width:300px;',
'default' => 'neutral',
'type' => 'select',
'desc' => $markup_str,
'desc_tip' => __( 'Choose the language style that best resonates with your customers. It\'ll be used in text-based content, like product descriptions.', 'woocommerce' ),
'custom_attributes' => array( 'disabled' => 'true' ),
'options' => array(
'informal' => esc_html__( 'Informal', 'woocommerce' ),
'humorous' => esc_html__( 'Humorous', 'woocommerce' ),
'neutral' => esc_html__( 'Neutral', 'woocommerce' ),
'youthful' => esc_html__( 'Youthful', 'woocommerce' ),
'formal' => esc_html__( 'Formal', 'woocommerce' ),
'motivational' => esc_html__( 'Motivational', 'woocommerce' ),
),
),
array(
'id' => 'woo_ai_describe_store_description',
'type' => 'textarea',
'custom_attributes' => array( 'disabled' => 'true' ),
'title' => __( 'Describe your business', 'woocommerce' ),
'desc_tip' => __( 'Tell us what makes your business unique to further improve accuracy of the AI-generated content. This will not be shown to customers.', 'woocommerce' ),
'placeholder' => __( 'e.g. Marianne Renoir is a greengrocery taken over by a ten generations Parisian family who wants to keep quality and tradition in the quarter of Montmartre', 'woocommerce' ),
'css' => 'min-width:300px;min-height: 130px;',
),
array(
'type' => 'sectionend',
'id' => 'woo_ai_title',
),
);
}
/**
* Enqueue the styles and JS
*/
public function add_woo_ai_settings_script() {
global $pagenow;
// phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( 'admin.php' !== $pagenow || ( isset( $_GET['page'] ) && 'wc-settings' !== $_GET['page'] ) ) {
return;
}
$script_path = '/../build/settings.js';
$script_url = plugins_url( $script_path, __FILE__ );
$version = Constants::get_constant( 'WC_VERSION' );
wp_register_script(
'woo-ai-settings',
$script_url,
array( 'jquery' ),
$version,
true
);
wp_enqueue_script( 'woo-ai-settings' );
$css_file_version = filemtime( dirname( __FILE__ ) . '/../build/settings.css' );
wp_register_style(
'woo-ai-settings',
plugins_url( '/../build/settings.css', __FILE__ ),
array(),
$css_file_version
);
wp_enqueue_style( 'woo-ai-settings' );
}
}