public static function filter_the_content($content) { // Ignore unless a search was posted for this page $ignore = true; // Older search forms did not include result page id, but always location text if (!isset($_POST['results_page_id']) and isset($_POST['location_text'])) { $ignore = false; } if (isset($_POST['results_page_id']) and $_POST['results_page_id'] == get_the_ID()) { $ignore = false; } if ($ignore) { return $content; } // Remove slashes added to form input $_POST = stripslashes_deep($_POST); // Remove this filter to prevent recursion remove_filter('the_content', array(__CLASS__, 'filter_the_content')); $geo_search = new GeoMashupSearch($_POST); // Buffer templated results and append to content ob_start(); $geo_search->load_template('search-results'); $content .= ob_get_clean(); // Add the filter back - it's possbible that content preprocessors will cause it to be run again add_filter('the_content', array(__CLASS__, 'filter_the_content')); return $content; }
/** * List nearby items. * * Returns an HTML list of objects near the current reference, the current post by default. * * @since 1.5 * @link http://github.com/cyberhobo/wordpress-geo-mashup/wiki/Tag-Reference#nearby-list * * @param string|array $args Template tag arguments. * @return string List HTML. */ public static function nearby_list($args = '') { if (!class_exists('GeoMashupSearch')) { return __('Enable the geo search widget in the Geo Mashup settings to power the nearby list!', 'GeoMashup'); } $default_args = array('template' => 'nearby-list', 'object_name' => 'post', 'radius' => '50'); $args = wp_parse_args($args, $default_args); $template = $args['template']; unset($args['template']); if (!isset($args['near_lat']) and !isset($args['location_text'])) { // Look near an object if (isset($args['object_id'])) { // We were given an ID $object_id = $args['object_id']; unset($args['object_id']); } else { // Use the current loop ID $object_id = get_the_ID(); } // Use the reference object location $near_location = GeoMashupDB::get_object_location($args['object_name'], $object_id); if ($near_location) { $args['near_lat'] = $near_location->lat; $args['near_lng'] = $near_location->lng; if (empty($args['exclude_object_ids'])) { $args['exclude_object_ids'] = $object_id; } else { $args['exclude_object_ids'] .= ',' . $object_id; } } } $geo_search = new GeoMashupSearch($args); ob_start(); $geo_search->load_template($template); return ob_get_clean(); }
function test_search() { require_once GEO_MASHUP_DIR_PATH . '/geo-mashup-search.php'; $not_found_post = $this->factory->post->create_and_get(); GeoMashupDB::set_object_location('post', $not_found_post->ID, $this->get_nv_test_location(), false); $found_post = $this->factory->post->create_and_get(); $location = GeoMashupDB::blank_location(); $location->lat = 45.61806; $location->lng = 5.226046; GeoMashupDB::set_object_location('post', $found_post->ID, $location, false); $search_args = array('location_text' => "l'isle d'abeau, France", 'object_name' => 'post', 'radius' => 30, 'units' => 'km', 'geo_mashup_search_submit' => 'Search'); $search = new GeoMashupSearch($search_args); $this->assertTrue($search->have_posts(), 'Search did not find any posts (internet required).'); $this->assertContains($found_post->ID, $search->get_the_IDs(), 'Search did not find the target post.'); $this->assertNotContains($not_found_post->ID, $search->get_the_IDs(), 'Search found the wrong post.'); ob_start(); $search->load_template(); $output = ob_get_clean(); $this->assertThat($output, $this->stringContains($search_args['location_text']), 'Default results template does not contain search text.'); $this->assertThat($output, $this->stringContains($found_post->post_title), 'Default results template does not contain found post title.'); }