Update 24.03.2015: In der aktuellen Version des Plugins, hat der Entwickler die Änderungen übernommen (ab Version 1.3.7). Die Version kann hier heruntergeladen werden:  wp-gpx-maps.1.3.7.

Das WordPress-Plugin WP GPX Maps von Bastianon Massimo ist hervorragend geeignet um GPS-Tracks und Bilder mit GPS-Daten auf einer Karte darzustellen. Leider können in der Standardversion nur Bilder aus einer NGG-Gallerie in einer Karte angezeigt werden. Bilder aus der WordPress Medienbibiliothek können nicht auf der Karte angezeigt werden.

Mit den hier vorgestellten Änderungen am Plugin wird ein neuer Shortcode-Parameter (attachments=true) eingefügt, mit dessen Hilfe alle Bilder in der Karte angezeigt werden, die dem Post direkt zugeordnet sind (Post Attachments). Dabei versteht sich von selbst, dass die Bilder idealerweise mit GPS-Metadaten versehen sein sollten. Alternativ kann auch wie beim diesem Plugin üblich eine Zuordnung der Bilder zum GPS-Track erfolgen. Diese Funktion habe ich allerdings nicht getestet.

Hinweis: Die folgenden Änderungen beziehen sich auf die Version 1.3.6 des Plugins. Ab Version 1.3.7 sind die Änderungen bereits im Standard-Plugin enthalten, sodass keine Änderungen mehr vorgenommen werden müssen.

Damit die Post-Attachments berücksichtigt werden, muss zunächst in der Datei  wp-gpx.maps_utils.php folgende Funktion eingefügt werden:

function getAttachedImages($dt, $lat, $lon, $dtoffset, &$error)
{
	$result = array();
		
	try {
		$attachments = get_children( array(
			 'post_parent'    => get_the_ID(),
			 'post_type'      => 'attachment',
			 'numberposts'    => -1, 			// show all -1
			 'post_status'    => 'inherit',
			 'post_mime_type' => 'image',
			 'order'          => 'ASC',
			 'orderby'        => 'menu_order ASC')
		);

		foreach ($attachments as $attachment_id => $attachment) {

			$img_src  		= wp_get_attachment_image_src($attachment_id,'full');
			$img_thmb  		= wp_get_attachment_image_src($attachment_id,'thumbnail');
			$img_metadata	= wp_get_attachment_metadata( $attachment_id);

			$item = array();
			$item["data"] = wp_get_attachment_link( $attachment_id, array(105,105) );

			if (is_callable('exif_read_data')) {
				$exif = @exif_read_data($img_src[0]);	
				if ($exif !== false)
				{
					$item["lon"] = getExifGps($exif["GPSLongitude"], $exif['GPSLongitudeRef']);
					$item["lat"] = getExifGps($exif["GPSLatitude"], $exif['GPSLatitudeRef']);
					if (($item["lat"] != 0) || ($item["lon"] != 0)) 
					{
						$result[] = $item;
					}
					else if (isset($p->imagedate))
					{
						$_dt = strtotime($p->imagedate) + $dtoffset;
						$_item = findItemCoordinate($_dt, $dt, $lat, $lon);
						if ($_item != null)
						{
							$item["lat"] = $_item["lat"];
							$item["lon"] = $_item["lon"];
							$result[] = $item;
						}
					}
				}
			}
			else
			{
				$error .= "Sorry, <a href='http://php.net/manual/en/function.exif-read-data.php' target='_blank' >exif_read_data</a> function not found! check your hosting..<br />";
			}
		}
		
	} catch (Exception $e) {
		$error .= 'Error When Retrieving attached images: $e <br />';
	}

	return $result;
}

Danach muss die eben angelegte Funktion nur noch aufgerufen werden, wenn der entsprechende Parameter attachments=true im Shortcode angegeben wurde. Da zu müssen folgende Anpassungen an Datei wp-gpx.maps.php vorgenommen werden:

function handle_WP_GPX_Maps_Shortcodes($attr, $content='')
{
[...]

	$ngGalleries =        findValue($attr, "nggalleries",        "wpgpxmaps_map_ngGalleries", 		 "");
	$ngImages =           findValue($attr, "ngimages",           "wpgpxmaps_map_ngImages", 		     "");

// Folgende Zeile hinzugefügt:
// ***************************
	$attachments =        findValue($attr, "attachments",        "wpgpxmaps_map_attachments", 	     false);

[...]

	$ngimgs_data = '';
	if ( $ngGalleries != '' || $ngImages != '' ) {
	
	//print_r($points);
	
		$ngimgs = getNGGalleryImages($ngGalleries, $ngImages, $points_x_time, $points_x_lat, $points_x_lon, $dtoffset, $error);
		$ngimgs_data ='';	
		foreach ($ngimgs as $img) {		
			$data = $img['data'];
			$data = str_replace("\n","",$data);
			$ngimgs_data .= '<span lat="'.$img['lat'].'" lon="'.$img['lon'].'">'.$data.'</span>';
		}
	}

// Folgende Zeilen hinzugefügt:
// ****************************
	if ($attachments == true) {
		$attimgs = getAttachedImages($points_x_time, $points_x_lat, $points_x_lon, $dtoffset, $error);
		foreach ($attimgs as $img) {		
			$data = $img['data'];
			$data = str_replace("\n","",$data);
			$ngimgs_data .= '<span lat="'.$img['lat'].'" lon="'.$img['lon'].'">'.$data.'</span>';
		}
	}

[...]

Danach ist die Funktion bereits grundsätzlich vorhanden. Der Vollständigkeit halber habe ich die Parameterbeschreibung noch in der Datei wp-gpx-maps_admin.php hinzugefügt:

[...]

				<li><b>nggalleries</b>: NextGen Gallery id or a list of Galleries id separated by a comma</li>	
				<li><b>ngimages</b>: NextGen Image id or a list of Images id separated by a comma</li>	
		<!-- Zeile Hinzugefügt: -->
				<li><b>attachments</b>: show all images that are attached to post (default is false)</li>	

[...]