<?php
namespace CarouselSlider\Modules\ProductCarousel;
use CarouselSlider\Helper;
use CarouselSlider\Supports\MetaBoxForm;
use CarouselSlider\Admin\Setting;
use CarouselSlider\Supports\Sanitize;
defined( 'ABSPATH' ) || exit;
/**
* Admin class
*
* @package Modules/ProductCarousel
*/
class Admin {
/**
* The instance of the class
*
* @var self
*/
protected static $instance;
/**
* Ensures only one instance of the class is loaded or can be loaded.
*
* @return self
*/
public static function init() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
add_action( 'carousel_slider/meta_box_content', [ self::$instance, 'meta_box_content' ], 10, 2 );
add_filter( 'carousel_slider/admin/metabox_color_settings', [ self::$instance, 'color_settings' ] );
add_action( 'carousel_slider/save_slider', [ self::$instance, 'save_slider' ], 10, 2 );
}
return self::$instance;
}
/**
* Save post carousel content
*
* @param int $post_id The post id.
* @param array $data User submitted data.
*
* @return void
*/
public function save_slider( int $post_id, array $data ) {
$raw_data = $data['product_carousel'] ?? [];
foreach ( $raw_data as $meta_key => $meta_value ) {
if ( is_array( $meta_value ) ) {
$meta_value = implode( ',', $meta_value );
}
update_post_meta( $post_id, $meta_key, sanitize_text_field( $meta_value ) );
}
}
/**
* Show meta box content for product carousel
*
* @param int $slider_id The slider id.
* @param string $slider_type The slider type.
*/
public function meta_box_content( int $slider_id, string $slider_type ) {
if ( 'product-carousel' !== $slider_type ) {
return;
}
$form = new MetaBoxForm();
$template = Setting::get_option( 'woocommerce_shop_loop_item_template', 'v1-compatibility' );
$form->select(
array(
'group' => 'product_carousel',
'type' => 'select',
'id' => '_product_query_type',
'name' => esc_html__( 'Query Type', 'carousel-slider' ),
'std' => 'query_product',
'options' => array(
'query_product' => esc_html__( 'Query Products', 'carousel-slider' ),
'product_categories' => esc_html__( 'Product Categories', 'carousel-slider' ),
'product_tags' => esc_html__( 'Product Tags', 'carousel-slider' ),
'specific_products' => esc_html__( 'Specific Products', 'carousel-slider' ),
),
)
);
$form->select(
array(
'group' => 'product_carousel',
'type' => 'select',
'id' => '_product_query',
'name' => esc_html__( 'Choose Query', 'carousel-slider' ),
'std' => 'featured',
'options' => array(
'featured' => esc_html__( 'Featured Products', 'carousel-slider' ),
'recent' => esc_html__( 'Recent Products', 'carousel-slider' ),
'sale' => esc_html__( 'Sale Products', 'carousel-slider' ),
'best_selling' => esc_html__( 'Best-Selling Products', 'carousel-slider' ),
'top_rated' => esc_html__( 'Top Rated Products', 'carousel-slider' ),
'product_categories_list' => esc_html__( 'Product Categories List', 'carousel-slider' ),
),
)
);
$form->post_terms(
array(
'group' => 'product_carousel',
'type' => 'post_terms',
'id' => '_product_categories',
'taxonomy' => 'product_cat',
'multiple' => true,
'name' => esc_html__( 'Product Categories', 'carousel-slider' ),
'desc' => esc_html__( 'Show products associated with selected categories.', 'carousel-slider' ),
)
);
$form->post_terms(
array(
'group' => 'product_carousel',
'type' => 'post_terms',
'id' => '_product_tags',
'taxonomy' => 'product_tag',
'multiple' => true,
'name' => esc_html__( 'Product Tags', 'carousel-slider' ),
'desc' => esc_html__( 'Show products associated with selected tags.', 'carousel-slider' ),
)
);
$form->posts_list(
array(
'group' => 'product_carousel',
'type' => 'posts_list',
'id' => '_product_in',
'post_type' => 'product',
'multiple' => true,
'name' => esc_html__( 'Specific products', 'carousel-slider' ),
'desc' => esc_html__( 'Select products that you want to show as slider. Select at least 5 products', 'carousel-slider' ),
)
);
$form->number(
array(
'group' => 'product_carousel',
'type' => 'number',
'id' => '_products_per_page',
'name' => esc_html__( 'Product per page', 'carousel-slider' ),
'std' => 12,
'desc' => esc_html__( 'How many products you want to show on carousel slide.', 'carousel-slider' ),
)
);
if ( 'v1-compatibility' === $template ) {
$settings = self::get_settings_for_toggle_sections();
foreach ( $settings as $setting ) {
Helper::print_unescaped_internal_string( MetaBoxForm::field( $setting ) );
}
}
}
/**
* Color settings
*
* @param string $html The content html.
*
* @return string
*/
public function color_settings( string $html ): string {
global $post;
$slide_type = get_post_meta( $post->ID, '_slide_type', true );
$slide_type = array_key_exists( $slide_type, Helper::get_slide_types() ) ? $slide_type : 'image-carousel';
if ( 'product-carousel' !== $slide_type ) {
return $html;
}
$form = new MetaBoxForm();
ob_start();
$form->color(
array(
'group' => 'product_carousel',
'id' => '_product_title_color',
'type' => 'color',
'name' => esc_html__( 'Product Title Color', 'carousel-slider' ),
'desc' => esc_html__( 'Pick a color for product title. This color will also apply to sale tag and price.', 'carousel-slider' ),
'std' => Helper::get_default_setting( 'product_title_color' ),
)
);
$form->color(
array(
'group' => 'product_carousel',
'id' => '_product_button_bg_color',
'type' => 'color',
'name' => esc_html__( 'Product Button Background Color', 'carousel-slider' ),
'desc' => esc_html__( 'Pick a color for button background color. This color will also apply to product rating.', 'carousel-slider' ),
'std' => Helper::get_default_setting( 'product_button_bg_color' ),
)
);
$form->color(
array(
'group' => 'product_carousel',
'id' => '_product_button_text_color',
'type' => 'color',
'name' => esc_html__( 'Product Button Text Color', 'carousel-slider' ),
'desc' => esc_html__( 'Pick a color for button text color.', 'carousel-slider' ),
'std' => Helper::get_default_setting( 'product_button_text_color' ),
)
);
$content = ob_get_clean();
return $html . $content;
}
/**
* Get settings for toggle sections
*
* @return array[]
*/
public static function get_settings_for_toggle_sections(): array {
return [
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_title',
'label' => esc_html__( 'Show Title.', 'carousel-slider' ),
'description' => esc_html__( 'Check to show product title.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_rating',
'label' => esc_html__( 'Show Rating.', 'carousel-slider' ),
'description' => esc_html__( 'Check to show product rating.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_price',
'label' => esc_html__( 'Show Price.', 'carousel-slider' ),
'description' => esc_html__( 'Check to show product price.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_cart_button',
'label' => esc_html__( 'Show Cart Button.', 'carousel-slider' ),
'description' => esc_html__( 'Check to show product add to cart button.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_onsale',
'label' => esc_html__( 'Show Sale Tag', 'carousel-slider' ),
'description' => esc_html__( 'Check to show product sale tag for onsale products.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_wishlist',
'label' => esc_html__( 'Show Wishlist Button', 'carousel-slider' ),
/* translators: 1: YITH WooCommerce Wishlist plugin url*/
'description' => sprintf( esc_html__( 'Check to show wishlist button. This feature needs %s plugin to be installed.', 'carousel-slider' ), sprintf( '<a href="https://wordpress.org/plugins/yith-woocommerce-wishlist/" target="_blank" >%s</a>', __( 'YITH WooCommerce Wishlist', 'carousel-slider' ) ) ),
'default' => 'off',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
[
'group' => 'product_carousel',
'type' => 'switch',
'id' => '_product_quick_view',
'label' => esc_html__( 'Show Quick View', 'carousel-slider' ),
'description' => esc_html__( 'Check to show quick view button.', 'carousel-slider' ),
'default' => 'on',
'sanitize_callback' => [ Sanitize::class, 'checked' ],
],
];
}
}