Support Forums

The forums are closed and will be removed when we launch our new site.

Looking for support? You can access the support system via your account.

Forums Forums Search Search Results for 'sf_input_object_pre function order'

Viewing 10 results - 11 through 20 (of 20 total)
  • Author
    Search Results
  • #260342

    Trevor
    Moderator

    You can use this filter in your child theme’s functions.php file:

    https://searchandfilter.com/documentation/action-filter-reference/#filter-input-object

    To re-order the terms in that field.

    I am not sure if it will help, but if there are any snippets already in the forum, this forum search should find them:

    https://support.searchandfilter.com/forums/search/sf_input_object_pre+function+order/

    #259039

    Trevor
    Moderator

    What order would you like, or would it be entirely custom?

    You may need to use this filter and your own custom code to do this:

    https://searchandfilter.com/documentation/action-filter-reference/#filter-input-object

    There are many snippets of code in this forum that use this filter. This forum search should show some of these:

    https://support.searchandfilter.com/forums/search/function+sf_input_object_pre/

    #236336

    Cassie
    Participant

    Thank you again Trevor, although in my case, the value actually does exist in the post data. Perhaps it would help if I gave a more specific example of what I am trying to do ie.

    Option group: Shop, event or both
    Select: Country

    Unfortunately countries are stored as a numerical ID in my postmeta which is why I want to use add_filter to change the label for each of them. For now, the code below attempts to change the label for just one country ie. 13 = Austria.

    Page loads correctly initially and shows all post types for all countries
    If I select one post type plus a country, search results work fine.
    If I select both post types, no results are shown.
    If I try to Reset the form, no results are shown.

    I just cannot understand what the add_filter is doing (or attempting to do) in order to cause such results.

    
    function filter_input_object2($input_object, $sfid)
    {
    	 
    	if(($input_object['name']!='_sfm_country_id')||($input_object['type']!='select'))
    	{
    		return $input_object;
    	}
    	
    	
    	if(!isset($input_object['options']))
    	{
    		return $input_object;
    	}
    	
    	
    	foreach($input_object['options'] as $option)
    	{
    		if($option->value=="13")
    		{
    			$option->label = "Austria";
    		}
    		
    	}
    		
    	return $input_object;
    }
    
    add_filter('sf_input_object_pre', 'filter_input_object2', 10, 2);

    Note: yes I am aware there are ways of entering the postmeta labels manually and it seems that may be my only option but was reluctant to resort to this as it wouldn’t automatically handle new countries as/when they are added.

    #224032

    Keith White
    Participant

    Trevor,

    Thanks for all your help. I was able to find some code and have adapted it to work the way we need. It’s below incase you need it for anyone else

    function filter_function_name($input_object, $sfid) {
    
            if ($input_object['name'] == '_sfm_attorneys') {
    
    		global $coauthors_plus;
    			
    		// Update option labels before rendering
    
    			foreach($input_object['options'] as $key => $option) {
    
    						$my_query = new WP_Query( array( 'post_type' => 'attorney', 'p' => $option->value));
    						while ($my_query->have_posts()) : $my_query->the_post();
    							$att_first = types_render_field("att_first", array());
    							$att_last = types_render_field("att_last", array());
    
    							$input_object['options'][$key]->label = $att_last . ', ' . $att_first;
    				
    						endwhile;
    
    	        	}
    
    	        	// Sort options...
    
    	        		$sortArray = array(); 
    
    	        		foreach($input_object['options'] as $option) { 
    
    				    foreach($option as $key => $value) { 
    
    				        if(!isset($sortArray[$key])) { 
    
    				            $sortArray[$key] = array(); 
    
    				        } 
    
    				        $sortArray[$key][] = $value; 
    
    				    }
    
    				}
    
    				// ...by label
    
    	        		$orderby = "label";
    
    				array_multisort($sortArray[$orderby],SORT_ASC,$input_object['options']); 
    
    	}
    		
    		// Return
    
    			return $input_object;
    
    	}
    
    	add_filter('sf_input_object_pre', 'filter_function_name', 10, 2);
    #223973

    Keith White
    Participant

    Trevor,

    Thanks for the link. I’ve been able to add a function and it’s now displaying the Attorneys in the correct order but how do I get it to hide the attorneys without a post like it does by default? Right now it’s displaying all attorneys even if there’s no news associated to the attorney,

    function sf_edit_author_field_order($input_object, $sfid)
    {
    	if( $input_object['name'] == '_sfm_attorneys' ) {
            // requery the author list
            $my_query = new WP_Query( array( 'post_type' => 'attorney', 'meta_key' => 'wpcf-att_last', 'orderby' => 'meta_value', 'order' => 'ASC', 'showposts' => -1));
    		while ($my_query->have_posts()) : $my_query->the_post();
    		$att_first = types_render_field("att_first", array());
    		$att_last = types_render_field("att_last", array());
    		$theid = get_the_ID();
            // go through users and get their user_nicename and display_name
            //foreach( $my_query as $user ) {
                $new_users[] = (object) array(
                    'attributes' => array(
                        'class' => 'sf-level-0'
                    ),
                    'value' => $theid,
                    'label' => $att_last . ', ' . $att_first,
                    'count' => 1
                );
            endwhile;
            $input_object['options'] = $new_users;
    	}
    	
    	return $input_object;
    }
    add_filter('sf_input_object_pre', 'sf_edit_author_field_order', 10, 2);
    #222767

    Aaron Crootof
    Participant

    The Problem: I need to load an author dropdown on the filter with just the Editors

    I have a Filter for my site, with several fields, one of them is Author, but the website has more than 15.000 users registered and get a timeout error every time the field is enabled.

    I’ve tried this to re write the author field with a more manageable amount of users (only the Editors) but with no luck the idea was to remove all content from _sf_author and replace it with the editors

    `
    function filter_authors($input_object, $sfid)
    {
    if (($input_object[‘name’] != ‘_sf_author’) || ($input_object[‘type’] != ‘select’)) {
    return $input_object;
    }

    unset($input_object[‘options’]);
    $input_object[‘options’] = array();

    // Generate first array option (default)
    $first_option = new StdClass();
    $first_option->value = ”;
    $first_option->label = ‘All Authors’;

    //attributes
    $first_option->attributes = array(
    ‘title’ => ‘All Authors’,
    );

    array_push($input_object[‘options’], $first_option);

    //change classes & attributes of the field
    $input_object[‘attributes’][‘class’] = ‘user_filter’;
    $input_object[‘attributes’][‘title’] = ‘Authors’;

    //add/override prefix & postfix to the field
    $input_object[‘prefix’] = “Filter by Author”;

    //Check if options variable exists
    if (!isset($input_object[‘options’])) {
    return $input_object;
    }

    //Create new users array
    $args = array(
    ‘role’ => ‘editor’,
    ‘order’ => ‘ASC’,
    ‘orderby’ => ‘display_name’,
    );

    // Create the WP_User_Query object
    $wp_user_query = new WP_User_Query($args);
    $authors = $wp_user_query->get_results();
    foreach ($authors as $author) {
    // get all the user’s data
    $author_info = get_userdata($author->ID);
    //create new options with user values
    $new_option = new StdClass();
    $new_option->value = $author_info->user_login;
    $new_option->label = $author_info->first_name . ‘ ‘ . $author_info->last_name;

    //attributes
    $new_option->attributes = array(
    ‘title’ => $author_info->user_login,
    );
    array_push($input_object[‘options’], $new_option);
    }
    return $input_object;
    }
    // add_filter(‘sf_input_object_pre’, ‘filter_authors’, 10, 2);
    `
    Using this approach i change a meta field and filled it with the Editors data, but then the post request was send as _sfm_editors and not _sf_author and i couldn’t find a way to replace this request for the one i needed.

    Also tried building my own query accessing the search data and using the hook sf_results_url to change the url, but i cannot change the search query with it.

    I’m running out of ideas, appreciate your time to check my issue and any new ideas on how to solve it.

    #206964

    dpolonsky
    Participant
    This reply has been marked as private.

    Mitchel van Eijgen
    Participant

    @Trevor I think I am explaining it wrong. I am not looking to change to order of the posts, I want to change the order of a specific S&F filter that I created using the S&F admin tools which is a list of checkboxes.

    This is what the field in S&F looks like

    And here is the filter on the front end of my site

    With CSS I already add icons for each item in the filter and that is the correct order. Now I need to hook in to the filter and change the order so that it is the same as in my admin, but I have no idea how to do that.

    I think I need the sf_input_object_pre filter and I already have this code

    function filter_function_name($input_object, $sfid) {
    
      if($input_object['name'] == '_sfm_category') {
        $input_object['attributes']['class'] = 'my-test-class';
        return $input_object;
      }
      return $input_object;
    }
    add_filter('sf_input_object_pre', __NAMESPACE__ . '\\filter_function_name', 10, 2);

    It took me an hour to figure out how I would get this name _sfm_category from my field category. It would be great if you could edit the docs and tell there

    If you are looking for your specific $input_object['name'] open your web inspector and look for the data attribute data-sf-field-name="_sfm_YOUR-FIELD-NAME"

    #152293

    Jason Lawton
    Participant

    OK Here it is. I needed to show the author name by last, first, and sometimes the username by last,first. So I have a hook (which yes, you put in functions.php) and I check the form id and the field we’re outputting, and process it based on what the values are.

    If we’re looking at the author field, i basically requery the entire author list, and regenerate the list completely. You can see I exclude some authors (like admin, and some other random people i didn’t want in the list)

    If it’s the user field, i do a loop and requery the user and then adjust the info.

    I think i wrote the two if statements at different times, because the second way could probably be applied to the first. Whatever, it works.

    function sf_edit_author_field_order($input_object, $sfid)
    {
    	if( in_array( $sfid, array( 3390, 3444, 3562 ) ) && $input_object['name'] == '_sf_author' ) {
            // requery the author list
            $author_args = array(
                'exclude_admin' => true,
                'hide_empty' => true,
                'meta_key' => 'last_name',
                'orderby' => 'meta_value',
                'order' => 'ASC',
                'exclude' => array( 429, 233, 558, 7 )
            );
            $user_query = new WP_User_Query( $author_args );
            $users = $user_query->get_results();
            $new_users = array();
            $new_users[] = (object) array(
                'label' => 'All Authors',
                'attributes' => array (
                    'class' => 'sf-level-0 sf-item-0'
                ),
                'value' => '',
                'count' => 0
            );
            // go through users and get their user_nicename and display_name
            foreach( $users as $user ) {
                $new_users[] = (object) array(
                    'attributes' => array(
                        'class' => 'sf-level-0'
                    ),
                    'value' => $user->user_nicename,
                    'label' => $user->last_name . ', ' . $user->first_name,
                    'count' => 1
                );
            }
            $input_object['options'] = $new_users;
    	} else if ( $sfid == 3444 && $input_object['name'] == '_sft_userlist' ) {
            // requery the tagged user list to get their names - last, first
            // go through the options part of the object and get the user id, and then the meta info for that
            foreach ($input_object['options'] as $option) {
                // get the user id from the term meta
                $temp_term = get_term_by( 'slug', $option->value, 'userlist');
                $temp_term->meta_user_id = get_term_meta( $temp_term->term_id, 'user_id', true );
                $last_name = get_user_meta( $temp_term->meta_user_id, 'last_name', true );
                $first_name = get_user_meta( $temp_term->meta_user_id, 'first_name', true );
                // overwrite the original label
                if ( $last_name && $first_name ) {
                    $option->label = $last_name . ', ' . $first_name;
                }
            }
        }
    	
    	return $input_object;
    }
    add_filter('sf_input_object_pre', 'sf_edit_author_field_order', 10, 2);
    #50568

    Jon Watson
    Participant

    Hey Davide!

    Sorry for the delay – hectic couple of weeks.

    Try this:

    // Relabel Co-Authors in Search & Filter
    
    	function filter_function_name($input_object, $sfid) {
    
    		if ($input_object['name'] == '_sft_author') {
    
    			global $coauthors_plus;
    			
    			// Update option labels before rendering
    
    				foreach($input_object['options'] as $key => $option) {
    
    					// Rename "all items" label - this is always the option with no value
    
    					if($option->value=="") {
    
    							$option->label = "All Authors";
    
    						}
    
    					else {
    
    						$user = $coauthors_plus->get_coauthor_by( 'user_nicename', $option->value );
    
    						$input_object['options'][$key]->label = $user->last_name . ', ' . $user->first_name . ' ' . ' (' . $option->count . ')';
    
    	    			}
    
    	        	}
    
    	        	$sortArray = array(); 
    
    	        	foreach($input_object['options'] as $option) { 
    
    				    foreach($option as $key => $value) { 
    
    				        if(!isset($sortArray[$key])) { 
    
    				            $sortArray[$key] = array(); 
    
    				        } 
    
    				        $sortArray[$key][] = $value; 
    
    				    }
    
    				}
    
    	        	$orderby = "label";
    
    				array_multisort($sortArray[$orderby],SORT_ASC,$input_object['options']); 
    
    		}
    		
    		// Return
    
    			return $input_object;
    
    	}
    
    	add_filter('sf_input_object_pre', 'filter_function_name', 10, 2);
Viewing 10 results - 11 through 20 (of 20 total)