Forum Replies Created

Viewing 3 replies - 1 through 3 (of 3 total)
  • Hi there,

    In case this helps anyone else, I just tweaked the php file to make the output horizontal (for the taxonomies part only although everything is within a table), as I couldn’t make it with CSS (I know it’s not good practice but I just couldn’t make it work in a different way). As a warning: try it at your own risk. I’m not fluent in either so I did my best! But it does work for me. Here’s the code (paste the whole instead of what you’ll find in facetious/template.php):

    <?php
    
    /**
     * The main template function for outputting a Facetious search form.
     * MasterSeamstress: MODIFIED THE TAXONOMY SECTION TO HAVE A HORIZONTAL BAR
     * @param $args array Arguments for this form
     * @return string The markup for the form
     * @author John Blackbourn
     **/
    function facetious( $args = array() ) {
    
    	$args = wp_parse_args( $args, array(
    		'fields' => array(
    			's'
    		),
    		'submit' => __( 'Go', 'facetious' ),
    		'echo'   => true,
    		'class'  => 'facetious_form',
    		'id'     => 'facetious_form',
    	) );
    
    	$out = '';
    
    	$out .= '<form action="' . home_url( '/' ) . '" class="' . esc_attr( $args['class'] ) . '"';
    
    	if ( $args['id'] )
    		$out .= ' id="' . esc_attr( $args['id'] ) . '"';
    
    	$out .= '>';
    
    	if ( isset( $args['post_type'] ) and( '-1' !== $args['post_type'] ) and ! isset( $args['post_type'][ 'pt' ] ) )
    		$out .= sprintf( '<input type="hidden" name="facetious_post_type" value="%s" />', esc_attr( reset( $args['post_type'] ) ) );
    
    	$out .= '<table><tr>';
    
    	foreach ( $args['fields'] as $key => $val ) {
    
    		if ( is_numeric( $key ) ) {
    			$key = $val;
    			$val = true;
    		}
    
    		if ( !is_array( $val ) ) {
    			$val = array(
    				'label' => $val
    			);
    		}
    
    		# Switch depending on what we're asking for.
    		# Currently everything that's not 's' or 'm' is treated as a taxonomy.
    		switch ( $key ) {
    
    			# Keyword search input:
    			case 's':
    
    				if ( empty( $val['label'] ) or ( true === $val['label'] ) )
    					$val['label'] = __( 'Search by keyword', 'facetious' );
    				if ( !isset( $val['class'] ) )
    					$val['class'] = 'facetious_input facetious_input_search';
    				if ( !isset( $val['id'] ) )
    					$val['id'] = 'facetious_input_search';
    
    				$out .= sprintf( '<p class="%s">', 'facetious_search' );
    				$out .= sprintf( '<label for="%1$s">%2$s</label>',
    					esc_attr( $val['id'] ),
    					$val['label']
    				);
    				$out .= sprintf( '<input type="text" name="s" value="%1$s" class="%2$s" id="%3$s" />',
    					esc_attr( get_search_query( false ) ),
    					esc_attr( $val['class'] ),
    					esc_attr( $val['id'] )
    				);
    				$out .= '</p>';
    
    				break;
    
    			# Post type dropdown:
    			case 'pt':
    
    				$post_types = array();
    				if ( isset( $val[ 'options' ] ) ) {
    					if ( ! is_array( $val[ 'options' ] ) )
    						$val[ 'options' ] = (array) $val[ 'options' ];
    					foreach ( $val[ 'options' ] as $pt ) {
    						if ( is_object( $pto = get_post_type_object( $pt ) ) )
    							$post_types[ $pt ] = $pto;
    					}
    				} else {
    					$post_type_names = get_post_types( array( 'public' => true ) );
    					foreach ( $post_type_names as $pt ) {
    						if ( is_object( $pto = get_post_type_object( $pt ) ) )
    							$post_types[ $pt ] = $pto;
    					}
    				}
    
    				if ( empty( $post_types ) )
    					continue;
    
    				if ( empty( $val['label'] ) or ( true === $val['label'] ) )
    					$val['label'] = __( 'Filter by type', 'facetious' );
    				if ( !isset( $val['class'] ) )
    					$val['class'] = 'facetious_filter facetious_filter_post_type';
    				if ( !isset( $val['id'] ) )
    					$val['id'] = 'facetious_filter_post_type';
    				if ( !isset( $val['all'] ) )
    					$val['all'] = __( 'All types', 'facetious' );
    
    				$out .= sprintf( '<p class="%s">', 'facetious_post_type' );
    				$out .= sprintf( '<label for="%1$s">%2$s</label>',
    					esc_attr( $val['id'] ),
    					$val['label']
    				);
    				$out .= sprintf( '<select name="facetious_post_type" class="%1$s" id="%2$s" />',
    					esc_attr( $val['class'] ),
    					esc_attr( $val['id'] )
    				);
    				$out .= sprintf( '<option value="">%s</option>',
    					esc_html( $val['all'] )
    				);
    				foreach ( $post_types as $pt => $pto ) {
    					$out .= sprintf( '<option value="%s"%s>%s</option>',
    						esc_attr( $pt ),
    						selected( $pt, get_query_var( 'post_type' ), false ),
    						esc_html( $pto->labels->name )
    					);
    				}
    				$out .= '</select>';
    				$out .= '</p>';
    
    				break;
    
    			# Month dropdown:
    			case 'm':
    
    				$months = facetious_get_available_months();
    
    				if ( empty( $months ) )
    					continue;
    
    				if ( empty( $val['label'] ) or ( true === $val['label'] ) )
    					$val['label'] = __( 'Month', 'facetious' );
    				if ( !isset( $val['class'] ) )
    					$val['class'] = 'facetious_filter facetious_filter_month';
    				if ( !isset( $val['id'] ) )
    					$val['id'] = 'facetious_filter_month';
    				if ( !isset( $val['all'] ) )
    					$val['all'] = __( 'Any Month', 'facetious' );
    
    				$out .= sprintf( '<p class="%s">', 'facetious_month' );
    				$out .= sprintf( '<label for="%1$s">%2$s</label>',
    					esc_attr( $val['id'] ),
    					$val['label']
    				);
    				$out .= sprintf( '<select name="m" class="%1$s" id="%2$s" />',
    					esc_attr( $val['class'] ),
    					esc_attr( $val['id'] )
    				);
    				$out .= sprintf( '<option value="">%s</option>',
    					esc_html( $val['all'] )
    				);
    				foreach ( $months as $month_key => $month_val ) {
    					$out .= sprintf( '<option value="%s"%s>%s</option>',
    						esc_attr( $month_key ),
    						selected( $month_key, get_query_var( 'm' ), false ),
    						esc_html( $month_val )
    					);
    				}
    				$out .= '</select>';
    				$out .= '</p>';
    
    				break;
    
    			# Taxonomy dropdown:
    			default:
    
    				$tax = get_taxonomy( $key );
    
    				if ( empty( $tax ) )
    					continue;
    
    				if ( !isset( $val['options'] ) ) {
    
    					$terms = get_terms( $key, array(
    						'hide_empty' => false
    					) );
    
    					if ( empty( $terms ) )
    						continue;
    
    					foreach ( $terms as $term )
    						$val['options'][$term->slug] = $term->name;
    
    				}
    
    				if ( empty( $val['label'] ) or ( true === $val['label'] ) )
    					$val['label'] = $tax->labels->singular_name;
    				if ( !isset( $val['class'] ) )
    					$val['class'] = sprintf( 'facetious_filter facetious_filter_%s', $tax->name );
    				if ( !isset( $val['id'] ) )
    					$val['id'] = sprintf( 'facetious_filter_%s', $tax->name );
    				if ( !isset( $val['all'] ) )
    					$val['all'] = $tax->labels->all_items;
    
    				$out .= sprintf( '<td class="facetious_%s">', $tax->name );
    				$out .= sprintf( '<label for="%1$s">%2$s</label>',
    					esc_attr( $val['id'] ),
    					$val['label']
    				);
    
    				$out .= sprintf( '<select name="%1$s" class="%2$s" id="%3$s" />',
    					$tax->query_var,
    					esc_attr( $val['class'] ),
    					esc_attr( $val['id'] )
    				);
    				$out .= sprintf( '<option value="">%s</option>',
    					esc_html( $val['all'] )
    				);
    				foreach ( $val['options'] as $value => $label ) {
    					$out .= sprintf( '<option value="%s"%s>%s</option>',
    						esc_attr( $value ),
    						selected( $value, get_query_var( $tax->query_var ), false ),
    						esc_html( $label )
    					);
    				}
    				$out .= '</select>';
    				$out .= '</td>';
    
    				break;
    
    		}
    
    	}
    	$out .= '</tr></table>';
    	$out .= '<p class="facetious_submit">';
    	$out .= sprintf( '<input type="submit" value="%s" class="facetious_submit_button" />', esc_attr( $args['submit'] ) );
    	$out .= '</p>';
    
    	$out .= '</form>';
    
    	if ( $args['echo'] )
    		echo $out;
    
    	return $out;
    
    }
    
    /**
     * Helper function for retrieving a list of populated months for a given post type
     *
     * @param $post_type string An optional post type to restrict the query to
     * @return array The populated months
     * @author John Blackbourn
     **/
    function facetious_get_available_months( $post_type = null ) {
    
    	global $wpdb, $wp_locale;
    
    	if ( $post_type )
    		$where = $wpdb->prepare( 'WHERE post_type = %s', $post_type );
    	else
    		$where = '';
    
    	$months = $wpdb->get_results( "
    		SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
    		FROM {$wpdb->posts}
    		{$where}
    		ORDER BY post_date DESC
    	" );
    
    	$month_count = count( $months );
    
    	if ( !$month_count )
    		return array();
    	if ( ( 1 == $month_count ) and ( 0 == $months[0]->month ) )
    		return array();
    
    	$available_months = array();
    
    	foreach ( $months as $arc_row ) {
    
    		if ( 0 == $arc_row->year )
    			continue;
    
    		$month = zeroise( $arc_row->month, 2 );
    
    		# @TODO _x() this:
    		$available_months[$arc_row->year . $month] = sprintf( __( '%1$s %2$d', 'facetious' ),
    			$wp_locale->get_month( $month ),
    			$arc_row->year
    		);
    
    	}
    
    	return $available_months;
    
    }
    
    /**
     * Is the existing query a Facetious query?
     *
     * @return bool True if true, natch
     * @author
     **/
    function is_facetious() {
    	return isset( $GLOBALS['wp_query']->query_vars[ 'facetious' ] );
    }
    
    /**
     * Returns a Facetious URL from a WP_Query::query_vars like array
     * of parameters.
     *
     * Note that this function assumes the site is using pretty permalinks.
     *
     * @param array $query A WP_Query::query like array of parameters
     * @return string A Facetious format URL
     * @author Simon Wheatley
     **/
    function get_facetious_url( $query ) {
    	$facetious = Facetious::init();
    	if ( isset( $query[ 'post_type' ] ) )
    		$query[ 'facetious_post_type' ] = $query[ 'post_type' ];
    	return $facetious->construct_query_url( $query );
    }
    
    /**
     * Echoes a Facetious URL from a WP_Query::query_vars like array
     * of parameters.
     *
     * @param array $query A WP_Query::query like array of parameters
     * @return void (echoes)
     * @author Simon Wheatley
     **/
    function facetious_url( $query ) {
    	echo esc_url( get_facetious_url( $query ) );
    }

    Thanks! By the way, awesome plugin!

    Hi there,

    I’ve installed this plugin to embed widgets into posts/pages and it works like a charm! You just put a shortcode to the widget on your post/page ([do_widget “Facetious Search”] for Facetious) and you’re done.

    https://www.ads-software.com/plugins/amr-shortcode-any-widget/

    good luck ??

Viewing 3 replies - 1 through 3 (of 3 total)