Files
2025-02-24 22:33:42 +01:00

453 lines
13 KiB
PHP

<?php
namespace Essential_Addons_Elementor\Pro\Classes;
use Elementor\Controls_Manager;
use Elementor\Plugin;
use Essential_Addons_Elementor\Classes\Helper as ClassesHelper;
if (!defined('ABSPATH')) {
exit;
} // Exit if accessed directly
class Helper extends \Essential_Addons_Elementor\Classes\Helper
{
use \Essential_Addons_Elementor\Pro\Traits\Dynamic_Filterable_Gallery;
const EAEL_PRO_ALLOWED_HTML_TAGS = [
'article',
'aside',
'div',
'footer',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'header',
'main',
'nav',
'p',
'section',
'span',
];
/**
* Get all product tags
*
* @return array
*/
public static function get_woo_product_tags()
{
if (!apply_filters('eael/is_plugin_active', 'woocommerce/woocommerce.php')) {
return [];
}
$options = [];
$tags = get_terms('product_tag', array('hide_empty' => true));
if (!empty($tags) && !is_wp_error($tags)) {
foreach ($tags as $tag) {
$options[$tag->term_id] = $tag->name;
}
}
return $options;
}
/**
* Get all product attributes
*
* @return array
*/
public static function get_woo_product_atts()
{
if ( ! apply_filters( 'eael/is_plugin_active', 'woocommerce/woocommerce.php' ) || ! function_exists( 'wc_get_attribute_taxonomies' ) ) {
return [];
}
$options = [];
$taxonomies = wc_get_attribute_taxonomies();
foreach ($taxonomies as $tax) {
$terms = get_terms('pa_' . $tax->attribute_name);
if (!empty($terms)) {
foreach ($terms as $term) {
$options[$term->term_id] = $tax->attribute_label . ': ' . $term->name;
}
}
}
return $options;
}
/**
* Get all registered menus.
*
* @return array of menus.
*/
public static function get_menus()
{
$menus = wp_get_nav_menus();
$options = [];
if (empty($menus)) {
return $options;
}
foreach ($menus as $menu) {
$options[$menu->term_id] = $menu->name;
}
return $options;
}
public static function user_roles()
{
global $wp_roles;
$all = $wp_roles->roles;
$all_roles = array();
if (!empty($all)) {
foreach ($all as $key => $value) {
$all_roles[$key] = $all[$key]['name'];
}
}
return $all_roles;
}
public static function get_page_template_options($type = '')
{
$page_templates = self::get_elementor_templates($type);
$options[-1] = __('Select', 'essential-addons-elementor');
if (count($page_templates)) {
foreach ($page_templates as $id => $name) {
$options[$id] = $name;
}
} else {
$options['no_template'] = __('No saved templates found!', 'essential-addons-elementor');
}
return $options;
}
// Get all WordPress registered widgets
public static function get_registered_sidebars()
{
global $wp_registered_sidebars;
$options = [];
if (!$wp_registered_sidebars) {
$options[''] = __('No sidebars were found', 'essential-addons-elementor');
} else {
$options['---'] = __('Choose Sidebar', 'essential-addons-elementor');
foreach ($wp_registered_sidebars as $sidebar_id => $sidebar) {
$options[$sidebar_id] = $sidebar['name'];
}
}
return $options;
}
// Get Mailchimp list
public static function mailchimp_lists( $element = 'mailchimp', $type_double_optin = false ) {
$lists = $lists_double_optin = [];
$api_key = get_option( 'eael_save_mailchimp_api' );
if ( $element === 'login-register-form' ) {
$api_key = get_option( 'eael_lr_mailchimp_api_key' );
}
if ( empty( $api_key ) ) {
return $lists;
}
$pattern = '/^[0-9a-z]{32}(-us)(0?[1-9]|[1-9][0-9])?$/';
if ( ! preg_match( $pattern, $api_key ) ) {
return $lists;
}
$response = wp_safe_remote_get( 'https://' . substr( $api_key,
strpos( $api_key, '-' ) + 1 ) . '.api.mailchimp.com/3.0/lists/?fields=lists.id,lists.name,lists.double_optin&count=1000', [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . base64_encode( 'user:' . $api_key ),
],
] );
if ( ! is_wp_error( $response ) ) {
$response = json_decode( wp_remote_retrieve_body( $response ) );
if ( ! empty( $response ) && ! empty( $response->lists ) ) {
$lists[''] = __( 'Select One', 'essential-addons-elementor' );
for ( $i = 0; $i < count( $response->lists ); $i ++ ) {
$lists[ $response->lists[ $i ]->id ] = $response->lists[ $i ]->name;
$lists[ $response->lists[ $i ]->id ] = $response->lists[ $i ]->name;
$lists_double_optin[ $response->lists[ $i ]->id ] = $response->lists[ $i ]->double_optin;
}
}
}
return $type_double_optin ? $lists_double_optin : $lists;
}
public static function list_db_tables()
{
global $wpdb;
$result = [];
$tables = $wpdb->get_results('show tables', ARRAY_N);
if ($tables) {
$tables = wp_list_pluck($tables, 0);
foreach ($tables as $table) {
$result[$table] = $table;
}
}
return $result;
}
public static function list_tablepress_tables() {
if ( empty( \TablePress::$model_table ) ) {
return [];
}
$result = [];
$tables = \TablePress::$model_table->load_all( true );
if ( $tables ) {
foreach ( $tables as $table ) {
$table = \TablePress::$model_table->load( $table, false, false );
$result[ $table['id'] ] = $table['name'];
}
}
return $result;
}
/**
* eael_pro_validate_html_tag
* @param $tag
* @return mixed|string
*/
public static function eael_pro_validate_html_tag( $tag ){
return in_array( strtolower( $tag ), self::EAEL_PRO_ALLOWED_HTML_TAGS ) ? $tag : 'div';
}
/**
* Get all dropdown options of elementor breakpoints.
*
* @return array of breakpoint options.
*/
public static function get_breakpoint_dropdown_options(){
$breakpoints = Plugin::$instance->breakpoints->get_active_breakpoints();
$dropdown_options = [];
$excluded_breakpoints = [
'laptop',
'widescreen',
];
foreach ( $breakpoints as $breakpoint_key => $breakpoint_instance ) {
// Do not include laptop and widscreen in the options since this feature is for mobile devices.
if ( in_array( $breakpoint_key, $excluded_breakpoints, true ) ) {
continue;
}
$dropdown_options[ $breakpoint_key ] = sprintf(
/* translators: 1: Breakpoint label, 2: `>` character, 3: Breakpoint value */
esc_html__( '%1$s (%2$s %3$dpx)', 'essential-addons-elementor' ),
$breakpoint_instance->get_label(),
'>',
$breakpoint_instance->get_value()
);
}
$dropdown_options['desktop'] = esc_html__( 'Desktop (> 2400px)', 'essential-addons-elementor' );
$dropdown_options['none'] = esc_html__( 'None', 'essential-addons-elementor' );
return $dropdown_options;
}
public static function validate_post_types( $post_types )
{
$allowed_post_types = self::get_post_types();
$validated_post_types = '';
if ( is_string( $post_types ) && array_key_exists( $post_types, $allowed_post_types ) ) {
$validated_post_types = $post_types;
} else {
if ( is_array( $post_types ) ) {
$validated_post_types = array_filter( $post_types, function ( $post_type ) use( $allowed_post_types ) {
return array_key_exists( $post_type, $allowed_post_types );
});
}
}
return $validated_post_types;
}
public static function get_allowed_taxonomies()
{
$taxonomies = get_taxonomies(['public' => true]);
$taxonomy_array = [];
foreach ($taxonomies as $taxonomy) {
$taxonomy_object = get_taxonomy($taxonomy);
$taxonomy_array[$taxonomy] = sanitize_text_field($taxonomy_object->labels->name);
}
return $taxonomy_array;
}
/**
* Query Controls for Dynamic Tags
*
*/
public static function query_dynamic_tags( $wb, $args )
{
$post_types = ClassesHelper::get_post_types();
$post_types = $args['post_types'] ?? $post_types;
$hide_controls = ! empty( $args['hide_controls'] ) ? $args['hide_controls'] : [];
if( ! isset( $args['post_types'] ) ) {
$post_types['by_id'] = __('Manual Selection', 'essential-addons-elementor');
}
$taxonomies = get_taxonomies([], 'objects');
$wb->add_control(
'post_type',
[
'label' => __('Source', 'essential-addons-elementor'),
'type' => in_array( 'post_type', $hide_controls ) ? Controls_Manager::HIDDEN : Controls_Manager::SELECT,
'options' => $post_types,
'default' => key($post_types),
]
);
$wb->add_control(
'posts_ids',
[
'label' => __('Search & Select', 'essential-addons-elementor'),
'type' => 'eael-select2',
'options' => ClassesHelper::get_post_list(),
'label_block' => true,
'multiple' => true,
'source_name' => 'post_type',
'source_type' => 'any',
'condition' => [
'post_type' => 'by_id',
],
]
);
$wb->add_control(
'authors', [
'label' => __('Author', 'essential-addons-elementor'),
'label_block' => true,
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'default' => [],
'options' => ClassesHelper::get_authors_list(),
'condition' => [
'post_type!' => ['by_id', 'source_dynamic'],
],
]
);
foreach ($taxonomies as $taxonomy => $object) {
if (!isset($object->object_type[0]) || !in_array($object->object_type[0], array_keys($post_types))) {
continue;
}
if ( 'post_format' === $taxonomy || 'product_shipping_class' === $taxonomy || 'product_visibility' === $taxonomy ) {
continue;
}
$wb->add_control(
$taxonomy . '_ids',
[
'label' => $object->label,
'type' => in_array( $taxonomy . '_ids', $hide_controls ) ? Controls_Manager::HIDDEN : 'eael-select2',
'label_block' => true,
'multiple' => true,
'source_name' => 'taxonomy',
'source_type' => $taxonomy,
'condition' => [
'post_type' => $object->object_type,
],
]
);
}
$wb->add_control(
'post__not_in',
[
'label' => __( 'Exclude', 'essential-addons-elementor' ),
'type' => 'eael-select2',
'label_block' => true,
'multiple' => true,
'source_name' => 'post_type',
'source_type' => 'any',
'condition' => [
'post_type!' => [ 'by_id', 'source_dynamic' ],
],
]
);
$wb->add_control(
'posts_per_page',
[
'label' => __('Count', 'essential-addons-elementor'),
'type' => Controls_Manager::NUMBER,
'default' => '10',
'min' => '1',
]
);
$wb->add_control(
'offset',
[
'label' => __('Offset', 'essential-addons-elementor'),
'type' => Controls_Manager::NUMBER,
'default' => '0',
'condition' => [
'orderby!' => 'rand'
]
]
);
$wb->add_control(
'orderby',
[
'label' => __('Order By', 'essential-addons-elementor'),
'type' => Controls_Manager::SELECT,
'options' => ClassesHelper::get_post_orderby_options(),
'default' => 'date',
]
);
$wb->add_control(
'order',
[
'label' => __('Order', 'essential-addons-elementor'),
'type' => Controls_Manager::SELECT,
'options' => [
'asc' => 'Ascending',
'desc' => 'Descending',
],
'default' => 'desc',
]
);
}
}