PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.87
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.87
51.1.87 51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 All 41 releases
← All changes | includes/features/Wrapper_Link/Wrapper_Link.php +119 -0 51.1.2 → 51.1.87 View file →
@@ -1,0 +1,119 @@
1 +<?php /** @noinspection PhpUnused */
2 +
3 +namespace King_Addons;
4 +
5 +use Elementor\Controls_Manager;
6 +use Elementor\Element_Base;
7 +
8 +/** @noinspection SpellCheckingInspection */
9 +if (!defined('ABSPATH')) {
10 + exit; // Exit if accessed directly.
11 +}
12 +
13 +class Wrapper_Link
14 +{
15 + private static ?Wrapper_Link $_instance = null;
16 +
17 + public static function instance(): Wrapper_Link
18 + {
19 + if (is_null(self::$_instance)) {
20 + self::$_instance = new self();
21 + }
22 + return self::$_instance;
23 + }
24 +
25 + public function __construct()
26 + {
27 + add_action('elementor/element/container/section_layout/after_section_end', [__CLASS__, 'addControls'], 1);
28 + add_action('elementor/element/column/section_advanced/after_section_end', [__CLASS__, 'addControls'], 1);
29 + add_action('elementor/element/section/section_advanced/after_section_end', [__CLASS__, 'addControls'], 1);
30 + add_action('elementor/element/common/_section_style/after_section_end', [__CLASS__, 'addControls'], 1);
31 + add_action('elementor/frontend/before_render', [__CLASS__, 'renderLink'], 1);
32 + }
33 +
34 + public static function addControls(Element_Base $element): void
35 + {
36 + $element->start_controls_section(
37 + 'kng_wrapper_link_section',
38 + [
39 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Wrapper Link', 'king-addons'),
40 + 'tab' => Controls_Manager::TAB_ADVANCED
41 + ]
42 + );
43 +
44 + $element->add_control(
45 + 'kng_wrapper_link_switch',
46 + [
47 + 'label' => esc_html__('Enable Wrapper Link', 'king-addons'),
48 + 'type' => Controls_Manager::SWITCHER
49 + ]
50 + );
51 +
52 + $element->add_control(
53 + 'kng_wrapper_link',
54 + [
55 + 'label' => esc_html__('Link', 'king-addons'),
56 + 'type' => Controls_Manager::URL,
57 + 'placeholder' => esc_html__('https://example.com', 'king-addons'),
58 + 'options' => [
59 + 'url',
60 + 'is_external'
61 + ],
62 + 'condition' => [
63 + 'kng_wrapper_link_switch!' => ''
64 + ]
65 + ]
66 + );
67 +
68 + $element->end_controls_section();
69 + }
70 +
71 + /**
72 + * Loads the click handler, and only for pages that actually use the feature.
73 + *
74 + * @return void
75 + */
76 + private static function enqueueScript(): void
77 + {
78 + $handle = KING_ADDONS_ASSETS_UNIQUE_KEY . '-wrapper-link-wrapper-link';
79 +
80 + if (!wp_script_is($handle, 'enqueued')) {
81 + wp_enqueue_script($handle);
82 + }
83 + }
84 +
85 + public static function renderLink(Element_Base $element): void
86 + {
87 + if (!empty($element->get_settings_for_display('kng_wrapper_link_switch'))) {
88 +
89 + $wrapper_link_settings = $element->get_settings_for_display('kng_wrapper_link');
90 +
91 + if (!empty($wrapper_link_settings['url'])) {
92 +
93 + $url = esc_url_raw($wrapper_link_settings['url']);
94 + if (empty($url)) {
95 + return;
96 + }
97 +
98 + $link_target = (!empty($wrapper_link_settings['is_external'])) ? '_blank' : '_self';
99 +
100 + /**
101 + * The URL travels in a data attribute and the click is handled by
102 + * wrapper-link.js. An inline onclick fired on every click that
103 + * bubbled up, so a link inside the container navigated twice —
104 + * once itself and once through the wrapper.
105 + */
106 + $element->add_render_attribute(
107 + '_wrapper',
108 + [
109 + 'style' => 'cursor: pointer;',
110 + 'data-kng-wrapper-link' => $url,
111 + 'data-kng-wrapper-link-target' => $link_target,
112 + ]
113 + );
114 +
115 + self::enqueueScript();
116 + }
117 + }
118 + }
119 +}