table_options = $wpdb->prefix . "amazonfeed_options";
$this->table_cache = $wpdb->prefix . "amazonfeed_cache";
// Default REST Parameters (can be over-ridden)
$this->params = array(
'Operation' => 'ItemSearch',
'SearchIndex' => 'Books',
'ResponseGroup' => 'Small,Images'
);
// Load Options
$this->options = get_option('amazonFeedOptions');
// If we're ready to run live, activate the controls.
if( isset($this->options['ServicePath'])
AND isset($this->options['AWSAccessKeyId'])
AND isset($this->options['AssociateTag'])
AND isset($this->options['DefaultTags'])
AND isset($this->options['DefaultSearchField'])
AND isset($this->options['MaxResults'])
AND isset($this->options['Version'])
AND function_exists('simplexml_load_string') )
{
$this->live = true;
}
}
function unInstall()
{
global $wpdb;
$sql = "DROP TABLE `" . $this->table_cache . "`;";
$wpdb->query($sql);
delete_option('amazonFeedOptions');
}
function checkInstall()
{
global $wpdb;
if(!function_exists('simplexml_load_string')) {
$this->admin_alert("WARNING: This plugin currently only works on servers running PHP v 5.x or higher.");
return(false);
}
// Plugin options are not installed, implying that the plugin itself has not yet been installed either.
if(!$this->options['Version']) {
$this->admin_alert("Previous installation not found. Installing necessary tables now.");
$sql = "CREATE TABLE IF NOT EXISTS `" . $this->table_cache . "` (
`keyword` varchar(255) NOT NULL,
`timestamp` bigint(20) unsigned zerofill NOT NULL,
`data` longblob NOT NULL,
PRIMARY KEY (`keyword`)
);";
$result = $wpdb->query($sql);
if($result === false) {
$this->admin_alert("Failed to create table.");
return(false);
}
$this->options = array(
'ServicePath' => 'http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService',
'AWSAccessKeyId' => '',
'AssociateTag' => '',
'SearchFrom' => 'categories',
'DefaultTags' => '',
'ShowOnPosts' => true,
'ShowOnPages' => true,
'ShowOnHome' => true,
'ShowOnCategories' => true,
'ShowOnTags' => true,
'ShowOnSearch' => true,
'TitleText' => '
Related Reading:
',
'DefaultSearchField'=> 'Keywords',
'MaxResults' => 5,
'ShowImages' => true,
'CacheExpiry' => 60*24,
'AllowTip' => true,
'Version' => $this->version
);
update_option('amazonFeedOptions', $this->options);
}
elseif($this->options['Version'] < '1.1')
{
$this->options['Version'] = '1.1';
$this->options['ShowOnPosts'] = true;
$this->options['ShowOnPages'] = true;
$this->options['ShowOnHome'] = true;
$this->options['ShowOnCategories'] = true;
$this->options['ShowOnTags'] = true;
$this->options['ShowOnSearch'] = true;
update_option('amazonFeedOptions', $this->options);
$this->admin_alert("Plugin upgraded to v. 1.1 This version allows you to limit display of products on various categories of blog pages. Some CSS tweaks were also added.");
}
return(true);
}
// Allow showing an alert to the user when necessary.
function admin_alert($msg = '')
{
if($msg) echo "
$msg
";
}
function debug($msg = '')
{
# echo "
"; print_r($msg); echo "
";
}
// Main data loader.
function request_data($new_params = array())
{
// Update the options with anything passed on the function.
$params = array_merge($this->params, $new_params);
// Create the request
$request = $this->options['ServicePath']
. "&AWSAccessKeyId=" . $this->options['AWSAccessKeyId']
. "&AssociateTag=" . $this->options['AssociateTag'];
// Iterate through the parameters adding to the request.
foreach($params as $key=>$param)
{
if($param != "")
$request .= "&" . urlencode($key) . "=" . urlencode($param);
}
$this->debug("Running Request: $request ");
$xml_data = file_get_contents($request);
if($xml_data) return($xml_data);
}
// Load related reading either from database table, or from Amazon.com
function load($keyword)
{
global $wpdb;
$keyword = addslashes($keyword);
$sql = "SELECT * FROM " . $this->table_cache . " WHERE `keyword` = '" . $keyword . "' LIMIT 0,1";
$data = $wpdb->get_row($sql, ARRAY_A);
if($data !== false AND $data['keyword'] != "")
{
$data['keyword'] = stripslashes($data['keyword']);
$data['data'] = stripslashes($data['data']);
return($data);
}
}
// Save related reading to cache when necessary
function save($keyword, $xml)
{
global $wpdb;
$keyword = trim(addslashes($keyword));
$data = trim(addslashes($xml));
$timestamp = time() + ($this->options['CacheExpiry']*60);
$sql = "SELECT * FROM " . $this->table_cache . " WHERE `keyword` = '" . $keyword . "' LIMIT 0,1";
$existing_data = $wpdb->get_row($sql, ARRAY_A);
if($existing_data['keyword'] != "")
$sql = "UPDATE " . $this->table_cache . " SET `timestamp` = '$timestamp', `data` = '$data' WHERE `keyword` = '" . $keyword . "' LIMIT 1;";
else
$sql = "INSERT INTO " . $this->table_cache . " (`keyword`, `timestamp`, `data`) VALUES ('$keyword', '$timestamp', '$data');";
$results = $wpdb->query($sql);
return;
}
// Specific search functions
function search($search_keywords, $searchResults=false, $searchField=false, $searchIndex=false)
{
global $wpdb;
$this->debug("Searching For: $search_keywords \n");
if($searchResults == false) $searchResults = $this->options['MaxResults'];
if($searchField == false) $searchField = $this->options['DefaultSearchField'];
if($searchIndex == false) $searchIndex = $this->params['SearchIndex'];
$keywords = explode(",", $search_keywords);
$tmp_items = array();
foreach($keywords as $word)
{
if(trim($word) != "")
{
$data = $this->load(trim($word));
if($data['data'] != "" AND $data['timestamp'] > time()) {
$xml_data = $data['data'];
}
else
{
$new_params = array(
'SearchIndex' => $searchIndex,
$searchField => trim($word)
);
$xml_data = $this->request_data($new_params);
$this->save($word, $xml_data);
}
$xml = simplexml_load_string($xml_data);
$counter = 0;
foreach($xml->Items->Item as $item) {
$tmp_items[] = $item;
}
}
}
$items = array();
$counter = 0;
while($counter++ < count($tmp_items)*2)
{
$rand = rand(0, count($tmp_items)-1);
$tmp_item = $tmp_items[$rand];
$id = $tmp_item->ASIN;
if(!$items["$id"]) $items["$id"] = $tmp_item;
if(count($items) >= $searchResults) break;
}
return($items);
}
function display($keywords, $echo = true)
{
$items = $this->search($keywords);
$numBooks = count($items);
if($numBooks == 0 AND $keywords != $this->options['DefaultTags'])
{
$items = $this->search($this->options['DefaultTags']);
$numBooks = count($items);
}
if($numBooks > 0)
{
// Allow for tipping the author, if enabled
if($this->options['AllowTip'] == true)
{
$tip_random_number = rand(1, $numBooks);
}
$result = "