Help make this code snippet valid

Associate
Joined
31 Jan 2010
Posts
283
Location
UK
I am having real difficulty with this piece of code, I am quite good with HTML but when it comes to PHP I get lost.

I have a Wordpress site with the Instapress Plugin installed which displays my Instagram Photos. When you click on a thumbnail it loads the Instagram image in Fancybox with the title under it.

Here is the code for that:

Code:
// jQuery Fancybox
case 'fancybox':
$result .= '<a href="'.$obj->images->standard_resolution->url.'" rel="instagram-sc-images" title="'.$title.'">';
break;

What I want to do is add a link next to the Title saying "Click Here to Comment or Like"

Here is the link code in HTML format

Code:
<a href="'.$obj->link.'"; target="_blank">Click Here to Comment or Like</a >

But how do add it to the code above? I have tried many combinations and it always ends up invalid.

Any help from you clever people would be amazing :)
 
Not sure I understand exactly what your doing (don't do much PHP myself), but as no one else has replied something like this should get you started.

PHP:
case 'fancybox':
$result = "<a href=\"'.$obj->images->standard_resolution->url.'\" rel=\"instagram-sc-images\" title=\"'.$title.'\"><a href=\"'.$obj->link.'\"; target=\"_blank\">Click Here to Comment or Like</a >";
break;
 
Thanks for the help guys:

Tried this code from above:

Code:
case 'fancybox':
$result = "<a href=\"'.$obj->images->standard_resolution->url.'\" rel=\"instagram-sc-images\" title=\"'.$title.'\"><a href=\"'.$obj->link.'\" target=\"_blank\">Click Here to Comment or Like</a >";
break;

But that gives me the following error:

Code:
Catchable fatal error: Object of class stdClass could not be converted to string in /var/sites/i/mywebsite.co.uk/public_html/wp-content/plugins/instapress/instagram.php on line 341

Anyone see any errors in that code? it means nothing to me :(
 
Code:
case 'fancybox':
$result = "<a href='".$obj->images->standard_resolution->url."' rel=\"instagram-sc-images\" title='".$title."'></a><a href='".$obj->link."' target=\"_blank\">Click Here to Comment or Like</a>";
break;

I don't have any way of testing this and haven't used it in about 300 years so it's probably not right, just saw a few would be errors and removed them
 
Last edited:
Code:
case 'fancybox':
$result = "<a href='".$obj->images->standard_resolution->url."' rel=\"instagram-sc-images\" title='".$title."'></a><a href='".$obj->link."' target=\"_blank\">Click Here to Comment or Like</a>";
break;

I don't have any way of testing this and haven't used it in about 300 years so it's probably not right, just saw a few would be errors and removed them

Thanks, but still not working great. It gives no errors now but the link does not display in the lightbox it displays under the thumbnail. Also it has made only one thumbnail show up in the gallery instead of 50.

Would posting a link to the site help?
 
it would indeed help massively, a bit of context for that code would be great as well, surrounding functions, where $result is used etc.

You asked us to make the code valid, and to be fair, that's what i've done!
 
OK here are the website details, its not live so requires a username and password:

Code:
[B]URL:[/B] [url]http://instaisland.co.uk[/url]
[B]User:[/B] overclock
[B]Pass:[/B] pass12345

Here is the file we have been editing above, in a text editor is around line 340.

Code:
<?php
	/*
	Plugin Name: Instapress
	Plugin URI: http://instapress.it
	Description: <b>Highly customizable</b> plugin to display a feed of pictures uploaded via <a href="http://instagr.am" target="_blank">Instagram</a>. Display a users media, your own media or the popular media feed. Choose whether to integrate the Instagrams as a widget or directly in your posts.
	Version: 1.5.3
	Author: Thomas Krammer
	Author URI: http://liechtenecker.at/unternehmen/
	License: GPL2
	*/

	define('INSTAPRESS_VERSION', '1.5.4');

	/*  Copyright 2011 Thomas Krammer  (email : [email protected])

	    This program is free software; you can redistribute it and/or modify
	    it under the terms of the GNU General Public License, version 2, as 
	    published by the Free Software Foundation.
	
	    This program is distributed in the hope that it will be useful,
	    but WITHOUT ANY WARRANTY; without even the implied warranty of
	    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	    GNU General Public License for more details.
	
	    You should have received a copy of the GNU General Public License
	    along with this program; if not, write to the Free Software
	    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
	*/

	/**
	 * Sprachdatei laden
	 */
	if(!load_plugin_textdomain('instagram','/wp-content/languages/')) // Nach Sprachdatei im wp-languages-Ordner suchen 
		load_plugin_textdomain('instagram','/wp-content/plugins/instapress/languages/'); // Default Sprachdatei laden
		
		
	$instapressIncludePath = get_include_path().PATH_SEPARATOR.
							plugin_dir_path(__FILE__).'instagram-php-api/'.PATH_SEPARATOR.
							plugin_dir_path(__FILE__).'classes/'.PATH_SEPARATOR.
							plugin_dir_path(__FILE__).'PowerHour_Geocoder/';
		
	// Include-Path für Zend-Library, Geocoder oder API setzen
	if(!set_include_path($instapressIncludePath)) // Wenn set_include_path nicht funktioniert
		ini_set('include_path',	$instapressIncludePath); // ini_set versuchen
	
	require_once 'Instagram_XAuth.php';
	
	require_once 'Instapress_TinyMCE.php';

	class InstagramPlugin
	{
				
		// Key in der Tabelle wp_options, unter dem die Einstellungen gespeichert werden
		var $dbOptionKey = 'InstagramPlugin_Options';
		
		// Pfad in dem die Cache-Dateien liegen
		var $cachePath = '';
		
		// Nummer der aktuellen Instanz
		static $CURRENTINSTANCENUMBER = 1;
		
		
		/**
		 * Constructor
		 */
		function InstagramPlugin()
		{
			// Menü im Backend hinzufügen
			add_action('admin_menu', array(&$this, 'admin_menu'));
			
			// Shortcode registrieren
			add_shortcode('instapress', array(&$this, 'shortcode'));
			
			// Link in der Plugins-Liste zu den Einstellungen
			add_filter('plugin_action_links', array(&$this, 'plugin_page_link'), 5, 2);
			
			// Links unterhalb der Plugin-Beschreibung
			add_filter('plugin_row_meta', array(&$this, 'plugin_row_meta'), 10, 2);
			
			// Pfad in dem Cache-Dateien abgespeichert werden
			$this->cachePath = ABSPATH.'wp-content/cache/';
			
			// Javascripts ergänzen
			add_action('init', array(&$this, 'javascript'));
			
			add_action('wp_ajax_instapress_paging', array(&$this, 'ajax_instapress_paging'));
			add_action('wp_ajax_nopriv_instapress_paging', array(&$this, 'ajax_instapress_paging'));
		}
		
		/**
		 * @return InstagramPlugin Die aktive Instanz des Plugins
		 */
		function getInstance()
		{
			global $InstagramPlugin;
			if(!isset($InstagramPlugin))
			{
				$InstagramPlugin = new InstagramPlugin();
			}
			
			return $InstagramPlugin;
		}
		
		/**
		 * @return Instagram eine konfigurierte Instanz der API
		 */
		function getAPIInstance()
		{
			// Konfiguration laden
			$config = InstagramPlugin::getConfiguration();
			        
			// API instanzieren
			$instagram = new Instagram_XAuth($config);
			
			$instagram->setAccessToken(InstagramPlugin::getAccessToken());
			
			return $instagram;
		}
		
		/**
		 * Wird im register_actication_hook aufgerufen
		 */
		function install()
		{
			$this->getOptions();
		}
		
		/**
		 * Wird bei der Implementierung von shortcode aufgerufen
		 */
		function shortcode($params)
		{
			$values = shortcode_atts(array
									(
										'userid' => '',
										'size' => 85,
										'piccount' => 9,
										'effect' => false,
										'url' => false,
										'title' => 0,
										'paging' => 0,
										'max_id' => '',
										'like' => 0,
										'tag' => '',
										'instanceid' => null
									), 
									$params);
			
			// Wenn für die Instanz noch keine ID angegeben/vergeben wurde
			if(empty($values['instanceid']))
			{
				// Neue Instanz-ID zuweisen
				$values['instanceid'] = self::$CURRENTINSTANCENUMBER++;
			}
			
			$instanceId = $values['instanceid'];
			
			// Default-Groesse ist 150x150
			$picSize = (intval($values['size']) > 0) ? intval($values['size']) : 150;
			// Seite die gezeigt werden soll
			$page = intval($values['paging']);
			
			// HTML das vor dem Image eingefügt wird
			$beforeImage = '<div class="instapress-shortcode-image %1$s" id="instapress-shortcode-'.$instanceId.'-image-%2$d">';
			// HTML in dem URL des Images und die gewünschte Größe eingefügt werden
			$imageHtml = '<img src="%1$s" ';
			// width und height aktiviert
			if(!$this->imageAttributesDisabled())
			{
				$imageHtml .= 'width="%2$d" height="%2$d" ';
			}
			$imageHtml .= 'border="0" /></a></div>';
			// HTML für den Paginator
			$paginatorHtml = '<div class="instapress-shortcode-pager">%s</div>';
			// HTML für den Weiter-Button
			$buttonNextHtml = '<a href="'.get_bloginfo( 'wpurl' ).'" class="next-page-instapress next-page-instapress-'.$instanceId.'" rel="%d-'.$instanceId.'">'.__('Next', 'instagram').' &gt;&gt;</a>';
			// HTML für den Zurück-Button
			$buttonPrevHtml = '<a href="'.get_bloginfo( 'wpurl' ).'" class="prev-page-instapress prev-page-instapress-'.$instanceId.'" rel="%d-'.$instanceId.'">&lt;&lt; '.__('Previous', 'instagram').'</a>';
			
			// Attribut id=instapress-shortcode-page-$page nur zuweisen, wenn Paging aktiviert ist
			$result = '<div class="instapress-shortcode version-'.InstagramPlugin::getVersion().($page ? ' instapress-shortcode-page" id="instapress-shortcode-'.$instanceId.'-page-'.$page.'' : '').'">';
			
			if(!$values['url']) // Nicht via oEmbed?
			{
				$result .= $this->getFeed($values, $imageHtml, $beforeImage, $picSize, $values['max_id']);
								
				// Paging aktiviert und Intialer Request (kein AJAX-Request) ==> keine max_id
				if($page && strlen($values['max_id']) == 0)
				{
					$buttons = '';
					//if($page > 1)
						$buttons .= sprintf($buttonPrevHtml, $page-1);
					$buttons .= sprintf($buttonNextHtml, $page+1);
					
					$paginator = sprintf($paginatorHtml, $buttons);
					
					
					// Script vor dem Container
					$result = 	'<script type="text/javascript">var instapressConfig'.$instanceId.' = '.json_encode($values).';</script>'.
								$paginator.
								'<div class="instapress-gallery" id="instapress-gallery-'.$instanceId.'">'.
								$result;
				}
			}
			else // via oEmbed
			{
				$oEmbed = $this->getOEmbedImage($values['url']);
				
				$result .= sprintf($beforeImage, 'oembed', 0);
				
				// Auf aktivierte Effekte überprüfen
				switch($values['effect'])
				{
					// jQuery Fancybox
					case 'fancybox':
						$result .= '<a href="'.$oEmbed->url.'" rel="instagram-sc-images" title="'.htmlentities($oEmbed->title).'">';
						break;
					case 'highslide':
						$result .= '<a href="'.$oEmbed->url.'" class="highslide instapress-highslide" title="'.htmlentities($oEmbed->title).'">';
						break;
					// Ohne Effekt
					default:
						$result .= '<a href="'.$values['url'].'" target="_blank">';
						break;
				}
				
				$result .= sprintf($imageHtml, $oEmbed->url, $picSize);
			}
			
			if(InstagramPlugin::getInstance()->mayShowBacklink())
			{
				$result .= InstagramPlugin::getBacklink();
			}
			
			$result .= '</div>';
						
			if($page)
			{
				$result .= '</div>'.$paginator;
			}
			
			return $result;
		}
		
		/**
		 * Funktion die beim AJAX-Request für die Gallery-Funktion
		 */
		function ajax_instapress_paging()
		{
			$values = $_POST['config'];
			if(is_array($values))
			{
				foreach($values as $key=>$value)
				{
					if(is_numeric($value))
					{
						$values[$key] = intval($value);
					}
				}
				$values['url'] = false;
				$values['max_id'] = $_POST['nextMaxId'];
				
				echo $this->shortcode($values);
			}
			else
			{
				_e("Your jQuery version seems to be out of date. Please update jQuery at least to version 1.4.", 'instagram');
			}
			
			die(); // this is required to return a proper result
		}
		
		/**
		 * Erstellt den HTML-Quelltext für den Fotofeed mit den angegebenen Parametern
		 * @param $values array			Siehe Instapress-shortcode-Parameter
		 * @param $imageHtml string		HTML-Template für das Image
		 * @param $beforeImage string	HTML das vor dem Image gezeigt werden soll
		 * @param $picSize int			Größe des Fotos in Pixel
		 * @param $nextMaxId int		ID des Fotos, ab dem der Feed erstellt werden soll (Default: 0)
		 * 
		 * @todo Für Multiple Instanzen kompatibel machen (duplicate ID-Attrbiutes...)
		 */
		function getFeed($values, $imageHtml, $beforeImage, $picSize, $nextMaxId = '')
		{
			$tagFeed = (!empty($values['tag']));
			$result = "";
			if(isset($values['userid']) && !empty($values['userid']))
			{
				$userid = $values['userid'];
				if(!is_numeric($values['userid']) && $values['userid'] != 'self' && $values['userid'] != 'myfeed' && strlen($values['userid']))
					$userid = InstagramPlugin::getUserIdByName($values['userid']);
			}
				
			$piccounter = 1;
		
			// "Ungerades" Bild
			$odd = true;
			
			$lastShownId = $nextMaxId;
			
			do
			{
				$max_id = $nextMaxId;
				// Feed eines Users ab der gegebenen max_id laden und nächsten max_id holen
				if(!$tagFeed)
					$data = InstagramPlugin::getFeedByUserId($userid, $max_id, &$nextMaxId, intval($values['piccount']));
				// Feed eines Users nach Tag gefiltert ab der gegebenen max_id laden und nächsten max_id holen
				else if($tagFeed && $userid)
					$data = InstagramPlugin::getFeedByUserId($userid, $max_id, &$nextMaxId, intval($values['piccount']), new InstapressFeedFilter('tags', $values['tag'], InstapressFeedFilter::IN_ARRAY));
				else // Feed nach angegebenem Tag laden
					$data = InstagramPlugin::getFeedByTag($values['tag'], $max_id, &$nextMaxId, intval($values['piccount']));

				// Daten im Feed gefunden
				if(count($data) > 0)
				{
					foreach($data as $obj)
					{
						// Nur die ersten X Bilder anzeigen?
						if(intval($values['piccount']) > 0 && $piccounter > $values['piccount'])
							break;
							
						// Image-Titel anzeigen, wenn title auf 1 gesetzt wurde
						$title = (intval($values['title']) == 1) ? $obj->caption->text : "";
						$title = htmlentities(utf8_decode($title));
						
						// Klasse für gerade/ungerade und ID mit Index hinzufügen
						$result .= sprintf($beforeImage, (($odd) ? 'odd' : 'even'), $piccounter++);
						
						$odd = !$odd;
						
						// Welche Property soll für das Image verwendet werden
						$imageKey = InstagramPlugin::getImageKey($picSize);
						
						// Auf aktivierte Effekte überprüfen
						switch($values['effect'])
						{
							// jQuery Fancybox
							case 'fancybox':
								$result .= '<a href="'.$obj->images->standard_resolution->url.'" rel="instagram-sc-images" title="'.$title.'">';
								break;
							case 'highslide':
								$result .= '<a href="'.$obj->images->standard_resolution->url.'" class="highslide instapress-highslide" title="'.$title.'">';
								break;
							// Ohne Effekt
							default:
								$result .= '<a href="'.$obj->link.'" target="_blank">';
								break;
						}
						
						$result .= sprintf($imageHtml, $obj->images->$imageKey->url, $picSize);
												
						if($nextMaxId)
							$lastShownId = $obj->id;
						else
							$lastShownId = '';
					}
				}
				else
				{
					break;
				}
			}
			while($nextMaxId && ($piccounter <= $values['piccount'] || intval($values['piccount']) == 0));
			
			$result .= '<input type="hidden" id="instapress-'.$values['instanceid'].'-next-max-id-'.(intval($values['paging'])+1).'" value="'.$nextMaxId.'" />';
			
			return $result;
		}
		
		/**
		 * Lädt eine einzelnes Image anhand der Instagram-URL
		 * @param $url string Instagram-URL des Images
		 */
		function getOEmbedImage($url)
		{
			$json = @file_get_contents('http://api.instagram.com/oembed?url='.$url);
			return json_decode($json);
		}
		
		/**
		 * Lädt den Feed für den angegebenen User
		 * @param $userid mixed 	User-Id, 'self' oder 0/null/false
		 * @param $max_id int 		ID ab der der Feed geladen werden soll
		 * @param &$nextMaxId int	max_id die für den Aufruf der nächsten Seite des Feeds benötigt wird
		 * @param $filter array		Liste mit Filter (z.B. 'tag' => 'myhashtag')
		 * 
		 * @return array der Feed (siehe Instagram API Dokumentation)
		 */
		function getFeedByUserId($userid, $max_id = '', $nextMaxId = 0, $count = 0, $filter = null)
		{	
			$writeToCache = true;
									
			$cacheid = $userid.($max_id ? "_".$max_id : "");
			
			if(InstagramPlugin::getInstance()->getFeedFromCache($cacheid))
			{
				$json = InstagramPlugin::getInstance()->getFeedFromCache($cacheid);
				$writeToCache = false;
			}
			// Wenn es eine User-Id gibt bzw. 'self' hinterlegt wurde, diesen Feed laden
			else if(intval($userid) != 0 || $userid == 'self')
			{
				$json = InstagramPlugin::getAPIInstance()->getUserRecent($userid, $max_id, $count);
			}
			// Wenn statt der UserId 'myfeed' eingetragen wurde, den Feed des Users laden
			else if($userid == 'myfeed')
			{
				$json = InstagramPlugin::getAPIInstance()->getUserFeed($max_id);
			}
			// ansonsten einfach den Popular-Media-Feed laden
			else
			{
				$json = InstagramPlugin::getAPIInstance()->getPopularMedia();
			}
						
			$response = json_decode($json);
			$result = null;
			
			if($response->data)
			{
				$result = $response->data;
			}
			
			// Wenn ein Filter definiert wurde
			if(!empty($filter))
			{
				// diesen anwenden
				$result = $filter->filter($result);
			}
			
			if($writeToCache && $result)
				InstagramPlugin::getInstance()->writeFeedToCache($cacheid, $json);
				
			// Wenn es noch weitere Fotos gibt
			if($response->pagination)
				$nextMaxId = $response->pagination->next_max_id; // max_id für nächsten Request setzen
			else // Keine weiteren Fotos mehr
				$nextMaxId = null;
				
				
			return $result;
		}
		
		/**
		 * Lädt den Feed für den angegebenen Tag
		 * @param $tag string	 	Hashtag nach dem gesucht werden soll
		 * @param $max_id int 		ID ab der der Feed geladen werden soll
		 * @param &$nextMaxId int	max_id die für den Aufruf der nächsten Seite des Feeds benötigt wird
		 * 
		 * @return array der Feed (siehe Instagram API Dokumentation)
		 */
		function getFeedByTag($tag, $max_id = '', $nextMaxId = 0, $count = 0)
		{	
			$writeToCache = true;
									
			$cacheid = $tag.($max_id ? "_".$max_id : "");
			
			if(InstagramPlugin::getInstance()->getFeedFromCache($cacheid))
			{
				$json = InstagramPlugin::getInstance()->getFeedFromCache($cacheid);
				$writeToCache = false;
			}
			else
			{
				$json = InstagramPlugin::getAPIInstance()->getRecentTags($tag, $max_id);
			}
						
			$response = json_decode($json);
			
			if($writeToCache && $response->data)
				InstagramPlugin::getInstance()->writeFeedToCache($cacheid, $json);
				
			// Wenn es noch weitere Fotos gibt
			if($response->pagination)
				$nextMaxId = $response->pagination->next_max_id; // max_id für nächsten Request setzen
			else // Keine weiteren Fotos mehr
				$nextMaxId = null;
				
			return $response->data;
		}
		
		function getCacheFilename($cachename)
		{
			if(!$cachename)
				$cachename = 'popular-media';
			return $this->cachePath.'cache-'.$cachename.'.json';
		}
		
		function getDataFromCache($cachename)
		{
			// Dateiname der Cache-Datei
			$cacheFile = $this->getCacheFilename($cachename);
			
			// Wenn die Cache-Datei lesbar ist und nicht �lter als die maximal erlaubte Cache-Zeit
			if($this->cacheIsEnabled() && is_readable($cacheFile) && filemtime($cacheFile) > strtotime('- '.$this->getOption('app_cache_time').' Minutes', time()))
			{
				// Cache laden
				return @file_get_contents($cacheFile);	
			}
			
			return false;	
		}
		
		/**
		 * Versucht die angegebenen Daten in den Cache zu schreiben
		 * @param $cachename string Name des Caches
		 * @param $json string JSON-Daten
		 * 
		 * @return bool true = in Cache geschrieben, false = Fehler beim Cache schreiben
		 */
		function writeDataToCache($cachename, $json)
		{
			// Dateiname der Cache-Datei
			$cacheFile = $this->getCacheFilename($cachename);
			
			// Beschreibbarer Cache?
			if($this->cacheIsEnabled())
			{
				@file_put_contents($cacheFile, $json);
				return true;
			}
			
			return false;
		}
		
		/**
		 * Überprüft ob der Inhalt gecached werden soll und kann
		 * 
		 * @return bool true = Cache aktiv, false = Cache inaktiv
		 */
		function cacheIsEnabled()
		{
            if($this->getOption('app_cache_time') == 0)
                return false;
			
            return $this->cacheIsWritable();
		}
        
        /**
		 * Überprüft ob der Inhalt gecached werden kann bzw. es ein beschreibbares Cache-Verzeichnis gibt
		 * http://codex.wordpress.org/Changing_File_Permissions
		 * 
		 * @return bool true = Cache beschreibbar, false = Cache nicht beschreibbar
		 */
        function cacheIsWritable()
        {
            // Wenn es das Cache-Verzeichnis noch nicht gibt und wp-content aber beschreibbar ist
			if(!is_dir($this->cachePath) && is_writable(ABSPATH.'wp-content/'))
			{
				// Versuchen Cache-Verzeichnis mit Schreibrechten anzulegen
				return @mkdir($this->cachePath, 0755);
			}
			
			// Beschreibbares Cache-Verzeichnis
			return is_writable($this->cachePath);
        }
		
		/**
		 * Lädt einen Feed aus dem Cache
		 * @param $cachename
		 */
		function getFeedFromCache($cachename)
		{
			return $this->getDataFromCache($cachename);
		}
		
		/**
		 * Speichert einen Feed im Cache
		 * @param $cachename string
		 * @param $json string
		 */
		function writeFeedToCache($cachename, $json)
		{
			return $this->writeDataToCache($cachename, $json);
		}
		
		/**
		 * Lädt ein Image aus dem Cache
		 * @param $mediaId int ID des Images
		 */
		function getMediaFromCache($mediaId)
		{
			return $this->getDataFromCache('media-'.$mediaId);
		}
		
		/**
		 * Speichert ein Image im Cache
		 * @param $mediaId int ID des Images
		 * @param $json string JSON-Daten
		 */
		function writeMediaToCache($mediaId, $json)
		{
			return $this->writeDataToCache('media-'.$mediaId, $json);
		}
		
		/**
		 * 
		 * @param $coordinates array Koordinaten
		 * 
		 * @return array Feed mit Bildern
		 */
		function getLocationBasedFeed($coordinates)
		{
			// Wenn Koordinaten gespeichert wurden
			if(!empty($coordinates))
			{
				// Name für den Cache erstellen
				$cachename = implode('-', $coordinates);
				$cachename = str_replace('.', '_', $cachename);
				
				// Versuchen Feed aus dem Cache zu laden
				if(InstagramPlugin::getInstance()->getFeedFromCache($cachename))
				{
					$json = InstagramPlugin::getInstance()->getFeedFromCache($cachename);
				}
				else // Wenn kein passender Feed im Cache war
				{
					// Feed von dem API laden
					$json = InstagramPlugin::getAPIInstance()->mediaSearch($coordinates[0], $coordinates[1], null, null, 250);
					// Im Cache speichern
					InstagramPlugin::getInstance()->writeFeedToCache($cachename, $json);
				}
				
				$response = json_decode($json);
				
				return $response->data;
			}
			
			return array();
		}
		
		/**
		 * Lädt den Titel des Bildes
		 * @param $imageId int ID des Bildes, von dem der Titel geladen werden soll
		 * 
		 * @return string Titel des Bildes
		 */
		function getImageTitle($imageId)
		{
			// Image aus Cache laden
			$json = $this->getMediaFromCache($imageId);
			
			// Noch nicht im Cache?
			if(!$json)
			{
				$json = $this->getAPIInstance()->getMedia($imageId);
				$writeToCache = true;
			}
			
			$media = json_decode($json);
			
			if($writeToCache && $media->data)
				InstagramPlugin::getInstance()->writeMediaToCache($imageId, $json);
			
			return $media->data->caption->text;
		}
		
		/**
		 * 
		 * @param $name string Instagram-Username
		 * 
		 * @return int User-Id des gesuchten Users, 'self' oder 0, wenn kein passender User gefunden wurde
		 */
		function getUserIdByName($name)
		{			
			if($name && $name != 'self')
			{
				$json = InstagramPlugin::getAPIInstance()->searchUser($name);
				
				$response = json_decode($json);
								
				$data = $response->data;
				
				if(count($data) > 0)
				{
					return $data[0]->id;
				}
			}
			else if($name == 'self')
			{
				return $name;
			}
			return 0;
		}
		
		/**
		 * Lädt die gespeicherten Einstellungen bzw. die Standardeinstellungen
		 * 
		 * @return array Gespeicherte Einstellungen
		 */
		function getOptions()
		{
			// Default-Werte
			$options = array
			(
				'app_access_token' => '',
				'app_cache_time' => 30
			);
			
			// Gespeicherte Werte laden
			$saved = get_option($this->dbOptionKey);
			
			// Wenn es gespeicherte Werte gibt
			if(!empty($saved))
			{
				// Gespeicherte Werte über Default-Werte schreiben
				foreach($saved as  $key => $option)
				{
					$options[$key] = $option;
				}
			}
			
			//
			if($saved != $options)
				update_option($this->dbOptionKey, $options);
				
			return $options;
		}
		
		function getPluginUrl()
		{
			return get_admin_url(null, 'options-general.php?page=instagram.php');
		}
		
		function getPluginDirUrl()
		{
			return trailingsla****(plugins_url('', __FILE__));
		}
		
		function getPluginDirPath()
		{
			return trailingsla****(plugin_dir_path(__FILE__));
		}
		
		/**
		 * Lädt eine einzelne Einstellung
		 * 
		 * @param $key string Key der Option
		 * 
		 * @return mixed
		 */
		function getOption($key)
		{
			$options = $this->getOptions();
			
			return $options[$key];
		}
		
		/**
		 * Handelt das Formular
		 */
		function handleOptions()
		{
			$options = $this->getOptions();
			
			//Formular abgesendet
			if(isset($_POST['instagram-update-auth-settings']))
			{			
				$options = array();
				//$options['app_client_id'] = trim($_POST['instagram-app-client-id']);
				//$options['app_client_secret'] = trim($_POST['instagram-app-client-secret']);
				$options['app_user_username'] = trim($_POST['instagram-app-user-username']);
				$options['app_user_password'] = trim($_POST['instagram-app-user-password']);
				
				// Einstellungen in der DB speichern
				update_option($this->dbOptionKey, $options);
				
				// API instanzieren
				$instagram = InstagramPlugin::getAPIInstance();
				
				// Wenn es noch keinen Token gibt
				if(!$options['app_access_token'])
				{
					// In dieser Variable werden eventuelle Fehlermeldungen während der Autorisierung gespeichert
					$errorMessage = "";
					// Request an das API schicken, um einen Access-Token zu erhalten
					$token = $instagram->getAccessToken(&$errorMessage);
				
					// Wenn es einen Access-Token gibt
					if($token)
					{
						// Access-Token speichern
						$options['app_access_token'] = $token;
						// Einstellungen in der DB speichern
						update_option($this->dbOptionKey, $options);
						//
						echo '<div class="updated"><p>'.__('Settings saved.', 'instagram').'</p></div>';
					}
					else if($errorMessage) // Es ist ein Fehler aufgetreten
					{
						echo '<div class="error"><p>'.__('Instagram API reported the following error', 'instagram').': <b>';
						echo $errorMessage;
						echo '</b></p></div>';
					}
				}
			}
			// Einstellung zurücksetzen
			else if(isset($_POST['instagram-reset-settings']))
			{
				// Einstellungen in der DB zurücksetzten / löschen
				delete_option($this->dbOptionKey);
			}
			
			// Allgemeine Einstellungen
			if(isset($_POST['instagram-update-settings']))
			{
				// Cache-Interval speichern
				$cacheTime = intval($_POST['instagram-cache-time']);
				$options['app_cache_time'] = $cacheTime;
				$options['app_disable_effects'] = isset($_POST['instagram-disable-fancybox']);
				$options['app_disable_image_attributes'] = isset($_POST['instagram-disable-image-attr']);
				$options['app_show_backlink'] = isset($_POST['instagram-show-backlink']);
				// Einstellungen in der DB speichern
				update_option($this->dbOptionKey, $options);
			}
			
			// Die Instagram-Authorize-URI
			$authorizeUrl = $this->getOAuthRedirectUrl();
			
			include('instagram-options.php');
		}
		
		/**
		 * @return array Gibt die Einstellungen für die API zurück
		 */
		function getConfiguration()
		{
			$options = InstagramPlugin::getInstance()->getOptions();
			return array(
							'site_url' 		=> 'https://api.instagram.com/oauth/access_token',
				            'client_id' 	=> '0a344b64448b43e5bb8e1c22acffc0ef',
				            'client_secret' => 'ff62e43965be4a48b83a32261cd540bc',
							'username' 		=> $options['app_user_username'],
							'password' 		=> $options['app_user_password'],
				            'grant_type' 	=> 'password',
				            'redirect_uri'	=> InstagramPlugin::getOAuthRedirectUrl()
				        );
		}
		
		/**
		 * Fügt den Menüpunkt Instapress im Backend hinzu
		 */
		function admin_menu()
		{
			add_options_page('Instapress '.__('Settings', 'instagram'), 'Instapress', 8, basename(__FILE__), array(&$this, 'handleOptions'));
		}
		
		/**
		 * @return string Name des Plugins
		 */
		function getPluginName()
		{
			return plugin_basename(__FILE__);
		}
		
		/**
		 * Hook für die Link in der Plugin-Liste
		 * @param $links
		 * @param $file
		 */
		function plugin_page_link($links, $file) 
		{			
			// Wenn es dieses Plugin ist
			if($file == $this->getPluginName())
			{
				// Link zu Einstellungs-Seite
				$settingsLink = '<a href="'.$this->getOAuthRedirectUrl().'">'.__('Settings', 'instagram').'</a>';
				// Vorne anhängen
				array_unshift( $links, $settingsLink );
			}
			
			return $links;
		}
		
		/**
		 * Hook für Daten unterhalb der Plugin-Becshreibung in der Plugin-Liste
		 * @param $links
		 * @param $file
		 */
		function plugin_row_meta($links, $file)
		{
			// Wenn es dieses Plugin ist
			if($file == $this->getPluginName())
			{
				// Facebook Page
				$links[] = '<a href="http://www.facebook.com/instapress" target="_blank">'.__('Like it on Facebook', 'instagram').'</a>';
				// Blog-Beitrag
				$links[] = '<a href="http://liechtenecker.at/instapress-das-instagram-plugin-fur-wordpress/" target="_blank">'.__('Visit our blog', 'instagram').'</a>';
			}
			
			return $links;
		}
		
		/**
		 * @return bool		true = Fancybox-Effekt aktiviert, false = Fancybox-Effekt deaktiviert
		 */
		function effectsEnabled()
		{
			return (!$this->getOption('app_disable_effects'));
		}
		
		/**
		 * @return bool		true = Darf Backlink anzeigen, false = keinen Backlink anzeigen
		 */
		function mayShowBacklink()
		{
			return ($this->getOption('app_show_backlink'));
		}
		
		function getBacklink()
		{
			return '<a class="instagram-backlink" href="http://instapress.it" target="_blank">Powered by Instapress</a>';
		}
		
		/**
		 * @return bool		true = width und height für img-Tags deaktivieren, false = width und height in img-Tag setzen
		 */
		function imageAttributesDisabled()
		{
			return $this->getOption('app_disable_image_attributes');	
		}
		
		function javascript()
		{
			if($this->effectsEnabled())
			{
				if(!is_admin())
				{
					// Fancybox
					wp_register_script('fancybox', plugins_url('/fancybox/jquery.fancybox-1.3.4.pack.js', __FILE__), array('jquery'), "1.3.4");
					// Default JS
					wp_enqueue_script('instapress', plugins_url('/instapress.js', __FILE__), array('jquery', 'fancybox'), InstagramPlugin::getVersion(), true);
				}
			}
			else // Wenn Effekte deaktiviert wurden, muss die Gallery trotzdem noch funktionieren
			{
				//wp_enqueue_script('instapress', plugins_url('/instapress.js', __FILE__), array('jquery'), InstagramPlugin::getVersion(), true);
			}
		}
		
		/**
		 * @return string die URI an die nach der Autorisierung weitergeleitet wird
		 */
		function getOAuthRedirectUrl()
		{
			return get_admin_url().'options-general.php?page=instagram.php';//.'instagram/oauth.php';
		}
		
		/**
		 * @return string Access-Token der in der Datenbank gespeichert ist bzw. null
		 */
		function getAccessToken()
		{
			$options = InstagramPlugin::getInstance()->getOptions();
			
			return $options['app_access_token'];
		}
		
		function getVersion()
		{
			return INSTAPRESS_VERSION;
		}
		
		/**
		 * Gibt den Namen der JSON-Eigenschaft zurück, die für die angegebenen Bildergröße verwendet werden sollte
		 * @param $size
		 */
		function getImageKey($size)
		{
			if($size <= 150)
				return 'thumbnail';
			if($size <= 306)
				return 'low_resolution';
			
			return 'standard_resolution';
		}
		
		/**
		 * @return array Liste mit verfügbaren Lightbox-Effekten
		 */
		function getAvailableEffects()
		{
			return array(	'fancybox' => 'Fancybox', 
							'highslide' => 'Highslide (plugin required)');
		}
				
		function isCurlInstalled() 
		{
			return in_array('curl', get_loaded_extensions());
		}
		
		/**
		 * @return array|bool	Liste mit Fehlermeldungen oder false wenn es keine Probleme gibt
		 */
		function getErrors()
		{
			$errors = array();
			if(!InstagramPlugin::getInstance()->cacheIsWritable())
				$errors[] = sprintf(__('To improve performance of this plugin, it is highly recommended to make the directory wp-content or wp-content/cache writable. For further information click <a target="_blank" href="%s">here</a>' , 'instagram'), 'http://codex.wordpress.org/Changing_File_Permissions');
			if(!InstagramPlugin::getInstance()->isCurlInstalled())
				$errors[] = __('Instapress requires <a href="http://php.net/manual/en/book.curl.php" target="_blank">PHP cURL</a> extension to work properly', 'instagram');
			if(!function_exists('mb_detect_encoding'))
				$errors[] = __('Instapress Geocoding won\'t work unless <a href="http://www.php.net/manual/en/mbstring.installation.php" target="_blank">mbstring</a> is activated', 'instagram');
			if(!extension_loaded('openssl'))
				$errors[] = sprintf(__('Instapress needs to communicate with Instagram\'s API via SSL. If you are having troubles, please %sread that topic.%s'), '<a href="http://wordpress.org/support/topic/fatal-error-plugin-instapress-version-131?replies=6" target="_blank">', '</a>');
				
			return (count($errors) > 0 ? $errors : false);
		}
		
	}
	
	/**
	 * Repräsentiert einen Filter um die Ergebnisse des Instagram API zu filtern
	 * @author tkrammer
	 *
	 */
	class InstapressFeedFilter
	{
		/**
		 * verwendet in_array() zum filtern
		 * @var int
		 */
		const IN_ARRAY = 0;
		/**
		 * verwendet == zum Filtern
		 * @var int
		 */
		const EQUALS = 1;
		
		protected $type = null;
		
		protected $filter = null;
		
		protected $filterName = "";
		
		public function __construct($filterName = null, $filter = null, $type = null)
		{
			$this->filterName = $filterName;
			$this->filter = $filter;
			$this->type = $type;
		}
		
		public function setType($type)
		{
			$this->type = $type;
		}
		
		public function setFilter($filter)
		{
			$this->filter = $filter;
		}
		
		public function setFilterName($name)
		{
			$this->filterName = $name;
		}
		
		/**
		 * Filtert das angegebene Array (aus z.B. $response->data) nach den angegeben Kriterien
		 * @param array $data
		 */
		public function filter(array $data)
		{
			$result = array();
			// Name der zu filternden Eigenschaft
			$filterName = $this->filterName;
			// Bild im Ergebnis behalten?
			$keepImage = false;
			// Alle Images durchgehen
			foreach($data as $image)
			{
				// Filter je nach Typ anwenden
				switch($this->type)
				{
					case self::IN_ARRAY:
						$keepImage = (in_array($this->filter, $image->$filterName));
						break;
						
					case self::EQUALS:
						$keepImage = ($this->filter == $image->$filterName);
						break;
				}
				
				if($keepImage)
				{
					$result[] = $image;
				}
			}
			
			return $result;
		}
	}
		
	/**
	 * Widget registrieren und laden
	 */
	if(!function_exists('load_instagram')):		
		add_action( 'widgets_init', 'load_instagram' );
		function load_instagram() 
		{
			register_widget( 'Instagram_Widget' );
		}
	endif;
		
	/**
	 * Plugin instanzieren
	 */
	if (class_exists('InstagramPlugin')): 
		$InstagramPlugin = InstagramPlugin::getInstance();
		if (isset($InstagramPlugin)) 
		{
			register_activation_hook(__FILE__, array(&$InstagramPlugin, 'install'));
		}
	endif;
	

	include('widget.php');


If anyone has any help, suggestions or ideas it would be amazing :)
 
Looks to me like you'd need to tweak the fancybox code to place a link after the image title, as the fancybox code extrapolates that title attribute out to a table cell text content.

Your better off not tweaking the main gallery code anyway as any updates would probably wipe it out. ;)
 
Looks to me like you'd need to tweak the fancybox code to place a link after the image title, as the fancybox code extrapolates that title attribute out to a table cell text content.

Your better off not tweaking the main gallery code anyway as any updates would probably wipe it out. ;)

TBH its all stuff thats beyond me, HTML/CSS is my limit.

Think I will need to pay a developer for this job :D
 
Back
Top Bottom