Ah – sorted this myself by directly accessing $_POST. In case it helps anyone else:
/**
* Filter Simple Locator shortcode Form output to add extra fields.
*
* @param string $output String of form html to be output.
* @param array $distances Values for distances dropdown.
* @param [type] $taxonomies [description]
* @param bool $widget Whether output is for the widget.
* @return string Modified $output.
*/
function mysite_form_bootstrap( $output, $distances, $taxonomies, $widget ) {
if ( true === $widget ) {
return $output;
}
// Extra inputs.
$extras = '<div class="form-check"><label class="form-check-label"><input name="public" class="form-check-input" type="checkbox" value="true" checked> Show public events only</label></div>';
$extras .= '<div class="form-check"><label class="form-check-label"><input name="upcoming" class="form-check-input" type="checkbox" value="true" checked> Show upcoming events only</label></div>';
$output = str_replace( '<div class="submit">', $extras . '<div class="submit">', $output );
return $output;
}
add_filter( 'simple_locator_form', 'mysite_form_fields', 10, 4 );
/**
* Filter Simple Locator form handling to make it send our additional fields.
*
* @return string Additional fields to add to post data.
*/
function mysite_form_post_fields() {
return array( 'upcoming', 'public' );
}
add_filter( 'simple_locator_post_fields', 'mysite_form_post_fields' );
/**
* Join custom fields meta for use in Select.
*
* @param string $sql Join statment to select meta fields.
* @return string Modified join statment to select meta fields.
*/
function mysite_additional_fields_join( $sql ){
return $sql . ' LEFT JOIN wp_postmeta AS public_or_private
ON p.ID = public_or_private.post_id AND public_or_private.meta_key = "is_your_event_public_or_private"';
}
add_filter( 'simple_locator_sql_join', 'mysite_additional_fields_join' );
/**
* Update Simple Locator Where SQL to handle filter checkboxes.
* @param string $sql Where SQL statement to select events.
* @return string Modified where SQL statement to select events.
*/
function mysite_additional_fields_where( $sql ){
$public = filter_input( INPUT_POST, 'public', FILTER_SANITIZE_STRING );
if ( ! empty( $public ) && 'true' === $public ) {
$sql .= ' AND public_or_private.meta_value = "Public"';
}
$upcoming = filter_input( INPUT_POST, 'upcoming', FILTER_SANITIZE_STRING );
if ( ! empty( $upcoming ) && 'true' === $upcoming ) {
$sql .= ' AND date_of_your_event.meta_value >= "' . date( 'Ymd' ) . '"';
}
return $sql;
}
add_filter( 'simple_locator_sql_where', 'mysite_additional_fields_where' );
NB – in this specific case I also had to use JS to modify the checkbox value depending on whether they were checked or not as Simple Locator doesn’t have any extra handling for showing whether they are checked or not in the POSTed data.
-
This reply was modified 7 years, 3 months ago by emirpprime.
-
This reply was modified 7 years, 3 months ago by emirpprime.