get_filters(); } if ( is_null( $post_types ) ) { $post_types = get_post_types( array( 'exclude_from_search' => false ) ); } /** * If the post types specified by the widget differ from the default set of searchable post types, * then we need to track their state. */ $active_post_types = array(); if ( Jetpack_Search_Helpers::post_types_differ_searchable( $post_types ) ) { // get the active filter buckets from the query $active_buckets = Jetpack_Search::instance()->get_active_filter_buckets(); $post_types_differ_query = Jetpack_Search_Helpers::post_types_differ_query( $post_types ); // remove any post_type filters from display if the current query // already specifies to match all post types if ( ! $post_types_differ_query ) { $active_buckets = array_filter( $active_buckets, array( __CLASS__, 'is_not_post_type_filter' ) ); } $active_post_types = Jetpack_Search_Helpers::get_active_post_types( $active_buckets ); if ( empty( $active_post_types ) ) { $active_post_types = $post_types; } if ( $post_types_differ_query ) { $filters = Jetpack_Search_Helpers::ensure_post_types_on_remove_url( $filters, $post_types ); } else { $filters = Jetpack_Search_Helpers::remove_active_from_post_type_buckets( $filters ); } } else { $post_types = array(); } foreach ( (array) $filters as $filter ) { if ( 'post_type' == $filter['type'] ) { self::render_filter( $filter, $post_types ); } else { self::render_filter( $filter, $active_post_types ); } } } /** * Renders a single filter that can be applied to the current search. * * @since 5.8.0 * * @param array $filter The filter to render. * @param array $default_post_types The default post types for this filter. */ public static function render_filter( $filter, $default_post_types ) { if ( empty( $filter ) || empty( $filter['buckets'] ) ) { return; } $query_vars = null; foreach ( $filter['buckets'] as $item ) { if ( $item['active'] ) { $query_vars = array_keys( $item['query_vars'] ); break; } } $clear_url = null; if ( ! empty( $query_vars ) ) { $clear_url = Jetpack_Search_Helpers::remove_query_arg( $query_vars ); if ( ! empty( $default_post_types ) ) { $clear_url = Jetpack_Search_Helpers::add_post_types_to_url( $clear_url, $default_post_types ); } } ?>

$orderby, 'order' => $order ); // If the widget has specified post types to search within and IF the post types differ // from the default post types that would have been searched, set the selected post // types via hidden inputs. if ( Jetpack_Search_Helpers::post_types_differ_searchable( $post_types ) ) { $fields_to_inject['post_type'] = implode( ',', $post_types ); } $form = self::inject_hidden_form_fields( $form, $fields_to_inject ); echo '
'; echo $form; echo '
'; } /** * Modifies an HTML form to add some additional hidden fields. * * @since 5.8.0 * * @param string $form The form HTML to modify. * @param array $fields Array of hidden fields to add. Key is field name and value is the field value. * * @return string The modified form HTML. */ private static function inject_hidden_form_fields( $form, $fields ) { $form_injection = ''; foreach ( $fields as $field_name => $field_value ) { $form_injection .= sprintf( '', esc_attr( $field_name ), esc_attr( $field_value ) ); } // This shouldn't need to be escaped since we've escaped above as we built $form_injection $form = str_replace( '', $form_injection . '', $form ); return $form; } /** * Internal method for filtering out non-post_type filters. * * @since 5.8.0 * * @param array $filter * * @return bool */ private static function is_not_post_type_filter( $filter ) { return 'post_type' !== $filter['type']; } }