'',
'secret-access-key' => '',
'default-search-locale' => 'us',
'default-search-index' => 'All',
'post-types' => array('post' => 'yes', 'page' => 'yes'),
'output-css' => 'yes',
'affiliate-links-new-window' => 'no',
'affiliate-links-nofollow' => 'no',
'affiliate-links-cloaking' => 'no',
'affiliate-links-cloaking-prefix' => 'product',
'affiliate-locale' => array(),
);
$settings = self::get_settings();
Amazon_API::set_credentials($settings['access-key-id'], $settings['secret-access-key']);
}
private static function register_shortcodes() {
add_shortcode(self::SHORTCODE_IMAGE, array(__CLASS__, 'shortcode_display_image'));
add_shortcode(self::SHORTCODE_LINK, array(__CLASS__, 'shortcode_display_link'));
}
/// AJAX CALLBACKS
public static function ajax_handle_requests() {
$data = stripslashes_deep($_REQUEST);
$settings = self::get_settings();
if(empty($data['keywords'])) {
$results = array('error_message' => __('Please provide some keywords to search for products.'));
} else if(empty($settings['access-key-id']) || empty($settings['secret-access-key'])) {
$results = array('error_message' => sprintf(__('You have not yet set your Amazon credentials. Please configure them now.'), admin_url('options-general.php?page=RdyLnk')));
} else {
$index = $data['index'];
$keywords = $data['keywords'];
$locale = $data['locale'];
$page = min((is_numeric($data['page']) ? intval($data['page']) : 1), 10);
$associate_tag = $settings['affiliate-locale'][$locale];
$item_search_request = array(
'associate_tag' => $associate_tag,
'index' => $index,
'keywords' => $keywords,
'locale' => $locale,
'locale_name' => Amazon_API::get_locale_name($locale),
'locale_tld' => Amazon_API::get_locale_tld($locale),
);
$product_results = array();
if(preg_match('/^[0-9A-Z]{10}$/', $keywords)) {
$item_search_response = self::get_listing_data_for_asin($keywords, $locale);
} else {
$item_search_response = Amazon_API::item_search($keywords, $index, $page, $associate_tag, $locale);
}
if(is_wp_error($item_search_response)) {
$results = array('error_message' => $item_search_response->get_error_message());
} else {
$results = array(
'PaginationLinks' => self::get_pagination_links($item_search_response),
'SearchResponse' => $item_search_response,
'SearchRequest' => $item_search_request
);
}
}
echo json_encode($results);
exit;
}
/// CALLBACKS
public static function add_administrative_interface_items() {
self::$admin_page_hooks[] = $settings = add_options_page(__('Ready Links Settings'), __('Ready Links'), 'manage_options', 'RdyLnk', array(__CLASS__, 'display_settings_page'));
add_action("load-{$settings}", array(__CLASS__, 'process_settings_save'));
}
public static function add_RdyLnk_meta_box($post) {
add_meta_box('RdyLnk-search', __('Ready Links Amazon Search'), array(__CLASS__, 'display_meta_box'), $post->post_type, 'normal', 'core');
}
public static function add_settings_link($actions) {
$actions = array('settings' => sprintf('%s', admin_url('options-general.php?page=RdyLnk'), __('Configure Ready Links.'), __('Settings'))) + $actions;
return $actions;
}
public static function add_rewrite_rules($wp_rewrite) {
$settings = self::get_settings();
if('yes' == $settings['affiliate-links-cloaking']) {
$prefix = empty($settings['affiliate-links-cloaking-prefix']) ? 'product' : $settings['affiliate-links-cloaking-prefix'];
$new = array(
"{$prefix}/([^/]+)/([^/]+)/([^/]+)/?$" => 'index.php?RdyLnk-locale='.$wp_rewrite->preg_index(1).'&RdyLnk-asin='.$wp_rewrite->preg_index(2).'&RdyLnk-code='.$wp_rewrite->preg_index(3)
);
$wp_rewrite->rules = $new + $wp_rewrite->rules;
}
}
public static function enqueue_administrative_resources($hook) {
if(!in_array($hook, self::$admin_page_hooks)) { return; }
wp_enqueue_style('RdyLnk', plugins_url('resources/backend/RdyLnk.css', __FILE__), array(), self::VERSION);
wp_enqueue_script('RdyLnk', plugins_url('resources/backend/RdyLnk.js', __FILE__), array('jquery', 'jquery-form'), self::VERSION);
$configuration = array(
'image_shortcode' => self::SHORTCODE_IMAGE,
'link_shortcode' => self::SHORTCODE_LINK
);
wp_localize_script('RdyLnk', 'RdyLnk_Configuration', $configuration);
}
public static function enqueue_frontend_resources() {
$settings = self::get_settings();
if('yes' == $settings['output-css']) {
wp_enqueue_style('RdyLnk', plugins_url('resources/frontend/RdyLnk.css', __FILE__), array(), self::VERSION);
}
if('yes' == $settings['output-js']) {
$settings = self::get_settings();
$popup_url = 'http://wms.assoc-amazon.com/20070822/US/js/link-enhancer-common.js';
if(!empty($settings['affiliate-locale']['us'])) {
$popup_url = add_query_arg(array('tag' => $settings['affiliate-locale']['us']), $popup_url);
}
wp_enqueue_script('amazon-preview', $popup_url, array(), '', true);
}
}
public static function process_settings_save() {
$data = RdyLnk_trim_r(stripslashes_deep($_POST));
if(isset($data['save-RdyLnk-settings-nonce']) && wp_verify_nonce($data['save-RdyLnk-settings-nonce'], 'save-RdyLnk-settings')) {
self::set_settings(apply_filters('RdyLnk_pre_settings_save', $data['RdyLnk']));
flush_rewrite_rules();
add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');
set_transient('settings_errors', get_settings_errors(), 30);
wp_redirect(add_query_arg(array('page' => 'RdyLnk', 'settings-updated' => 'true'), admin_url('options-general.php')));
exit;
}
}
public static function redirect_to_amazon($wp) {
$vars = $wp->query_vars;
if($vars['RdyLnk-locale'] && $vars['RdyLnk-asin'] && $vars['RdyLnk-code']) {
$asin = $vars['RdyLnk-asin'];
$associate_tag = $vars['RdyLnk-code'];
$locale = $vars['RdyLnk-locale'];
$url = sprintf('http://www.amazon.%s/dp/%s', Amazon_API::get_locale_tld($locale), $asin);
if(!empty($associate_tag)) {
$url = add_query_arg(array('tag' => $associate_tag), $url);
}
wp_redirect($url);
exit;
}
}
public static function sanitize_settings($settings) {
$settings['post-types'] = (array)$settings['post-types'];
foreach(array('affiliate-links-new-window') as $checkbox_key) {
$settings[$checkbox_key] = 'yes' == $settings[$checkbox_key] ? 'yes' : 'no';
}
return $settings;
}
/// SHORTCODE DISPLAY
public static function shortcode_display_image($atts, $content = null) {
$atts = shortcode_atts(array('align' => 'none', 'alt' => __('Amazon Image'), 'asin' => 0, 'height' => '', 'keywords' => '', 'locale' => 'us', 'src' => '', 'width' => ''), $atts);
foreach($atts as $key => $att) {
$atts[$key] = esc_attr($att);
}
extract($atts);
if((empty($asin) && empty($keywords)) || empty($src)) {
return '';
} else {
$image_attributes = sprintf('src="%s" ', $src);
if(!empty($align)) {
$image_attributes .= sprintf('class="align%s" ', $align);
}
if(!empty($alt)) {
$image_attributes .= sprintf('alt="%s" ', $alt);
}
if(!empty($height)) {
$image_attributes .= sprintf('height="%s" ', $height);
}
if(!empty($width)) {
$image_attributes .= sprintf('width="%s" ', $width);
}
$url = empty($asin) ? self::get_search_results_link($keywords, $locale) : self::get_link_for_visitor($asin, $locale);
return sprintf('
', self::get_link_attributes(), $url, $image_attributes);
}
}
public static function shortcode_display_link($atts, $content = null) {
$atts = shortcode_atts(array('asin' => 0, 'keywords' => '', 'locale' => 'us'), $atts);
extract($atts);
$settings = self::get_settings();
$url = empty($asin) ? self::get_search_results_link($keywords, $locale) : self::get_link_for_visitor($asin, $locale);
if('yes' == $settings['output-js']) {
$url = add_query_arg(array('linkCode' => 'as2'), $url);
}
return (empty($asin) && empty($keywords)) ? $content : sprintf('%s', self::get_link_attributes(), $url, $content);
}
/// DISPLAY CALLBACKS
public static function display_meta_box($post) {
$placeholder_image = plugins_url('resources/backend/images/75x75.gif', __FILE__);
$locale_keys = Amazon_API::get_locale_keys();
$settings = self::get_settings();
include('views/backend/meta-boxes/search.php');
}
public static function display_settings_page() {
add_meta_box('RdyLnk-settings-api', __('API Credentials'), array(__CLASS__, 'display_settings_meta_box_api'), 'RdyLnk-settings', 'normal');
add_meta_box('RdyLnk-settings-search-interface', __('Search Interface'), array(__CLASS__, 'display_settings_meta_box_search_interface'), 'RdyLnk-settings', 'normal');
add_meta_box('RdyLnk-settings-associate-tags', __('Associate Tags'), array(__CLASS__, 'display_settings_meta_box_associate_tags'), 'RdyLnk-settings', 'normal');
add_meta_box('RdyLnk-settings-affiliate-links', __('Affiliate Links'), array(__CLASS__, 'display_settings_meta_box_affiliate_links'), 'RdyLnk-settings', 'normal');
$settings = self::get_settings();
include('views/backend/settings/settings.php');
}
//// SETTINGS PAGE META BOXES
public static function display_settings_meta_box_api($settings) {
include('views/backend/settings/sections/02-api.php');
}
public static function display_settings_meta_box_search_interface($settings) {
$locale_keys = Amazon_API::get_locale_keys();
include('views/backend/settings/sections/03-search-interface.php');
}
public static function display_settings_meta_box_associate_tags($settings) {
$locale_keys = Amazon_API::get_locale_keys();
include('views/backend/settings/sections/04-associate-tags.php');
}
public static function display_settings_meta_box_affiliate_links($settings) {
$has_permalinks = '' != get_option('permalink_structure');
include('views/backend/settings/sections/05-affiliate-links.php');
}
/// SETTINGS
private static function get_settings() {
$settings = wp_cache_get(self::SETTINGS_KEY);
if(!is_array($settings)) {
$settings = (array)get_option(self::SETTINGS_KEY, array());
if(is_array($settings['affiliate-locale'])) {
$affiliate_locales_translation = array('us' => 'com', 'uk' => 'co.uk', 'jp' => 'co.jp');
foreach($affiliate_locales_translation as $now => $previous) {
if(empty($settings['affiliate-locale'][$now]) && !empty($settings['affiliate-locale'][$previous])) {
$settings['affiliate-locale'][$now] = $settings['affiliate-locale'][$previous];
}
}
}
$settings = wp_parse_args($settings, self::$default_settings);
wp_cache_set(self::SETTINGS_KEY, $settings, null, time() + 24 * 60 * 60);
}
return $settings;
}
private static function set_settings($settings) {
if(is_array($settings)) {
update_option(self::SETTINGS_KEY, $settings);
wp_cache_set(self::SETTINGS_KEY, $settings, null, time() + 24 * 60 * 60);
}
}
/// ITEM CACHING
private static function get_listing_data_for_asin($asin, $asin_locale) {
$transient_key = self::TRANSIENT_ASIN_ITEM . $asin . $locale;
$item = get_transient($transient_key);
if(empty($item)) {
$item = Amazon_API::item_lookup($asin, 'ASIN', self::get_associate_tag($asin_locale), $asin_locale);
if(!is_wp_error($item)) {
set_transient($transient_key, $item, self::TRANSIENT_ASIN_ITEM_TIMEOUT);
}
}
return $item;
}
/// LOCALIZATION
private static function get_link_for_visitor($asin, $asin_locale) {
$associate_tag = self::get_associate_tag($asin_locale);
$url = sprintf('http://www.amazon.%s/dp/%s', Amazon_API::get_locale_tld($asin_locale), $asin);
if(empty($associate_tag)) {
$url = remove_query_arg('tag', $url);
} else {
$url = add_query_arg(array('tag' => $associate_tag), $url);
}
return $url;
}
/// UTILITY
private static function get_associate_tag($locale) {
$settings = self::get_settings();
return $settings['affiliate-locale'][$locale];
}
private static function get_link_attributes() {
$settings = self::get_settings();
$newwindow = $settings['affiliate-links-new-window'] == 'yes' ? 'target="_blank"' : '';
return "$newwindow";
}
private static function get_pagination_links($response) {
foreach($response['OperationRequest']['Arguments']['Argument'] as $argument) {
if('ItemPage' == $argument['@attributes']['Name']) {
$current_page = $argument['@attributes']['Value'];
break;
}
}
if(isset($response['Items']['TotalPages'])) {
$total_pages = $response['Items']['TotalPages'];
} else {
$total_pages = 0;
}
$args = array(
'base' => admin_url('#') . '%_%',
'format' => '%#%',
'total' => min(10, $total_pages),
'current' => $current_page,
'show_all' => false,
'prev_next' => true,
'prev_text' => __('«'),
'next_text' => __('»'),
'end_size' => 1,
'mid_size' => 2,
'type' => 'plain',
'add_args' => array(),
'add_fragment' => ''
);
return paginate_links($args);
}
}
require_once('lib/amazon.php');
require_once('lib/template-tags.php');
RdyLnk::init();
}