Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 302
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Customizer
0.00% covered (danger)
0.00%
0 / 302
0.00% covered (danger)
0.00%
0 / 3
20
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 customize_register
0.00% covered (danger)
0.00%
0 / 287
0.00% covered (danger)
0.00%
0 / 1
6
 customize_controls_enqueue_scripts
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jetpack Search Customizer Integration
4 *
5 * @package    @automattic/jetpack-search
6 */
7
8namespace Automattic\Jetpack\Search;
9
10use Automattic\Jetpack\Assets;
11use WP_Customize_Color_Control;
12use WP_Customize_Manager;
13
14/**
15 * Class to customize search on the site.
16 *
17 * @phan-constructor-used-for-side-effects
18 */
19class Customizer {
20    /**
21     * Search Plan class.
22     *
23     * @var Plan
24     */
25    public $plan;
26
27    /**
28     * Class initialization.
29     */
30    public function __construct() {
31        add_action( 'customize_register', array( $this, 'customize_register' ) );
32        add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_controls_enqueue_scripts' ) );
33        $this->plan = new Plan();
34    }
35
36    /**
37     * Initialize Customizer controls.
38     *
39     * @param WP_Customize_Manager $wp_customize Customizer instance.
40     */
41    public function customize_register( $wp_customize ) {
42        $section_id     = 'jetpack_search';
43        $setting_prefix = Options::OPTION_PREFIX;
44
45        $wp_customize->add_section(
46            $section_id,
47            array(
48                /** "Search" is a product name, do not translate. */
49                'title'      => 'Jetpack Search',
50                'capability' => 'edit_theme_options',
51                'priority'   => 200,
52            )
53        );
54
55        $id = $setting_prefix . 'color_theme';
56        $wp_customize->add_setting(
57            $id,
58            array(
59                'default'   => 'light',
60                'transport' => 'postMessage',
61                'type'      => 'option',
62            )
63        );
64        $wp_customize->add_control(
65            $id,
66            array(
67                'label'       => __( 'Theme', 'jetpack-search-pkg' ),
68                'description' => __( 'Select a theme for your search overlay.', 'jetpack-search-pkg' ),
69                'section'     => $section_id,
70                'type'        => 'radio',
71                'choices'     => array(
72                    'light' => __( 'Light', 'jetpack-search-pkg' ),
73                    'dark'  => __( 'Dark', 'jetpack-search-pkg' ),
74                ),
75            )
76        );
77
78        $id = $setting_prefix . 'result_format';
79        $wp_customize->add_setting(
80            $id,
81            array(
82                'default'   => 'minimal',
83                'transport' => 'postMessage',
84                'type'      => 'option',
85            )
86        );
87        $wp_customize->add_control(
88            $id,
89            array(
90                'label'       => __( 'Result Format', 'jetpack-search-pkg' ),
91                'description' => __( 'Choose how the search results look.', 'jetpack-search-pkg' ),
92                'section'     => $section_id,
93                'type'        => 'select',
94                'choices'     => array(
95                    'minimal'  => __( 'Minimal', 'jetpack-search-pkg' ),
96                    'expanded' => __( 'Expanded (shows images)', 'jetpack-search-pkg' ),
97                    'product'  => __( 'Product (for WooCommerce stores)', 'jetpack-search-pkg' ),
98                ),
99            )
100        );
101
102        $id = $setting_prefix . 'default_sort';
103        $wp_customize->add_setting(
104            $id,
105            array(
106                'default' => 'relevance',
107                'type'    => 'option',
108            )
109        );
110        $wp_customize->add_control(
111            $id,
112            array(
113                'choices'     => array(
114                    'relevance'   => __( 'Relevance (recommended)', 'jetpack-search-pkg' ),
115                    'newest'      => __( 'Newest first', 'jetpack-search-pkg' ),
116                    'oldest'      => __( 'Oldest first', 'jetpack-search-pkg' ),
117                    'rating_desc' => __( 'Product rating', 'jetpack-search-pkg' ),
118                    'price_asc'   => __( 'Price: low to high', 'jetpack-search-pkg' ),
119                    'price_desc'  => __( 'Price: high to low', 'jetpack-search-pkg' ),
120                ),
121                'description' => __( 'Pick the initial sort for your search results.', 'jetpack-search-pkg' ),
122                'label'       => __( 'Default Sort', 'jetpack-search-pkg' ),
123                'section'     => $section_id,
124                'type'        => 'select',
125            )
126        );
127
128        $id = $setting_prefix . 'overlay_trigger';
129        $wp_customize->add_setting(
130            $id,
131            array(
132                'default'   => Options::DEFAULT_OVERLAY_TRIGGER,
133                'transport' => 'postMessage',
134                'type'      => 'option',
135            )
136        );
137        $wp_customize->add_control(
138            $id,
139            array(
140                'label'       => __( 'Search Input Overlay Trigger', 'jetpack-search-pkg' ),
141                'description' => __( 'Select when your overlay should appear.', 'jetpack-search-pkg' ),
142                'section'     => $section_id,
143                'type'        => 'select',
144                'choices'     => array(
145                    Options::OVERLAY_TRIGGER_SUBMIT    => __( 'Open when user submits the form (recommended)', 'jetpack-search-pkg' ),
146                    Options::OVERLAY_TRIGGER_IMMEDIATE => __( 'Open when user starts typing', 'jetpack-search-pkg' ),
147                ),
148            )
149        );
150
151        $id = $setting_prefix . 'filtering_opens_overlay_settings';
152        $wp_customize->add_setting(
153            $id,
154            array( 'type' => 'option' )
155        );
156        $wp_customize->add_control(
157            new Label_Control(
158                $wp_customize,
159                $id,
160                array(
161                    'label'       => __( 'Filtering Search Overlay', 'jetpack-search-pkg' ),
162                    'description' => __( 'Open overlay when filters are used outside the Jetpack Sidebar', 'jetpack-search-pkg' ),
163                    'section'     => $section_id,
164                )
165            )
166        );
167
168        $id = $setting_prefix . 'filtering_opens_overlay';
169        $wp_customize->add_setting(
170            $id,
171            array(
172                'default'              => '1',
173                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
174                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
175                'transport'            => 'postMessage',
176                'type'                 => 'option',
177            )
178        );
179        $wp_customize->add_control(
180            $id,
181            array(
182                'type'    => 'checkbox',
183                'section' => $section_id,
184                'label'   => __( 'Open overlay from filter links', 'jetpack-search-pkg' ),
185            )
186        );
187
188        $id = $setting_prefix . 'excluded_post_types';
189        $wp_customize->add_setting(
190            $id,
191            array(
192                'default' => '',
193                'type'    => 'option',
194            )
195        );
196        $wp_customize->add_control(
197            new Excluded_Post_Types_Control(
198                $wp_customize,
199                $id,
200                array(
201                    'description' => __( 'Choose post types to exclude from search results. You must leave at least one post type unchecked.', 'jetpack-search-pkg' ),
202                    'label'       => __( 'Excluded Post Types', 'jetpack-search-pkg' ),
203                    'section'     => $section_id,
204                )
205            )
206        );
207
208        $id = $setting_prefix . 'highlight_color';
209        $wp_customize->add_setting(
210            $id,
211            array(
212                'default'   => '#FFC',
213                'transport' => 'postMessage',
214                'type'      => 'option',
215            )
216        );
217        $wp_customize->add_control(
218            new WP_Customize_Color_Control(
219                $wp_customize,
220                $id,
221                array(
222                    'label'       => __( 'Highlight Search Terms', 'jetpack-search-pkg' ),
223                    'description' => __( 'Choose a color to highlight matching search terms.', 'jetpack-search-pkg' ),
224                    'section'     => $section_id,
225                )
226            )
227        );
228
229        $id = $setting_prefix . 'additional_settings_placeholder';
230        $wp_customize->add_setting(
231            $id,
232            array( 'type' => 'option' )
233        );
234        $wp_customize->add_control(
235            new Label_Control(
236                $wp_customize,
237                $id,
238                array(
239                    'label'   => __( 'Additional Jetpack Search Settings', 'jetpack-search-pkg' ),
240                    'section' => $section_id,
241                )
242            )
243        );
244
245        $id = $setting_prefix . 'enable_sort';
246        $wp_customize->add_setting(
247            $id,
248            array(
249                'default'              => '1',
250                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
251                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
252                'transport'            => 'postMessage',
253                'type'                 => 'option',
254            )
255        );
256        $wp_customize->add_control(
257            $id,
258            array(
259                'label'   => __( 'Show sort selector', 'jetpack-search-pkg' ),
260                'section' => $section_id,
261                'type'    => 'checkbox',
262            )
263        );
264
265        $id = $setting_prefix . 'inf_scroll';
266        $wp_customize->add_setting(
267            $id,
268            array(
269                'default'              => '1',
270                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
271                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
272                'transport'            => 'postMessage',
273                'type'                 => 'option',
274            )
275        );
276        $wp_customize->add_control(
277            $id,
278            array(
279                'type'    => 'checkbox',
280                'section' => $section_id,
281                'label'   => __( 'Enable infinite scrolling', 'jetpack-search-pkg' ),
282            )
283        );
284
285        $id = $setting_prefix . 'show_post_date';
286        $wp_customize->add_setting(
287            $id,
288            array(
289                'default'              => '1',
290                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
291                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
292                'transport'            => 'postMessage',
293                'type'                 => 'option',
294            )
295        );
296        $wp_customize->add_control(
297            $id,
298            array(
299                'type'    => 'checkbox',
300                'section' => $section_id,
301                'label'   => __( 'Show post date', 'jetpack-search-pkg' ),
302            )
303        );
304
305        $id = $setting_prefix . 'show_product_price';
306        $wp_customize->add_setting(
307            $id,
308            array(
309                'default'              => '1',
310                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
311                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
312                'transport'            => 'postMessage',
313                'type'                 => 'option',
314            )
315        );
316        $wp_customize->add_control(
317            $id,
318            array(
319                'type'    => 'checkbox',
320                'section' => $section_id,
321                'label'   => __( 'Show price', 'jetpack-search-pkg' ),
322            )
323        );
324
325        $id = $setting_prefix . 'show_powered_by';
326        $wp_customize->add_setting(
327            $id,
328            array(
329                'default'              => '1',
330                'sanitize_callback'    => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value' ),
331                'sanitize_js_callback' => array( 'Automattic\Jetpack\Search\Helper', 'sanitize_checkbox_value_for_js' ),
332                'transport'            => 'postMessage',
333                'type'                 => 'option',
334            )
335        );
336
337        if ( ! $this->plan->is_free_plan() ) {
338            $wp_customize->add_control(
339                $id,
340                array(
341                    'type'    => 'checkbox',
342                    'section' => $section_id,
343                    'label'   => __( 'Display "Powered by Jetpack"', 'jetpack-search-pkg' ),
344                )
345            );
346        }
347    }
348
349    /**
350     * Enqueue assets for Customizer controls.
351     */
352    public function customize_controls_enqueue_scripts() {
353        Assets::register_script(
354            'jetpack-instant-search-customizer',
355            'customize-controls/customize-controls.js',
356            __FILE__,
357            array(
358                'css_path'     => 'customize-controls/customize-controls.css',
359                'dependencies' => array( 'customize-controls' ),
360                'in_footer'    => true,
361                'textdomain'   => 'jetpack-search-pkg',
362            )
363        );
364        Assets::enqueue_script( 'jetpack-instant-search-customizer' );
365    }
366}