summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/search/customize-controls/class-excluded-post-types-control.php')
-rw-r--r--plugins/jetpack/modules/search/customize-controls/class-excluded-post-types-control.php128
1 files changed, 128 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/search/customize-controls/class-excluded-post-types-control.php b/plugins/jetpack/modules/search/customize-controls/class-excluded-post-types-control.php
new file mode 100644
index 00000000..5b5d0a1f
--- /dev/null
+++ b/plugins/jetpack/modules/search/customize-controls/class-excluded-post-types-control.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * A multi-checkbox Customizer control for use with Jetpack Search configuration
+ *
+ * @package automattic/jetpack
+ * @since 8.8.0
+ */
+
+use Automattic\Jetpack\Search\Helper;
+
+/**
+ * Label Control class.
+ */
+class Excluded_Post_Types_Control extends WP_Customize_Control {
+ /**
+ * Control type.
+ *
+ * @since 8.8.0
+ * @var string
+ */
+ public $type = 'excluded-post-types';
+
+ /**
+ * Enqueue styles related to this control.
+ */
+ public function enqueue() {
+ $style_relative_path = 'modules/search/customize-controls/class-excluded-post-types-control.css';
+ $style_version = Helper::get_asset_version( $style_relative_path );
+ $style_path = plugins_url( $style_relative_path, JETPACK__PLUGIN_FILE );
+ wp_enqueue_style( 'jetpack-instant-search-customizer-excluded-post-types', $style_path, array(), $style_version );
+
+ $script_relative_path = 'modules/search/customize-controls/class-excluded-post-types-control.js';
+ $script_version = Helper::get_asset_version( $script_relative_path );
+ $script_path = plugins_url( $script_relative_path, JETPACK__PLUGIN_FILE );
+ wp_enqueue_script( 'jetpack-instant-search-customizer-excluded-post-types', $script_path, array( 'customize-controls' ), $script_version, true );
+ }
+
+ /**
+ * Checks if the post type has been selected.
+ *
+ * @since 8.8.0
+ * @return array $post_types An array of strings representing post type names.
+ */
+ public function get_arrayed_value() {
+ return explode( ',', $this->value() );
+ }
+
+ /**
+ * Generates a customizer settings ID for a given post type.
+ *
+ * @since 8.8.0
+ * @param object $post_type Post type object returned from get_post_types.
+ * @return string $customizer_id Customizer setting ID.
+ */
+ public function generate_post_type_customizer_id( $post_type ) {
+ return '_customize-post-type-input-' . $post_type->name;
+ }
+
+ /**
+ * Checks if the post type has been selected.
+ *
+ * @since 8.8.0
+ * @param object $post_type Post type object returned from get_post_types.
+ * @return array $ids Post type => post type customizer ID object.
+ */
+ public function is_checked( $post_type ) {
+ return in_array( $post_type->name, $this->get_arrayed_value(), true );
+ }
+
+ /**
+ * Override rendering for custom class name; omit element ID.
+ */
+ protected function render() {
+ $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id );
+ $class = 'customize-control customize-control-excluded-post-types';
+
+ printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) );
+ $this->render_content();
+ echo '</li>';
+ }
+
+ /**
+ * Override content rendering.
+ */
+ protected function render_content() {
+ $post_types = get_post_types( array( 'exclude_from_search' => false ), 'objects' );
+ if ( count( $post_types ) === 0 ) {
+ return;
+ }
+ ?>
+ <label class="customize-control-title">
+ <?php echo esc_html( $this->label ); ?>
+ </label>
+ <?php if ( ! empty( $this->description ) ) : ?>
+ <span class="description customize-control-description">
+ <?php echo esc_html( $this->description ); ?>
+ </span>
+ <?php endif ?>
+ <input
+ class="customize-control-excluded-post-types"
+ id="<?php echo esc_attr( $this->id ); ?>"
+ name="<?php echo esc_attr( $this->id ); ?>"
+ type="hidden"
+ value="<?php echo esc_attr( $this->value() ); ?>"
+ <?php $this->link(); ?>
+ />
+ <?php
+
+ $is_only_one_unchecked = ( count( $post_types ) - 1 ) === count( $this->get_arrayed_value() );
+
+ foreach ( $post_types as $post_type ) {
+ $input_id = Helper::generate_post_type_customizer_id( $post_type );
+ ?>
+ <div class="customize-control-excluded-post-type-checkbox-container">
+ <input
+ class="customize-control-excluded-post-type-checkbox"
+ id="<?php echo esc_attr( $input_id ); ?>"
+ type="checkbox"
+ value="<?php echo esc_attr( $post_type->name ); ?>"
+ <?php checked( $this->is_checked( $post_type ) ); ?>
+ <?php disabled( ! $this->is_checked( $post_type ) && $is_only_one_unchecked ); ?>
+ />
+ <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $post_type->label ); ?></label>
+ </div>
+ <?php
+ }
+ }
+}