750 lines
36 KiB
PHP
750 lines
36 KiB
PHP
|
<?php
|
||
|
if ( !class_exists( 'SM_Locations' ) ) {
|
||
|
class SM_Locations {
|
||
|
|
||
|
function sm_locations(){
|
||
|
// Register my locations on init hook
|
||
|
add_action( 'init', array( &$this, 'register_locations' ) );
|
||
|
add_action( 'init', array( &$this, 'register_location_taxonomies' ) );
|
||
|
|
||
|
// Queue my JS
|
||
|
add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_location_add_edit_js' ) );
|
||
|
add_action( 'init', array( &$this, 'location_add_edit_js' ) );
|
||
|
|
||
|
// Save post meta
|
||
|
add_action( 'save_post', array( &$this, 'save_post_meta' ) );
|
||
|
add_action( 'wp_ajax_ajax_save_lat_lng', array( &$this, 'ajax_save_lat_lng' ) );
|
||
|
|
||
|
// Limit pages called for dropdown parent selector in quick edit
|
||
|
add_filter( 'parse_request', array( &$this, 'limit_edit_query' ) );
|
||
|
add_filter( 'quick_edit_dropdown_pages_args', array( &$this, 'limit_wp_dropdown_pages' ) );
|
||
|
add_filter( 'wp_dropdown_pages', array( &$this, 'modify_empty_wp_dropdown_pages' ) );
|
||
|
|
||
|
// Flush cache on manual location updates
|
||
|
add_action( 'save_post', array( &$this, 'flush_cache_data' ) );
|
||
|
add_action( 'trash_post', array( &$this, 'flush_cache_data' ) );
|
||
|
add_action( 'untrash_post', array( &$this, 'flush_cache_data' ) );
|
||
|
add_action( 'edit_post', array( &$this, 'flush_cache_data' ) );
|
||
|
add_action( 'delete_post', array( &$this, 'flush_cache_data' ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
// Register locations post type
|
||
|
function register_locations() {
|
||
|
global $simple_map;
|
||
|
|
||
|
$args = array();
|
||
|
$options = $simple_map->get_options();
|
||
|
if ( !empty( $options['enable_permalinks'] ) ) {
|
||
|
$args += array(
|
||
|
'publicly_queryable' => true,
|
||
|
'exclude_from_search' => false,
|
||
|
'rewrite' => array( 'slug' => $options['permalink_slug'] ),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$args += array(
|
||
|
'public' => true,
|
||
|
'publicly_queryable' => false,
|
||
|
'exclude_from_search' => true,
|
||
|
'show_ui' => true,
|
||
|
'capability_type' => 'post',
|
||
|
'hierarchical' => false,
|
||
|
'rewrite' => false,
|
||
|
'query_var' => 'sm-location',
|
||
|
'register_meta_box_cb' => array( &$this, 'location_meta_cb' ),
|
||
|
'supports' => array(),
|
||
|
'labels' => array(
|
||
|
'name' => 'Locations',
|
||
|
'singular_name' => 'Location',
|
||
|
'add_new_item' => 'Add New Location',
|
||
|
'edit_item' => 'Edit Location',
|
||
|
'new_item' => 'New Location',
|
||
|
'view_item' => 'View Locations',
|
||
|
'search_items' => 'Search Locations',
|
||
|
'not_found' => 'No Locations found',
|
||
|
'not_found_in_trash' => 'No Locations found in trash',
|
||
|
)
|
||
|
);
|
||
|
|
||
|
// Register it
|
||
|
register_post_type( 'sm-location', $args );
|
||
|
}
|
||
|
|
||
|
// Register custom taxonomies for locations
|
||
|
function register_location_taxonomies() {
|
||
|
global $simple_map;
|
||
|
$options = $simple_map->get_options();
|
||
|
|
||
|
foreach ( $options['taxonomies'] as $taxonomy => $tax_info ) {
|
||
|
$this->register_location_taxonomy( $taxonomy, $tax_info );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Register custom taxonomy for locations
|
||
|
function register_location_taxonomy( $taxonomy, $tax_info ) {
|
||
|
if ( taxonomy_exists( $taxonomy ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$tax_info += array(
|
||
|
'singular' => $taxonomy,
|
||
|
'plural' => $taxonomy,
|
||
|
'hierarchical' => false,
|
||
|
);
|
||
|
|
||
|
$args = array(
|
||
|
'labels' => array(
|
||
|
'name' => 'Location ' . $tax_info['plural'],
|
||
|
'singular_name' => 'Location ' . $tax_info['singular'],
|
||
|
'search_items' => 'Search ' . $tax_info['plural'],
|
||
|
'popular_items' => 'Popular ' . $tax_info['plural'],
|
||
|
'all_items' => 'All ' . $tax_info['plural'],
|
||
|
'parent_item' => 'Parent ' . $tax_info['singular'],
|
||
|
'parent_item_colon' => 'Parent ' . $tax_info['singular'] . ':',
|
||
|
'edit_item' => 'Edit ' . $tax_info['singular'],
|
||
|
'update_item' => 'Update ' . $tax_info['singular'],
|
||
|
'add_new_item' => 'Add New ' . $tax_info['singular'],
|
||
|
'new_item_name' => 'New ' . $tax_info['singular'] . ' Name',
|
||
|
'separate_items_with_commas' => 'Separate ' . strtolower( $tax_info['plural'] ) . ' with commas',
|
||
|
'add_or_remove_items' => 'Add or remove ' . strtolower( $tax_info['plural'] ),
|
||
|
'choose_from_most_used' => 'Choose from the most used ' . strtolower( $tax_info['plural'] ),
|
||
|
),
|
||
|
'hierarchical' => $tax_info['hierarchical'],
|
||
|
'rewrite' => false,
|
||
|
'show_tagcloud' => false
|
||
|
);
|
||
|
|
||
|
register_taxonomy( $taxonomy, 'sm-location', $args );
|
||
|
}
|
||
|
|
||
|
// Add call back for meta box
|
||
|
function location_meta_cb(){
|
||
|
add_meta_box( 'sm-location-premium-support', __( 'Premium Support', 'SimpleMap' ), array( &$this, 'premium_support' ), 'sm-location', 'side', 'high' );
|
||
|
add_meta_box( 'sm-geo-location', __( 'Geographic Location', 'SimpleMap' ), array( &$this, 'geo_location' ), 'sm-location', 'normal' );
|
||
|
add_meta_box( 'sm-additional-information', __( 'Additional Information', 'SimpleMap' ), array( &$this, 'additional_information' ), 'sm-location', 'normal' );
|
||
|
add_meta_box( 'sm-location-drag-drop', __( 'Drag and Drop Location', 'SimpleMap' ), array( &$this, 'location_drag_drop' ), 'sm-location', 'side' );
|
||
|
}
|
||
|
|
||
|
// Add premium support box
|
||
|
function premium_support() {
|
||
|
|
||
|
global $simplemap_ps, $current_user;
|
||
|
|
||
|
wp_get_current_user();
|
||
|
$status_key = md5( 'ft_premium_support_' . $simplemap_ps->product_id . '_' . sanitize_title_with_dashes( $simplemap_ps->site_url ) . '_' . sanitize_title_with_dashes( $simplemap_ps->server_url ) ) ;
|
||
|
$sso_key = md5( 'ft_premium_sso_' . $current_user->ID . '_' . $simplemap_ps->product_id . '_' . sanitize_title_with_dashes( $simplemap_ps->site_url ) . '_' . sanitize_title_with_dashes( $simplemap_ps->server_url ) );
|
||
|
|
||
|
// Set status from transient if not set via global
|
||
|
if ( '' == $simplemap_ps->ps_status && '' != get_transient( $status_key ) )
|
||
|
$simplemap_ps->ps_status = get_transient( $status_key );
|
||
|
|
||
|
// Set sso key from transient if not set via global
|
||
|
if ( '' == $simplemap_ps->sso_status && '' != get_transient( $sso_key ) )
|
||
|
$simplemap_ps->sso_status = get_transient( $sso_key );
|
||
|
|
||
|
|
||
|
//echo "<pre>";print_r( $simplemap_ps );echo "</pre>";
|
||
|
if ( ! url_has_ftps_for_item( $simplemap_ps ) ) :
|
||
|
|
||
|
?>
|
||
|
<p>
|
||
|
<?php _e( 'By signing up for SimpleMap premium support, you help to ensure future enhancements to this excellent project as well as the following benefits:', 'SimpleMap' ); ?>
|
||
|
</p>
|
||
|
|
||
|
<ul style='margin-left:25px;list-style-type:disc'>
|
||
|
<li><?php _e( 'Around the clock access to our extensive knowledge base and support forum from within your WordPress dashboard', 'SimpleMap' ); ?></li>
|
||
|
<li><?php _e( 'Professional and timely response times to all your questions from the SimpleMap team', 'SimpleMap' ); ?></li>
|
||
|
<li><?php _e( 'A 10% discount for any custom functionality you request from the SimpleMap developers', 'SimpleMap' ); ?></li>
|
||
|
<li><?php _e( 'A 6-12 month advance access to new features integrated into the auto upgrade functionality of WordPress', 'SimpleMap' ); ?></li>
|
||
|
</ul>
|
||
|
|
||
|
<ul style='margin-left:25px;list-style-type:none'>
|
||
|
<li><a href='<?php echo get_ftps_paypal_button( $simplemap_ps ); ?>'><?php _e( 'Signup Now', 'SimpleMap' ); ?></a></li>
|
||
|
<li><a target='_blank' href='<?php echo get_ftps_learn_more_link( $simplemap_ps ); ?>'><?php _e( 'Learn More', 'SimpleMap' ); ?></a></li>
|
||
|
</ul>
|
||
|
|
||
|
<?php
|
||
|
|
||
|
else :
|
||
|
|
||
|
?>
|
||
|
<p class='howto aligncenter'><?php printf( __( 'Your premium support license for %s is valid until %s', 'SimpleMap' ), get_ftps_site( $simplemap_ps ), date( "F d, Y", get_ftps_exp_date( $simplemap_ps ) ) ); ?></p>
|
||
|
<ul style='margin-left:25px;list-style-type:disc'>
|
||
|
<li><a href="#" id="simplemap-pss"><?php _e( 'Launch Premium Support widget', 'SimpleMap' ); ?></a></li>
|
||
|
<li><a target='_blank' href="http://support.simplemap-plugin.com?sso=<?php echo get_ftps_sso_key( $simplemap_ps ); ?>"><?php _e( 'Visit Premium Support web site', 'SimpleMap' ); ?></a></li>
|
||
|
<script type="text/javascript" charset="utf-8">
|
||
|
Tender = {
|
||
|
hideToggle: true,
|
||
|
sso: "<?php echo get_ftps_sso_key( $simplemap_ps ); ?>",
|
||
|
widgetToggles: [document.getElementById('simplemap-pss')]
|
||
|
}
|
||
|
</script>
|
||
|
<script src="https://simplemap.tenderapp.com/tender_widget.js" type="text/javascript"></script>
|
||
|
<?php
|
||
|
|
||
|
endif;
|
||
|
}
|
||
|
|
||
|
// Geographic Location Information
|
||
|
function geo_location( $post ){
|
||
|
global $simple_map, $hook_suffix;
|
||
|
$options = $simple_map->get_options();
|
||
|
|
||
|
// Location data
|
||
|
$location_address = get_post_meta( $post->ID, 'location_address', true ) ? get_post_meta( $post->ID, 'location_address', true ) : '';
|
||
|
$location_address2 = get_post_meta( $post->ID, 'location_address2', true ) ? get_post_meta( $post->ID, 'location_address2', true ) : '';
|
||
|
$location_city = get_post_meta( $post->ID, 'location_city', true ) ? get_post_meta( $post->ID, 'location_city', true ) : '';
|
||
|
$location_state = get_post_meta( $post->ID, 'location_state', true ) ? get_post_meta( $post->ID, 'location_state', true ) : $options['default_state'];
|
||
|
$location_zip = get_post_meta( $post->ID, 'location_zip', true ) ? get_post_meta( $post->ID, 'location_zip', true ) : '';
|
||
|
$location_country = get_post_meta( $post->ID, 'location_country', true ) ? get_post_meta( $post->ID, 'location_country', true ) : $options['default_country'];
|
||
|
$location_lat = get_post_meta( $post->ID, 'location_lat', true ) ? get_post_meta( $post->ID, 'location_lat', true ) : '';
|
||
|
$location_lng = get_post_meta( $post->ID, 'location_lng', true ) ? get_post_meta( $post->ID, 'location_lng', true ) : '';
|
||
|
|
||
|
?>
|
||
|
<p class="sub"><?php _e('You must enter either an address or a latitude/longitude. If you enter both, the address will not be geocoded and your latitude/longitude values will remain intact.', 'SimpleMap'); ?></p>
|
||
|
|
||
|
<div class='hidden updated below-h2' id='js-geo-encode-msg'>
|
||
|
<p><?php echo __( "Your Server's IP is over the geocode threshold set by Google so we had fallback to a Javascript function. <span id='sm_js_update_lat_lng_result'></span>", "SimpleMap" ); ?></p>
|
||
|
</div>
|
||
|
|
||
|
<div class="table">
|
||
|
<table class="form-table">
|
||
|
|
||
|
<!-- Store Address -->
|
||
|
<tr valign="top">
|
||
|
<td width="150"><label for="location_address"><?php _e('Address', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_address" id="location_address" size="30" value="<?php echo esc_attr( $location_address ); ?>" /><br />
|
||
|
<input type="text" name="location_address2" size="30" value="<?php echo esc_attr( $location_address2 ); ?>" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- City / Town -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_city"><?php _e('City/Town', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_city" id="location_city" value="<?php echo esc_attr( $location_city ); ?>" size="30" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- State / Providence -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_state"><?php _e('State/Province', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_state" id="location_state" value="<?php echo esc_attr( $location_state ); ?>" size="30" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Zip / Postal Code -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_zip"><?php _e('Zip/Postal Code', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_zip" id="location_zip" value="<?php echo esc_attr( $location_zip ); ?>" size="30" maxlength="20" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Country -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_country"><?php _e('Country', 'SimpleMap'); ?></label></td>
|
||
|
<td>
|
||
|
<select name="location_country" id="location_country">
|
||
|
<?php
|
||
|
foreach ( $simple_map->get_country_options() as $key => $value ) {
|
||
|
echo '<option value="' . $key . '" ' . selected( $location_country, $key, false ) . '>' . $value . '</option>'."\n";
|
||
|
}
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Lat / Lng -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_lat"><?php _e('Latitude/Longitude', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_lat" id="location_lat" size="14" value="<?php echo esc_attr( $location_lat ); ?>" />
|
||
|
<input type="text" name="location_lng" id="location_lng" size="14" value="<?php echo esc_attr( $location_lng ); ?>" /> <span id='latlng_updated' class='updated' style='display:none;color:#666666;font-style:italic;font-size:11px;'>Lat / Lng updated. Update address too? <a href='#' onclick="dragDropUpdateAddress();jQuery('#latlng_updated').hide();jQuery('#latlng_dontforget').fadeIn();return false;" >yes</a> | <a href='#' onclick="jQuery('#latlng_updated').hide();jQuery('#latlng_dontforget').fadeIn();return false;">no</a></span> <span id='latlng_dontforget' class='error' style='display:none;color:#666666;font-style:italic;font-size:11px;'>Changes aren't saved until you update or publish</span></td>
|
||
|
</tr>
|
||
|
|
||
|
</table>
|
||
|
</div> <!-- table -->
|
||
|
<div class="clear"></div>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
// Additional Information
|
||
|
function additional_information( $post ){
|
||
|
global $simple_map;
|
||
|
$options = $simple_map->get_options();
|
||
|
|
||
|
$location_phone = get_post_meta( $post->ID, 'location_phone', true ) ? get_post_meta( $post->ID, 'location_phone', true ) : '';
|
||
|
$location_fax = get_post_meta( $post->ID, 'location_fax', true ) ? get_post_meta( $post->ID, 'location_fax', true ) : '';
|
||
|
$location_url = get_post_meta( $post->ID, 'location_url', true ) ? get_post_meta( $post->ID, 'location_url', true ) : '';
|
||
|
$location_email = get_post_meta( $post->ID, 'location_email', true ) ? get_post_meta( $post->ID, 'location_email', true ) : '';
|
||
|
$location_special = get_post_meta( $post->ID, 'location_special', true ) ? get_post_meta( $post->ID, 'location_special', true ) : '';
|
||
|
?>
|
||
|
<div class="table">
|
||
|
|
||
|
<table class="form-table">
|
||
|
|
||
|
<!-- Phone -->
|
||
|
<tr valign="top">
|
||
|
<td width="150"><label for="location_phone"><?php _e('Phone', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" id="location_phone" name="location_phone" size="30" maxlength="28" value="<?php echo esc_attr( $location_phone ); ?>" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Email -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_email"><?php _e('Email', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_email" id="location_email" size="30" value="<?php echo esc_attr( $location_email ); ?>" />
|
||
|
</tr>
|
||
|
|
||
|
<!-- URL -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_url"><?php _e('URL', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" name="location_url" id="location_url" size="30" value="<?php echo esc_attr( $location_url ); ?>" />
|
||
|
<br /><?php _e('Please include <strong>http://</strong>', 'SimpleMap'); ?></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Fax -->
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_fax"><?php _e('Fax', 'SimpleMap'); ?></label></td>
|
||
|
<td><input type="text" id="location_fax" name="location_fax" size="30" maxlength="28" value="<?php echo esc_attr( $location_fax ); ?>" /></td>
|
||
|
</tr>
|
||
|
|
||
|
<!-- Store Special -->
|
||
|
<?php if ( $options['special_text'] != '' ) { ?>
|
||
|
<tr valign="top">
|
||
|
<td><label for="location_special"><?php echo $options['special_text']; ?></label></td>
|
||
|
<td><input type="checkbox" id="location_special" name="location_special" value="1" <?php checked( $location_special ); ?> /></td>
|
||
|
</tr>
|
||
|
<?php } ?>
|
||
|
|
||
|
</table>
|
||
|
|
||
|
</div> <!-- table -->
|
||
|
|
||
|
<div class="clear"></div>
|
||
|
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
// This function contains the little map with the marker
|
||
|
function location_drag_drop( $post ) {
|
||
|
global $simple_map;
|
||
|
$options = $simple_map->get_options();
|
||
|
|
||
|
// Location data
|
||
|
$location_address = get_post_meta( $post->ID, 'location_address', true ) ? get_post_meta( $post->ID, 'location_address', true ) : '';
|
||
|
$location_address2 = get_post_meta( $post->ID, 'location_address2', true ) ? get_post_meta( $post->ID, 'location_address2', true ) : '';
|
||
|
$location_city = get_post_meta( $post->ID, 'location_city', true ) ? get_post_meta( $post->ID, 'location_city', true ) : '';
|
||
|
$location_state = get_post_meta( $post->ID, 'location_state', true ) ? get_post_meta( $post->ID, 'location_state', true ) : $options['default_state'];
|
||
|
$location_zip = get_post_meta( $post->ID, 'location_zip', true ) ? get_post_meta( $post->ID, 'location_zip', true ) : '';
|
||
|
$location_country = get_post_meta( $post->ID, 'location_country', true ) ? get_post_meta( $post->ID, 'location_country', true ) : $options['default_country'];
|
||
|
$location_lat = get_post_meta( $post->ID, 'location_lat', true ) ? get_post_meta( $post->ID, 'location_lat', true ) : '';
|
||
|
$location_lng = get_post_meta( $post->ID, 'location_lng', true ) ? get_post_meta( $post->ID, 'location_lng', true ) : '';
|
||
|
|
||
|
?>
|
||
|
<p class='howto'>Drag the marker to fine tune your location's placement on the map</p>
|
||
|
<div id="dragdrop_map_canvas" style="width:267px;height:200px;"></div>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
// Enqueues the JS I need.
|
||
|
function enqueue_location_add_edit_js() {
|
||
|
global $current_screen, $post;
|
||
|
|
||
|
if ( ! is_admin() || 'sm-location' != $current_screen->id )
|
||
|
return;
|
||
|
|
||
|
wp_enqueue_script( 'sm-drag-drop-location-js', site_url() . '/?sm-drag-drop-location-js=' . $post->ID, array( 'jquery' ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
// Javascript for add / edit location page
|
||
|
function location_add_edit_js() {
|
||
|
global $current_screen, $simple_map;
|
||
|
|
||
|
$options = $simple_map->get_options();
|
||
|
|
||
|
if ( !isset( $_GET['sm-drag-drop-location-js'] ) )
|
||
|
return;
|
||
|
|
||
|
$postid = (int) $_GET['sm-drag-drop-location-js'];
|
||
|
|
||
|
$drag_drop_lat = get_post_meta( $postid, 'location_lat', true ) ? get_post_meta( $postid, 'location_lat', true ) : '40.730885';
|
||
|
$drag_drop_lng = get_post_meta( $postid, 'location_lng', true ) ? get_post_meta( $postid, 'location_lng', true ) : '-73.997383';
|
||
|
$drag_drop_zoom = ( $drag_drop_lat == '40.730885' ) ? 2 : 17;
|
||
|
|
||
|
header( "Content-type: application/x-javascript" );
|
||
|
|
||
|
/*
|
||
|
if ( '' == $options['api_key'] ) {
|
||
|
die( "alert( '" . esc_js( __( "You will need to enter your API key in general options before your addresses will be coded properly.", 'SimpleMap' ) ) . "');" );
|
||
|
}
|
||
|
*/
|
||
|
?>
|
||
|
var map;
|
||
|
var geocoder;
|
||
|
var address;
|
||
|
var marker;
|
||
|
var place;
|
||
|
|
||
|
function location_add_edit_js_init() {
|
||
|
var latlng = new google.maps.LatLng( <?php echo esc_js( $drag_drop_lat ); ?>, <?php echo esc_js( $drag_drop_lng ); ?> );
|
||
|
var myOptions = {
|
||
|
zoom: <?php echo esc_js( $drag_drop_zoom ); ?>,
|
||
|
center: latlng,
|
||
|
mapTypeId: google.maps.MapTypeId.ROADMAP
|
||
|
};
|
||
|
map = new google.maps.Map( document.getElementById( "dragdrop_map_canvas" ), myOptions );
|
||
|
|
||
|
marker = new google.maps.Marker({
|
||
|
position: latlng,
|
||
|
map: map,
|
||
|
draggable: true,
|
||
|
animation: google.maps.Animation.DROP
|
||
|
});
|
||
|
|
||
|
google.maps.event.addListener( map, 'click', dragDropGetAddress );
|
||
|
google.maps.event.addListener( marker, 'dragend', dragDropGetAddressTest );
|
||
|
|
||
|
geocoder = new google.maps.Geocoder();
|
||
|
|
||
|
<?php
|
||
|
// If PHP Geocode failed, do the ajax update
|
||
|
if ( $sm_js_update = get_post_meta( $postid, 'sm-needs-js-geocode', true ) ) {
|
||
|
$location_address_data = get_post_custom( $postid );
|
||
|
?>
|
||
|
jQuery( '#js-geo-encode-msg' ).removeClass( 'hidden' );
|
||
|
|
||
|
// Do geocode
|
||
|
var geo_address = '<?php echo esc_js( $location_address_data['location_address'][0] . ' ' . $location_address_data['location_city'][0] . ' ' . $location_address_data['location_state'][0] . ' ' . $location_address_data['location_zip'][0] . ' ' . $location_address_data['location_country'][0] ); ?>';
|
||
|
geocoder.geocode( { 'address': geo_address }, function( results, status ) {
|
||
|
if ( status == google.maps.GeocoderStatus.OK ) {
|
||
|
var latlng = results[0].geometry.location;
|
||
|
jQuery( "#location_lat" ).attr( 'value', latlng.lat() );
|
||
|
jQuery( "#location_lng" ).attr( 'value', latlng.lng() );
|
||
|
|
||
|
var smdata = {
|
||
|
action: 'ajax_save_lat_lng',
|
||
|
sm_id: <?php echo esc_js( $postid ); ?>,
|
||
|
sm_lat: latlng.lat(),
|
||
|
sm_lng: latlng.lng()
|
||
|
};
|
||
|
|
||
|
jQuery.post( ajaxurl, smdata, function( response ) {
|
||
|
jQuery( '#sm_js_update_lat_lng_result' ).html( response );
|
||
|
});
|
||
|
|
||
|
// Set drag/drop map to new location
|
||
|
map.setCenter( latlng );
|
||
|
map.setZoom( <?php echo esc_js( $drag_drop_zoom ); ?> );
|
||
|
marker = new google.maps.Marker({
|
||
|
map: map,
|
||
|
position: latlng,
|
||
|
draggable: true,
|
||
|
animation: google.maps.Animation.DROP
|
||
|
});
|
||
|
|
||
|
jQuery( '#js-geo-encode-msg' ).removeClass( 'hidden' );
|
||
|
}
|
||
|
else {
|
||
|
alert("Geocode was not successful for the following reason: " + status);
|
||
|
}
|
||
|
});
|
||
|
<?php
|
||
|
delete_post_meta( $postid, 'sm-needs-js-geocode' );
|
||
|
}
|
||
|
?>
|
||
|
|
||
|
}
|
||
|
|
||
|
function dragDropGetAddressTest() {
|
||
|
var latlng = marker.getPosition();
|
||
|
geocoder.geocode( { 'latLng': latlng }, dragDropShowAddress );
|
||
|
}
|
||
|
|
||
|
function dragDropGetAddress( event ) {
|
||
|
if ( event.latlng != null ) {
|
||
|
geocoder.geocode( { 'latLng': event.latlng }, dragDropShowAddress );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function dragDropShowAddress( results, status ) {
|
||
|
marker.setMap(null);
|
||
|
if ( status != google.maps.GeocoderStatus.OK ) {
|
||
|
alert("Geocoder failed due to: " + status);
|
||
|
map.addOverlay(marker);
|
||
|
} else {
|
||
|
var latlng = results[0].geometry.location;
|
||
|
marker = new google.maps.Marker({
|
||
|
map: map,
|
||
|
position: latlng,
|
||
|
draggable: true,
|
||
|
animation: google.maps.Animation.DROP
|
||
|
});
|
||
|
|
||
|
dragDropUpdateFormFields( latlng );
|
||
|
place = results[0];
|
||
|
|
||
|
google.maps.event.addListener( marker, 'dragend', dragDropGetAddressTest );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
jQuery(document).ready(function(){
|
||
|
location_add_edit_js_init();
|
||
|
});
|
||
|
|
||
|
function dragDropUpdateFormFields( latlng ) {
|
||
|
jQuery( "#location_lat" ).attr( 'value', latlng.lat() );
|
||
|
jQuery( "#location_lng" ).attr( 'value', latlng.lng() );
|
||
|
jQuery( "#latlng_dontforget" ).hide();
|
||
|
jQuery( "#latlng_updated" ).fadeIn();
|
||
|
}
|
||
|
|
||
|
function dragDropUpdateAddress() {
|
||
|
var newAddress = {};
|
||
|
for ( var i = 0; i < place.address_components.length; i++ ) {
|
||
|
var component = place.address_components[i];
|
||
|
newAddress[component.types[0]] = component.short_name;
|
||
|
}
|
||
|
|
||
|
var newStreet = '';
|
||
|
var newCity = '';
|
||
|
var newState = '';
|
||
|
var newZip = '';
|
||
|
var newCountry = '';
|
||
|
|
||
|
if ( newAddress.street_number ) {
|
||
|
newStreet += newAddress.street_number;
|
||
|
}
|
||
|
if ( newAddress.route ) {
|
||
|
if ( newStreet != '' ) {
|
||
|
newStreet += ' ';
|
||
|
}
|
||
|
newStreet += newAddress.route;
|
||
|
}
|
||
|
|
||
|
if ( newAddress.locality ) {
|
||
|
newCity += newAddress.locality;
|
||
|
}
|
||
|
|
||
|
if ( newAddress.administrative_area_level_1 ) {
|
||
|
newState += newAddress.administrative_area_level_1;
|
||
|
}
|
||
|
|
||
|
if ( newAddress.postal_code ) {
|
||
|
newZip += newAddress.postal_code;
|
||
|
}
|
||
|
|
||
|
if ( newAddress.country ) {
|
||
|
newCountry += newAddress.country;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare != null )
|
||
|
newStreet = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
|
||
|
else if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare != null )
|
||
|
newStreet = place.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
|
||
|
|
||
|
if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName != null )
|
||
|
newCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
|
||
|
else if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName != null )
|
||
|
newCity = place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
|
||
|
|
||
|
if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName != null )
|
||
|
newState = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
|
||
|
|
||
|
if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode != null && place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber != null )
|
||
|
newZip = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
|
||
|
if ( place.AddressDetails.Country.AdministrativeArea != null && place.AddressDetails.Country.AdministrativeArea.Locality != null && place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode != null && place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber != null )
|
||
|
newZip = place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
|
||
|
|
||
|
if ( place.AddressDetails.Country != null && place.AddressDetails.Country.CountryNameCode != null )
|
||
|
newCountry = place.AddressDetails.Country.CountryNameCode;
|
||
|
|
||
|
oldStreet = jQuery("#location_address").attr( 'value' );
|
||
|
oldCity = jQuery("#location_address").attr( 'value' );
|
||
|
oldState = jQuery("#location_address").attr( 'value' );
|
||
|
oldZip = jQuery("#location_address").attr( 'value' );
|
||
|
oldCountry = jQuery("#location_address").attr( 'value' );
|
||
|
*/
|
||
|
|
||
|
jQuery("#location_address").attr( 'value', newStreet );
|
||
|
jQuery("#location_city").attr( 'value', newCity );
|
||
|
jQuery("#location_state").attr( 'value', newState );
|
||
|
jQuery("#location_zip").attr( 'value', newZip );
|
||
|
jQuery("#location_country").val( newCountry );
|
||
|
}
|
||
|
<?php
|
||
|
die();
|
||
|
}
|
||
|
|
||
|
// This function saves the geo data as well as the additional info
|
||
|
function save_post_meta( $post ) {
|
||
|
global $simple_map, $current_screen;
|
||
|
|
||
|
// Bail if we're not editing a location
|
||
|
if ( ! is_object( $current_screen ) || 'sm-location' != $current_screen->id || 'sm-location' != $current_screen->post_type )
|
||
|
return;
|
||
|
|
||
|
$options = $simple_map->get_options();
|
||
|
$post_object = get_post( $post );
|
||
|
|
||
|
//$api_key = ( isset( $options['api_key'] ) && !empty( $options['api_key'] ) ) ? $options['api_key'] : '';
|
||
|
|
||
|
// Grab old data
|
||
|
$location_address = get_post_meta( $post, 'location_address', true ) ? get_post_meta( $post, 'location_address', true ) : ' ';
|
||
|
$location_address2 = get_post_meta( $post, 'location_address2', true ) ? get_post_meta( $post, 'location_address2', true ) : ' ';
|
||
|
$location_city = get_post_meta( $post, 'location_city', true ) ? get_post_meta( $post, 'location_city', true ) : ' ';
|
||
|
$location_state = get_post_meta( $post, 'location_state', true ) ? get_post_meta( $post, 'location_state', true ) : $options['default_state'];
|
||
|
$location_zip = get_post_meta( $post, 'location_zip', true ) ? get_post_meta( $post, 'location_zip', true ) : ' ';
|
||
|
$location_country = get_post_meta( $post, 'location_country', true ) ? get_post_meta( $post, 'location_country', true ) : $options['default_country'];
|
||
|
$location_lat = get_post_meta( $post, 'location_lat', true ) ? get_post_meta( $post, 'location_lat', true ) : ' ';
|
||
|
$location_lng = get_post_meta( $post, 'location_lng', true ) ? get_post_meta( $post, 'location_lng', true ) : ' ';
|
||
|
$location_phone = get_post_meta( $post, 'location_phone', true ) ? get_post_meta( $post, 'location_phone', true ) : ' ';
|
||
|
$location_fax = get_post_meta( $post, 'location_fax', true ) ? get_post_meta( $post, 'location_fax', true ) : ' ';
|
||
|
$location_url = get_post_meta( $post, 'location_url', true ) ? get_post_meta( $post, 'location_url', true ) : ' ';
|
||
|
$location_email = get_post_meta( $post, 'location_email', true ) ? get_post_meta( $post, 'location_email', true ) : ' ';
|
||
|
$location_special = get_post_meta( $post, 'location_special', true ) ? get_post_meta( $post, 'location_special', true ) : ' ';
|
||
|
// If adding new field that has a default (like state and country above), you must modify the update section below accordingly!
|
||
|
|
||
|
// Grab new data
|
||
|
$new_address = isset( $_POST['location_address'] ) ? $_POST['location_address'] : '';
|
||
|
$new_address2 = isset( $_POST['location_address2'] ) ? $_POST['location_address2'] : '';
|
||
|
$new_city = isset( $_POST['location_city'] ) ? $_POST['location_city'] : '';
|
||
|
$new_state = isset( $_POST['location_state'] ) ? $_POST['location_state'] : '';
|
||
|
$new_zip = isset( $_POST['location_zip'] ) ? $_POST['location_zip'] : '';
|
||
|
$new_country = isset( $_POST['location_country'] ) ? $_POST['location_country'] : '';
|
||
|
$new_lat = isset( $_POST['location_lat'] ) ? $_POST['location_lat'] : '';
|
||
|
$new_lng = isset( $_POST['location_lng'] ) ? $_POST['location_lng'] : '';
|
||
|
$new_phone = isset( $_POST['location_phone'] ) ? $_POST['location_phone'] : '';
|
||
|
$new_fax = isset( $_POST['location_fax'] ) ? $_POST['location_fax'] : '';
|
||
|
$new_url = isset( $_POST['location_url'] ) ? $_POST['location_url'] : '';
|
||
|
$new_email = isset( $_POST['location_email'] ) ? $_POST['location_email'] : '';
|
||
|
$new_special = isset( $_POST['location_special'] ) ? $_POST['location_special'] : '';
|
||
|
|
||
|
// Update
|
||
|
if ( $location_address != $new_address ) update_post_meta( $post, 'location_address', $new_address );
|
||
|
if ( $location_address2 != $new_address2 ) update_post_meta( $post, 'location_address2', $new_address2 );
|
||
|
if ( $location_city != $new_city ) update_post_meta( $post, 'location_city', $new_city );
|
||
|
if ( $location_state != $new_state || ( $new_state == $options['default_state'] && ! get_post_meta( $post, 'location_state', true ) ) ) update_post_meta( $post, 'location_state', $new_state );
|
||
|
if ( $location_zip != $new_zip ) update_post_meta( $post, 'location_zip', $new_zip );
|
||
|
if ( $location_country != $new_country || ( $new_country == $options['default_country'] && ! get_post_meta( $post, 'location_country', true ) ) ) update_post_meta( $post, 'location_country', $new_country );
|
||
|
if ( $location_lat != $new_lat ) update_post_meta( $post, 'location_lat', $new_lat );
|
||
|
if ( $location_lng != $new_lng ) update_post_meta( $post, 'location_lng', $new_lng );
|
||
|
if ( $location_phone != $new_phone ) update_post_meta( $post, 'location_phone', $new_phone );
|
||
|
if ( $location_fax != $new_fax ) update_post_meta( $post, 'location_fax', $new_fax );
|
||
|
if ( $location_url != $new_url ) update_post_meta( $post, 'location_url', $new_url );
|
||
|
if ( $location_email != $new_email ) update_post_meta( $post, 'location_email', $new_email );
|
||
|
if ( $location_special != $new_special ) update_post_meta( $post, 'location_special', $new_special );
|
||
|
|
||
|
|
||
|
// Lets not geocode on auto-draft
|
||
|
if ( 'auto-draft' == $post_object->post_status )
|
||
|
return;
|
||
|
|
||
|
/*
|
||
|
* Geocode here under the following conditions
|
||
|
* If address, city, state, or zip have changed
|
||
|
* If lat or lng is empty
|
||
|
*/
|
||
|
$updated_address = get_post_meta( $post, 'location_address', true );
|
||
|
$updated_city = get_post_meta( $post, 'location_city', true );
|
||
|
$updated_state = get_post_meta( $post, 'location_state', true );
|
||
|
$updated_zip = get_post_meta( $post, 'location_zip', true );
|
||
|
$updated_country = get_post_meta( $post, 'location_country', true );
|
||
|
$updated_lat = get_post_meta( $post, 'location_lat', true );
|
||
|
$updated_lng = get_post_meta( $post, 'location_lng', true );
|
||
|
|
||
|
if ( $location_address != $updated_address || $location_city != $updated_city || $location_state != $updated_state || $location_zip != $updated_zip || $location_country != $updated_country || '' == $updated_lat || '' == $updated_lng ) {
|
||
|
$geocode_result = $simple_map->geocode_location( $updated_address, $updated_city, $updated_state, $updated_zip, $updated_country, '' );
|
||
|
|
||
|
if ( $geocode_result && isset( $geocode_result['status'] ) && $geocode_result['status'] == 'OK' ) {
|
||
|
if ( isset( $geocode_result['lat'] ) && isset( $geocode_result['lng'] ) ) {
|
||
|
update_post_meta( $post, 'location_lat', $geocode_result['lat'] );
|
||
|
update_post_meta( $post, 'location_lng', $geocode_result['lng'] );
|
||
|
}
|
||
|
} else if ( $geocode_result && isset( $geocode_result['status'] ) ) {
|
||
|
// Parse response
|
||
|
switch( $geocode_result['status'] ) {
|
||
|
case 620 :
|
||
|
case 'OVER_QUERY_LIMIT' :
|
||
|
update_post_meta( $post, 'sm-needs-js-geocode', 'true' );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Filter the main query run at top of edit.php
|
||
|
function limit_edit_query( $query ) {
|
||
|
global $current_screen, $wpdb;
|
||
|
|
||
|
if ( is_object( $current_screen ) && 'edit-sm-location' == $current_screen->id ) {
|
||
|
|
||
|
$sql = 'SELECT ID FROM `' . $wpdb->posts . '` WHERE post_type = "sm-location" AND post_status = "publish" LIMIT 10000';
|
||
|
if ( 10000 == count( $wpdb->get_results( $sql ) ) ) {
|
||
|
$query->query_vars['posts_per_page'] = $query->query_vars['posts_per_archive_page'] = 1000;
|
||
|
add_action( 'in_admin_footer', array( &$this, 'print_excessive_locations_message' ) );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return $query;
|
||
|
}
|
||
|
|
||
|
// Prints the excessive locations message
|
||
|
function print_excessive_locations_message() {
|
||
|
?>
|
||
|
<div id="message" class="error"><p><?php _e( '<strong>Warning</strong>: You have more than 10,000 locations in your database. We have limited the list here to 1,000. You may <strong>use the search field to access locations beyond the first 1,000</strong>.', 'SimpleMap' ); ?></p></div>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
// Saves lat / lng data via ajax
|
||
|
function ajax_save_lat_lng() {
|
||
|
|
||
|
// If we're missing a var, return false
|
||
|
if ( empty( $_POST['sm_lat'] ) || empty( $_POST['sm_lng'] ) || empty( $_POST['sm_id'] ) )
|
||
|
die( __( "It doesn't look like that worked either. Please try again later.", "SimpleMap" ) );
|
||
|
|
||
|
// Save original lat for roleback if lng update fails
|
||
|
$orig_lat = get_post_meta( absint( $_POST['sm_id'] ), 'location_lat', esc_attr( $_POST['sm_lat'], true ) );
|
||
|
|
||
|
// Update or return false
|
||
|
if ( ! update_post_meta( absint( $_POST['sm_id'] ), 'location_lat', esc_attr( $_POST['sm_lat'] ) ) )
|
||
|
die( __( "It doesn't look like that worked either. Please try again later.", "SimpleMap" ) );
|
||
|
if ( ! update_post_meta( absint( $_POST['sm_id'] ), 'location_lng', esc_attr( $_POST['sm_lng'] ) ) ) {
|
||
|
update_post_meta( absint( $_POST['sm_id'] ), 'location_lat', esc_attr( $orig_lat ) );
|
||
|
die( __( "It doesn't look like that worked either. Please try again later.", "SimpleMap" ) );
|
||
|
}
|
||
|
|
||
|
// If we made it here, we're golden
|
||
|
die( __( "It looks like that worked!", "SimpleMap" ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
// Filter get page dropdown if we have excessive locations
|
||
|
function limit_wp_dropdown_pages( $args ) {
|
||
|
global $current_screen;
|
||
|
|
||
|
if ( is_object( $current_screen ) && 'edit-sm-location' == $current_screen->id )
|
||
|
$args['include'] = 'This always returns an empty record set.';
|
||
|
|
||
|
return $args;
|
||
|
}
|
||
|
|
||
|
// Related to limit_wp_dropdown_pages. Now fill in what I erased above with fake data
|
||
|
function modify_empty_wp_dropdown_pages( $output ) {
|
||
|
global $current_screen;
|
||
|
|
||
|
if ( is_object( $current_screen ) && 'edit-sm-location' == $current_screen->id )
|
||
|
$output = "<select ide='post_parent' name='post_parent'><option value='0'>" . __( 'Main Page (no parent)' ) . "</option></select>";
|
||
|
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
// Flushes location cached data
|
||
|
function flush_cache_data( $id=0 ) {
|
||
|
|
||
|
if ( 'sm-location' == get_post_type( $id ) || 'force' == $id )
|
||
|
delete_transient( 'simplemap-queries-cache' );
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
?>
|