"can't read", 'CANT_PARSE' => "can't parse", 'DOWNLOADED' => "downloaded" ); function PluginWonderful() {} /** * Wrapper around file_get_contents for testing purposes. */ function _retrieve_url($url) { if (extension_loaded('curl')) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $result = curl_exec($ch); curl_close($ch); return $result; } else { return @file_get_contents($url); } } function _setup_actions() { add_action('admin_menu', array(&$this, 'set_up_menu')); add_action('init', array(&$this, 'init')); add_filter('the_excerpt_rss', array(&$this, 'insert_rss_feed_ads')); add_filter('the_content', array(&$this, 'inject_ads_into_body_copy')); add_action('widgets_init', array(&$this, '_load_widgets')); register_activation_hook(__FILE__, array(&$this, 'handle_activation')); } function _load_widgets() { global $wp_version; if (version_compare($wp_version, "2.8", ">=")) { if (class_exists('WP_Widget')) { register_widget('PluginWonderfulWidget'); } } else { register_sidebar_widget(__('Plugin Wonderful', 'plugin-wonderful'), array(&$this, 'render_pre28_widget')); register_widget_control(__('Plugin Wonderful', 'plugin-wonderful'), array(&$this, 'render_pre28_widget_control')); } } /** * Initialize the object if it isn't already. */ function init() { if (empty($this->adboxes_client)) { $this->messages = array(); $this->adboxes_client = new PWAdboxesClient(); $this->_get_publisher_info(); $this->_update_database_version(); if (!empty($_POST)) { $this->handle_action(); } } } /** * Wrapper around PublisherInfo generation for testing. */ function _get_new_publisher_info_object() { return new PublisherInfo(); } /** * Check to see if the database schema needs to be updated. */ function _update_database_version() { $result = get_option('plugin-wonderful-database-version'); if (empty($result) || ($result < PLUGIN_WONDERFUL_DATABASE_VERSION)) { if ($this->adboxes_client->initialize(true)) { update_option('plugin-wonderful-database-version', PLUGIN_WONDERFUL_DATABASE_VERSION); } else { $this->messages[] = "Unable to update database schema!"; } } } /** * Get publisher info (adboxes) from cache or from Project Wonderful. * @return PublisherInfo|boolean The PublisherInfo object with adbox information, or false if there was a problem. */ function _get_publisher_info() { $this->publisher_info = false; $member_id = get_option('plugin-wonderful-memberid'); if (is_numeric($member_id)) { $member_id = (int)$member_id; $this->publisher_info = $this->adboxes_client->get_ads($member_id); $last_update = get_option('plugin-wonderful-last-update') ; if (!is_numeric($last_update)) { $last_update = 0; } $last_update = (int)$last_update; if (($last_update + PLUGIN_WONDERFUL_UPDATE_TIME) < time()) { $this->_download_project_wonderful_data($member_id); } } return $this->publisher_info; } function insert_rss_feed_ads($content) { if (is_feed()) { if ($this->publisher_info !== false) { foreach ($this->publisher_info->adboxes as $adbox) { if ($adbox->in_rss_feed == 1) { if (preg_match("##mis", $adbox->advancedcode, $matches) > 0) { echo $matches[1]; } } } } } return $content; } /** * Inject ads into the body copy of posts. * @param string $body The body to search for PW() tags. * @return string The modified body. */ function inject_ads_into_body_copy($body) { if ($this->publisher_info !== false) { if (get_option("plugin-wonderful-enable-body-copy-embedding") == 1) { return $this->publisher_info->inject_ads_into_body_copy($body, (get_option("plugin-wonderful-use-standardcode") == 1)); } } return $body; } function set_up_menu() { add_options_page('Plugin Wonderful', __("Plugin Wonderful", 'plugin-wonderful'), 5, __FILE__, array($this, "plugin_wonderful_main")); } function handle_activation() { $this->init(); $this->adboxes_client->initialize(); } function plugin_wonderful_main() { $this->show_view(new PluginWonderfulViewMain()); } function show_messages() { if (count($this->messages) > 0) { echo '
'; foreach ($this->messages as $message) { echo '

' . $message . '

'; } echo '
'; } } function show_view($view) { if (is_object($view) && method_exists($view, 'render')) { $info = get_plugin_data(realpath(dirname(__FILE__) . '/../plugin-wonderful.php')); echo '
'; echo '

'; echo '

' . __("Plugin Wonderful", 'plugin-wonderful') . '

'; $this->show_messages(); $view->render(); echo '
'; echo '
'; echo sprintf(__('%1$s Version %2$s by %3$s', 'plugin-wonderful'), $info['Title'], $info['Version'], $info['Author']) . ' | '; echo __('Manage your Project Wonderful publisher account', 'plugin-wonderful'); if (version_compare(phpversion(), "5", "<")) { echo ' | ' . __('Move away from PHP 4 and support Plugin Wonderful', 'plugin-wonderful') . ''; } echo '
'; echo '
'; echo '
'; } else { var_dump($view); // ignore var_dump } } function handle_action() { if (!empty($_POST['_pw_nonce'])) { if (wp_verify_nonce($_POST['_pw_nonce'], 'plugin-wonderful')) { $action = "handle_action_" . str_replace("-", "_", preg_replace('#[^a-z0-9\-]#', '', strtolower($_POST['_pw_action']))); if (method_exists($this, $action)) { $this->{$action}(); } } } } function handle_action_change_adbox_settings() { $member_id = get_option('plugin-wonderful-memberid'); if (is_numeric($member_id)) { $changes = array( 'template_tag_id' => array(), 'in_rss_feed' => array() ); if (is_array($this->publisher_info->adboxes)) { $new_boxes = array(); foreach ($this->publisher_info->adboxes as $box) { if (isset($_POST['template_tag_id'][$box->adboxid])) { $tag = $_POST['template_tag_id'][$box->adboxid]; $prior_value = $box->template_tag_id; $tag = $this->adboxes_client->trim_field('template_tag_id', $tag); $this->adboxes_client->set_template_tag($box->adboxid, $tag); $box->template_tag_id = $tag; if (!empty($tag) && ($prior_value != $tag)) { $this->messages[] = sprintf(__('Template tag identifier for ad %1$s set to %2$s.', 'plugin-wonderful'), $box->adboxid, $tag); $changes['template_tag_id'][$box->adboxid] = "set"; } else { if (!empty($prior_value) && empty($tag)) { $this->messages[] = sprintf(__('Template tag identifier for ad %s removed.', 'plugin-wonderful'), $box->adboxid); $changes['template_tag_id'][$box->adboxid] = "removed"; } } } if (!empty($_POST['in_rss_feed'][$box->adboxid])) { $this->adboxes_client->set_rss_feed_usage($box->adboxid, true); if ($box->in_rss_feed == 0) { $this->messages[] = sprintf(__('RSS feed usage for ad %1$s enabled.', 'plugin-wonderful'), $box->adboxid); $changes['in_rss_feed'][$box->adboxid] = "enabled"; } $box->in_rss_feed = "1"; } else { $this->adboxes_client->set_rss_feed_usage($box->adboxid, false); if ($box->in_rss_feed == 1) { $this->messages[] = sprintf(__('RSS feed usage for ad %1$s disabled.', 'plugin-wonderful'), $box->adboxid); $changes['in_rss_feed'][$box->adboxid] = "disabled"; } $box->in_rss_feed = "0"; } $new_boxes[] = $box; } $this->publisher_info->adboxes = $new_boxes; } } else { return null; } if (count($this->messages) == 0) { $this->messages[] = __("No changes to adboxes were made.", 'plugin-wonderful'); } return $changes; } function _download_project_wonderful_data($member_id) { global $plugin_wonderful; if (($result = $this->_retrieve_url(sprintf(PLUGIN_WONDERFUL_XML_URL, $member_id))) !== false) { $this->publisher_info = $this->_get_new_publisher_info_object(); if ($this->publisher_info->parse($result)) { $this->adboxes_client->post_ads($this->publisher_info); update_option('plugin-wonderful-last-update', time()); return $this->message_types['DOWNLOADED']; } else { $this->publisher_info = false; return $this->message_types['CANT_PARSE']; } } else { $this->publisher_info = false; return $this->message_types['CANT_READ']; } } function handle_action_rebuild_database() { $this->adboxes_client->destroy(); $this->adboxes_client->initialize(); $this->messages[] = __("Adbox database destroyed and rebuilt.", 'plugin-wonderful'); $result = get_option('plugin-wonderful-memberid'); if (!empty($result)) { switch ($this->_download_project_wonderful_data($result)) { case $this->message_types['DOWNLOADED']: $this->messages[] = __('Adbox information redownloaded.', 'plugin-wonderful'); break; case $this->message_types['CANT_PARSE']: $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); break; case $this->message_types['CANT_READ']: $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); break; } } } function handle_action_change_memberid() { $original_member_id = get_option('plugin-wonderful-memberid'); $trimmed_post_memberid = trim($_POST['memberid']); if ($trimmed_post_memberid) { if ($trimmed_post_memberid === (string)(int)$trimmed_post_memberid) { if ($original_member_id !== $trimmed_post_memberid) { update_option('plugin-wonderful-memberid', (int)$trimmed_post_memberid); switch ($this->_download_project_wonderful_data((int)$_POST['memberid'])) { case $this->message_types['DOWNLOADED']: $this->messages[] = sprintf(__('Member number changed to %s and adbox information redownloaded.', 'plugin-wonderful'), (int)$_POST['memberid']); break; case $this->message_types['CANT_PARSE']: $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); break; case $this->message_types['CANT_READ']: $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); break; } } } else { $this->messages[] = __("Member numbers need to be numeric.", 'plugin-wonderful'); $this->publisher_info = false; update_option('plugin-wonderful-memberid', ""); } } else { $this->messages[] = __("Existing adbox information removed.", 'plugin-wonderful'); $this->publisher_info = false; update_option('plugin-wonderful-memberid', ""); } foreach (array('use-standardcode', 'enable-body-copy-embedding') as $field) { update_option("plugin-wonderful-${field}", isset($_POST[$field]) ? "1" : "0"); } if (count($this->messages) == 0) { $this->messages[] = __("Options updated.", 'plugin-wonderful'); } } function _render_adbox($adboxid, $center = false) { if ($this->publisher_info !== false) { foreach ($this->publisher_info->adboxes as $adbox) { if (($adbox->adboxid == $adboxid) || ($adbox->template_tag_id == $adboxid)) { if (get_option("plugin-wonderful-use-standardcode") == 1) { $output = $adbox->standardcode; } else { $output = $adbox->advancedcode; } if ($center == 1) { $output = "
{$output}
"; } echo $output; break; } } } } function _render_adbox_admin($instance, $field_names) { if ($this->publisher_info !== false) { echo '

'; echo 'Select an adbox:
'; foreach ($this->publisher_info->adboxes as $box) { if (empty($instance['adboxid'])) { $instance['adboxid'] = $box->adboxid; } echo '"; echo "
"; } echo '

'; echo '

'; echo ''; echo '

'; } } function render_pre28_widget() { $data = get_option('plugin-wonderful-pre28-widget-info'); if (is_array($data)) { if (count(array_intersect(array_keys($data), array("adboxid", "center"))) == 2) { if ($this->publisher_info !== false) { foreach ($this->publisher_info->adboxes as $adbox) { if ($adbox->adboxid == $data['adboxid']) { $this->_render_adbox($data['adboxid'], !empty($data['center'])); } } } } } } function _normalize_pre28_option($data = null) { $instance = array( 'adboxid' => false, 'center' => 0 ); if (!is_array($data)) { $data = get_option('plugin-wonderful-pre28-widget-info'); } if (is_array($data)) { foreach ($data as $field => $value) { if (isset($instance[$field])) { if (is_numeric($value)) { $instance[$field] = $value; } } } } update_option('plugin-wonderful-pre28-widget-info', $instance); return $instance; } function render_pre28_widget_control() { $instance = $this->_normalize_pre28_option(); echo ''; echo ''; $this->_render_adbox_admin($instance, array('adboxid' => 'pw[adboxid]', 'center' => 'pw[center]')); } function handle_action_update_pre28_widget() { if (isset($_POST['pw'])) { $this->_normalize_pre28_option($_POST['pw']); } } } function the_project_wonderful_ad($adboxid) { global $plugin_wonderful; $plugin_wonderful->_render_adbox($adboxid); } ?>