AnonymousInactive
Ok nice, this is working:
function filter_function_name($input_object, $sfid)
{
$acf_name = substr($input_object['name'],5);
if(strlen($acf_name)>0)
{
$input_object['attributes']['title'] = get_field_object($acf_name)['instructions'];
}
return $input_object;
}
add_filter('sf_input_object_pre', 'filter_function_name', 10, 2);
It only gives different attribute names based on the field type, for example “title” and “class title” but I wil fix that with JS.
Thanks a lot!
This is coming as an option in the admin area in S&F version 3.
For now you can do it with a PHP filter (add this to your child theme’s functions.php
file):
function sf_remove_first_option($input_object, $sfid){
// ensure we are only filtering the correct field name - in this case the field we want to filter has the name '_sft_post_tag'
if( $input_object['name'] != '_sft_post_tag' ) {
return $input_object;
}
// if we want to filter the options generated, we need to make sure the options variable actually exists before proceeding (its only available to certain field types)
if( ! isset( $input_object['options'] ) ) {
return $input_object;
}
// now we know we have options, remove the first option
array_shift( $input_object['options'] );
return $input_object;
}
add_filter('sf_input_object_pre', 'sf_remove_first_option', 10, 2);
Change _sft_post_tag
for the name of your field.
Thanks
It MIGHT be possible, but only with custom code (I don’t know what this would be though), using this filter:
https://searchandfilter.com/documentation/action-filter-reference/#filter-input-object
In code similar to this (in the child theme functions.php file):
function filter_input_destination($input_object, $sfid)
{
if(($input_object['name']!='_sft_destination')||($input_object['type']!='select'))
{
return $input_object;
}
if(!isset($input_object['options']))
{
return $input_object;
}
// sort the array here, using PHP array_multisort() function.
return $input_object;
}
add_filter('sf_input_object_pre', 'filter_input_destination', 10, 2);
And I would guess make sure it is the correct form ID.
AnonymousInactive
Hello, When implementing a programmatic filter via sf_input_object_pre and $input_object, The auto-count does not seem to update on the other non-modified form fields on the form. The autocount numbers appear to be calculated before the filters on the $input_object have been applied via the sf_input_object_pre filter.
Any ideas how to get the auto count to count afterwards? or to have it refresh the auto count before display?
Thanks!
AnonymousInactive
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.
AnonymousInactive
Hi there
I have search set up which allows the user to search one or both custom post types (ie. shops and events). They can also choose to search by shop category or event category.
I’m using the code below to add an additional option to the event category select box which works fine IF they select Event as the custom post type to search, however, if they don’t specifically select a custom post type to search (ie. are searching on BOTH types) then no results are returned.
Note: I’m using shortcodes to create the page ie.
[searchandfilter id=”13752″]
[searchandfilter id=”13752″ show=”results”]
The page loads fine initially, showing all 600 records, but as soon as I run a search without selecting a post type, no results are found… and even clicking “Reset” the query has no effect.
Any suggestions would be very gratefully received.
function edit_event_categories($input_object, $sfid) {
if(($input_object['name']!='_sft_ecategory')||($input_object['type']!='select'))
{
return $input_object;
}
if(!isset($input_object['options']))
{
return $input_object;
}
//create a new option we want to add
$new_last_option = new StdClass();
$new_last_option->value = "99";
$new_last_option->label = "Weekend";
//add a brand new option to the bottom
array_push($input_object['options'], $new_last_option);
return $input_object;
}
add_filter('sf_input_object_pre', 'edit_event_categories', 10, 2);
AnonymousInactive
We got it working with this code:
function my_plugin_search_filter_change_label($input_object, $sfid) {
if ($sfid == 58513 && $input_object['name'] == '_sf_post_type') {
foreach ($input_object['options'] as $key => $option) {
if ($option->label == 'Posts') {
$input_object['options'][$key]->label = 'Articles';
}
}
}
return $input_object;
}
add_filter('sf_input_object_pre', 'my_plugin_search_filter_change_label', 10, 2);
Hi Patrick
It’s not possible within the UI, but you can use a filter to manually update a fields options (and values):
https://searchandfilter.com/documentation/action-filter-reference/#filter-input-object
I’ve done a test, and here is the code you would need to affect your mileage
field (copy to functions.php
in your child theme):
function update_range_field_mileage($input_object, $sfid)
{
//make sure we affect the '_sfm_mileage' field only
if($input_object['name']=='_sfm_mileage')
{
//udpate this field before rendering
//all the options are stored in <code>$input_object['options']</code> as an array
$new_options = array();
//create a new "default" option
$new_option = new StdClass();
$new_option->value = "";
$new_option->label = "KM Stand";
array_push($new_options, $new_option);
//create a new range option we want to add
$new_option = new StdClass();
$new_option->value = "0+49999"; //this is the value that goes in the URL, which affects the query
$new_option->label = "0 - 49999"; //the label can be anything
array_push($new_options, $new_option);//create a new range option we want to add
$new_option = new StdClass();
$new_option->value = "50000+99999"; //this is the value that goes in the URL, which affects the query
$new_option->label = "50000 - 99999"; //the label can be anything
array_push($new_options, $new_option);
$new_option = new StdClass();
$new_option->value = "100000+150000"; //this is the value that goes in the URL, which affects the query
$new_option->label = "100000 - 150000"; //the label can be anything
array_push($new_options, $new_option);
//now replace the options with our own custom options:
$input_object['options'] = $new_options;
}
return $input_object;
}
add_filter('sf_input_object_pre', 'update_range_field_mileage', 10, 2);
Let me know how you get on.
Thanks
Hi Holly
Happy new year to you 🙂
You should be able to do this using our filter:
https://searchandfilter.com/documentation/action-filter-reference/#filter-input-object
This filter will allow you to modify all of the options (as an array) before its processed, this would be the base level code:
function sf_do_something_with_options($input_object, $sfid){
//change '_sfm_my_field_name' to the name of your field
if($input_object['name']=='_sfm_my_field_name'){
//return, if this field doesn't have an options array
if(!isset($input_object['options'])){
return $input_object;
}
//to modify the options, we just need to update this array:
//$input_object['options'];
//so it can be rebuilt however you want,
//use var_dump($input_object['options']) to check the format of the array
}
return $input_object;
}
add_filter('sf_input_object_pre', 'sf_do_something_with_options', 10, 2);
And to see more advanced maniuplation of the options array check:
https://gist.github.com/rmorse/7b59b45a14b1ca179868
I hope that helps!
Hi Yanin
This code should do the trick:
function sf_format_date_labels($input_object, $sfid){
//change <code>_sfm_date</code> to the name of your field
if($input_object['name']=='_sfm_date')
{
//udpate this field before rendering
if(!isset($input_object['options']))
{
return $input_object;
}
//now we know there are options we can loop through each one, and change what we need
foreach($input_object['options'] as $option)
{
if($option->value=="")
{//the option with no value is always the "all items" or unselected state
//$option->label = "This could be a default label";
}
else
{
$date = $option->value;
//convert date to YYYY-MM-DD so strtototime doesn't mix up months / days
$input_date = substr($date, 0, 4) . '-' . substr($date, 4, 2). '-' . substr($date, 6, 2);
//now format the date how we want
$date_format = "M j, Y";
$option->label = date($date_format, strtotime($input_date));
}
}
}
return $input_object;
}
add_filter('sf_input_object_pre', 'sf_format_date_labels', 10, 2);
Things to note:
1) change _sfm_date
to the name of your field – you can see the name of your field by checking it in the URL, after performing a search with a date value selected
2) To change the display format, modify the line:
$date_format = "M j, Y";
You can format the date using the normal PHP date parameters: https://www.php.net/manual/en/function.date.php
Let me know how you get on.
Thanks