PageRenderTime 64ms CodeModel.GetById 29ms RepoModel.GetById 1ms app.codeStats 0ms

/files/data/wordpress/wp-content/plugins/wpjobads/wpjobads.php

https://github.com/simpsonjulian/puppet-wordpress
PHP | 2646 lines | 2304 code | 280 blank | 62 comment | 259 complexity | 02345246f6b44fa0a0da98fe51a61e48 MD5 | raw file
Possible License(s): Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /*
  3. Plugin Name: WPJobAds
  4. Plugin URI: http://www.wpjobads.com
  5. Description: Self-managed job board. Instant Payment via PayPal.
  6. Author: WPJobAds.com
  7. Version: 1.2.3
  8. License: Commercial
  9. Author URI: http://www.wpjobads.com
  10. */
  11. ###############################################################################
  12. # WPJobAds version 1.2.3 #
  13. # Copyright © 2008 - 2009 WPJobAds.com All Rights Reserved. #
  14. # This file may not be redistributed in whole or significant part. #
  15. # #
  16. # The complete EULA can be found along with this file. Alternatively, #
  17. # it can be viewed online at http://www.wpjobads.com/license #
  18. # #
  19. # Info : info@wpjobads.com #
  20. # Support : support@wpjobads.com #
  21. ###############################################################################
  22. error_reporting(E_ALL & E_WARNING);
  23. // ----------------------------------------------------------------------------
  24. // Global constants
  25. // {{{ GLOBALS
  26. define('WPJOBADS_VERSION', '1.2.3');
  27. define('WPJOBADS_RELEASE_DATE', '2009-03-23');
  28. define('WPJOBADS_UPDATE_URL', 'http://www.wpjobads.com/download');
  29. define('WPJOBADS_CHECK_UPDATE_URL', 'http://www.wpjobads.com/update-check');
  30. define('WPJOBADS_CHECK_UPDATE_PERIOD', 43200);
  31. define('WPJOBADS_FORCE_CHECK_UPDATE', true);
  32. define('WPJOBADS_JOB', 'wpjobads_job');
  33. define('WPJOBADS_CATEGORY', 'wpjobads_category');
  34. define('WPJOBADS_TITLE_SEPARATOR', ' &raquo ');
  35. define('WPJOBADS_ADMIN_JOB_ENTRIES', 20);
  36. define('WPJOBADS_SEND_EMAIL', true);
  37. define('WPJOBADS_WRITE_LOG', true);
  38. // }}}
  39. // ----------------------------------------------------------------------------
  40. // Includes
  41. if (is_readable('wpjobads-template-' . get_option('template'))) {// {{{
  42. include 'wpjobads-template-' . get_option('template') . '.php';
  43. } else {
  44. include 'wpjobads-template.php';
  45. }// }}}
  46. // ----------------------------------------------------------------------------
  47. // Initialization functions
  48. function wpjobads_init()// {{{
  49. {
  50. // Possibly check for serial number?
  51. load_plugin_textdomain('wpjobads', 'wp-content/plugins/wpjobads');
  52. wp_enqueue_script('prototype');
  53. }// }}}
  54. add_action('init', 'wpjobads_init');
  55. function wpjobads_preview($job)// {{{
  56. {
  57. ob_start();
  58. $permalink = wpjobads_get_permalink();
  59. $parsed_url = parse_url($permalink);
  60. $path = $parsed_url['path'];
  61. $permalink .= ($path{strlen($path)-1} == '/') ? '#wpjobads' : '/#wpjobads';
  62. ?>
  63. <form method="post" action="<?php echo $permalink ?>">
  64. <input type="hidden" name="wpjobads_title" value="<?php echo attribute_escape($job['title']) ?>" />
  65. <input type="hidden" name="wpjobads_category" value="<?php echo attribute_escape($job['category']) ?>" />
  66. <input type="hidden" name="wpjobads_type" value="<?php echo attribute_escape($job['type']) ?>" />
  67. <input type="hidden" name="wpjobads_description" value="<?php echo attribute_escape($job['description']) ?>" />
  68. <input type="hidden" name="wpjobads_how_to_apply" value="<?php echo attribute_escape($job['how_to_apply']) ?>" />
  69. <input type="hidden" name="wpjobads_location" value="<?php echo attribute_escape($job['location']) ?>" />
  70. <input type="hidden" name="wpjobads_zipcode" value="<?php echo attribute_escape($job['zipcode']) ?>" />
  71. <input type="hidden" name="wpjobads_company_name" value="<?php echo attribute_escape($job['company_name']) ?>" />
  72. <input type="hidden" name="wpjobads_company_url" value="<?php echo attribute_escape($job['company_url']) ?>" />
  73. <input type="hidden" name="wpjobads_contact_name" value="<?php echo attribute_escape($job['contact_name']) ?>" />
  74. <input type="hidden" name="wpjobads_contact_email" value="<?php echo attribute_escape($job['contact_email']) ?>" />
  75. <input type="hidden" name="wpjobads-action" value="postjob">
  76. <p><?php _e('Are you sure?') ?></p>
  77. <input type="submit" value="<?php echo attribute_escape(__('Yes')) ?>"> <a href="javascript:history.go(-1);"><?php _e('No') ?></a>
  78. </form>
  79. <?php
  80. $content = ob_get_contents();
  81. ob_end_clean();
  82. return $content;
  83. }// }}}
  84. function wpjobads_license_form($redirect = null)// {{{
  85. {
  86. if (!$redirect) $redirect = 'wpjobads/wpjobads.php';
  87. $nonce_action = 'activate-license';
  88. ?>
  89. <div class="wrap">
  90. <h2>Plugin Activation</h2>
  91. <p><label for="license_key">Please enter your license key:</label></p>
  92. <form name="license" id="license" method="post" action="admin.php?page=wpjobads-admin-options">
  93. <?php wp_nonce_field($nonce_action) ?>
  94. <input type="hidden" name="action" value="activate">
  95. <input type="hidden" name="r" value="<?php echo attribute_escape($redirect) ?>" />
  96. <input type="text" class="regular-text" id="license_key" name="license_key" /> <input type="submit" value="Activate" />
  97. </form>
  98. <?php if ($_GET['m']): ?>
  99. <p style="color:red;"><?php echo base64_decode($_GET['m']) ?></p>
  100. <?php endif ?>
  101. </div>
  102. <?php
  103. }// }}}
  104. // ----------------------------------------------------------------------------
  105. function wpjobads_extract_fields($data)// {{{
  106. {
  107. $extract = array();
  108. $fields = array('title','category', 'type','description','how_to_apply','location','zipcode','company_name','company_url','contact_name','contact_email');
  109. foreach ($fields as $field) {
  110. $extract[$field] = trim($data['wpjobads_' . $field]);
  111. }
  112. return $extract;
  113. }// }}}
  114. function wpjobads_php4_fix()// {{{
  115. {
  116. global $wp_the_query, $wp_query, $post;
  117. $wp_the_query->queried_object->post_title = $wp_query->posts[0]->post_title = $post->post_title;
  118. $wp_the_query->queried_object->post_content = $wp_query->posts[0]->post_content = $post->post_content;
  119. }// }}}
  120. function wpjobads_page_handler()// {{{
  121. {
  122. global $wpdb;
  123. global $wp, $wp_query, $wp_the_query;
  124. global $post;
  125. if (!$post) $post =& get_post($id = 0);
  126. if (!$post) return;
  127. $wpjobads_options = get_option('wpjobads_options');
  128. if (!isset($post->ID) or (intval($post->ID) != $wpjobads_options['post_id'])) return;
  129. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  130. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  131. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  132. $_POST = stripslashes_deep($_POST);
  133. if ($_POST['wpjobads-action'] == 'postjob' and $wpjobads_options['enable_frontend']) {
  134. $job = wpjobads_extract_fields($_POST);
  135. // set defaults
  136. $job['ad_duration'] = $wpjobads_options['duration'];
  137. $job['ad_currency'] = $wpjobads_options['currency'];
  138. $job['ad_price'] = $wpjobads_options[$job['type'] . '_price'];
  139. $job['ad_paid'] = $job['ad_price'] == '0' ? 1 : 0;
  140. $job['ad_approved'] = $wpjobads_options['auto_approve'] == '1' ? 1 : 0;
  141. $job['ad_published'] = 1;
  142. if (wpjobads_insert_job($job)) {
  143. $job['id'] = $wpdb->insert_id;
  144. $job['expired'] = $wpdb->get_var("SELECT `expired` FROM $table_job WHERE `id` = " . $job['id']);
  145. if (!empty($wpjobads_options['email_notification'])) {
  146. wpjobads_send_notification_email($job);
  147. }
  148. if ($wpjobads_options['auto_approve'] == 1) {
  149. wpjobads_log('Job #' . $job['id'] . ' - "' . $job['title'] . '" has been inserted to the database auto-approved.');
  150. if ($job['ad_paid'] == 1) {
  151. wpjobads_send_publish_email($job);
  152. wp_redirect(wpjobads_get_permalink('action=auto-approved&job_id=' . $job['id']));
  153. } else {
  154. if ($wpjobads_options['force_payment_email']) {
  155. wpjobads_send_payment_email($job);
  156. }
  157. wp_redirect(wpjobads_get_permalink('action=paypal&job_id=' . $job['id']));
  158. }
  159. } else {
  160. wpjobads_log('Job #' . $job['id'] . ' - "' . $job['title'] . '" has been inserted to the database, awaiting for approval.');
  161. if ($job['ad_paid'] == 1) {
  162. wp_redirect(wpjobads_get_permalink('action=waiting-approval'));
  163. } else {
  164. wp_redirect(wpjobads_get_permalink('action=waiting-approval&pay=1'));
  165. }
  166. }
  167. } else {
  168. $description = apply_filters('the_content', $wpjobads_options['description']);
  169. remove_filter('the_content', 'wptexturize');
  170. remove_filter('the_content', 'wpautop');
  171. $post->post_title = $wpjobads_options['title'];
  172. if (!$wpjobads_options['enable_frontend']) {
  173. $post->post_content = __('Job posting is currently disabled. Please check back later.', 'wpjobads');
  174. } else {
  175. $error = __('<p>An error occured while posting your job ad. <strong>All fields are required except for zipcode and company URL</strong>. Please check your submission and try again. If the problem persists try contacting the administrator.</p>', 'wpjobads');
  176. $post->post_content = $error . $description . wpjobads_postjob_form(wpjobads_extract_fields($_POST));
  177. }
  178. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  179. wpjobads_php4_fix();
  180. }
  181. return;
  182. }
  183. if ($_POST['wpjobads-action'] == 'preview') {
  184. $preview = wpjobads_extract_fields($_POST);
  185. if (wpjobads_valid_job($preview)) {
  186. $preview['title'] = sprintf(__('Preview: %s'), $preview['title']);
  187. $post->post_title = $preview['title'];
  188. $post->post_content = wpjobads_preview(wpjobads_extract_fields($_POST)) . apply_filters('the_content', wpjobads_view_job($preview)) . wpjobads_preview(wpjobads_extract_fields($_POST));
  189. } else {
  190. $post->post_title = $wpjobads_options['title'];
  191. if (!$wpjobads_options['enable_frontend']) {
  192. $post->post_content = __('Job posting is currently disabled. Please check back later.', 'wpjobads');
  193. } else {
  194. $error = __('<p>An error occured while posting your job ad. <strong>All fields are required except for zipcode and company URL</strong>. Please check your submission and try again. If the problem persists try contacting the administrator.</p>', 'wpjobads');
  195. $post->post_content = $error . apply_filters('the_content', $wpjobads_options['description']) . wpjobads_postjob_form(wpjobads_extract_fields($_POST));
  196. }
  197. }
  198. remove_filter('the_content', 'wptexturize');
  199. remove_filter('the_content', 'wpautop');
  200. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  201. wpjobads_php4_fix();
  202. return;
  203. }
  204. if (isset($_POST['txn_id'])) {
  205. wpjobads_paypal_ipn();
  206. return;
  207. }
  208. }
  209. if (!defined('WPJOBADS_TITLE_SEPARATOR')) define('WPJOBADS_TITLE_SEPARATOR', ' &raquo; ');
  210. if (isset($_GET['job_id']) and !isset($_GET['action'])) {
  211. $strict = $wpjobads_options['viewable_expired_ads'] == 1 ? false : true;
  212. if (wpjobads_job_is_viewable(intval($_GET['job_id']), $strict)) {
  213. $job = wpjobads_get_job(intval($_GET['job_id']));
  214. $post->post_title = $job['title'];
  215. $post->post_content = wpjobads_view_job($job);
  216. } else {
  217. $post->post_title = __('Job Not Found.', 'wpjobads');
  218. $post->post_content = '<p>' . __('<p>The job you are looking for does not exist.</p>', 'wpjobads') . '</p>';
  219. }
  220. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  221. wpjobads_php4_fix();
  222. return;
  223. }
  224. if (isset($_GET['action']) and $_GET['action'] == 'postjob') {
  225. $description = apply_filters('the_content', $wpjobads_options['description']);
  226. remove_filter('the_content', 'wptexturize');
  227. remove_filter('the_content', 'wpautop');
  228. $job['category'] = (isset($_GET['cat_ID'])) ? $_GET['cat_ID'] : $wpjobads_options['default_category'];
  229. $post->post_title = $wpjobads_options['title'];
  230. if (!$wpjobads_options['enable_frontend']) {
  231. $post->post_content = '<p>' . __('Job posting is currently disabled. Please check back later.', 'wpjobads') . '</p>';
  232. } else {
  233. $post->post_content = $description . wpjobads_postjob_form($job);
  234. }
  235. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  236. wpjobads_php4_fix();
  237. return;
  238. }
  239. if (isset($_GET['action']) and $_GET['action'] == 'waiting-approval') {
  240. $post->post_title = __('Your job ad is waiting for approval.', 'wpjobads');
  241. if ($_GET['pay'] == 1) {
  242. $post->post_content = '<p>' . __('Your ad will be reviewed by one of our administrators. You will receive an email with payment instructions once your ad has been approved. Thank you for your patience.', 'wpjobads') . '</p>';
  243. } else {
  244. $post->post_content = '<p>' . __('Your ad will be reviewed by one of our administrators. Thank you for your patience.', 'wpjobads') . '</p>';
  245. }
  246. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  247. wpjobads_php4_fix();
  248. return;
  249. }
  250. if (isset($_GET['action']) and $_GET['action'] == 'auto-approved') {
  251. $job = wpjobads_get_job(intval($_GET['job_id']));
  252. $post->post_title = $wpjobads_options['title'];
  253. $post->post_content = '<p>' . sprintf(__('Your job ad has been published at <a href="%1$s">%2$s</a>', 'wpjobads'), wpjobads_get_permalink('job_id=' . $_GET['job_id']), $job['title']) . '</p>';
  254. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  255. wpjobads_php4_fix();
  256. return;
  257. }
  258. if (isset($_GET['action']) and $_GET['action'] == 'paypal' and isset($_GET['job_id'])) {
  259. if (wpjobads_job_paid(intval($_GET['job_id']))) {
  260. $post->post_title = __('Pay with PayPal', 'wpjobads');
  261. $post->post_content = '<p>' . __('This ad has already been paid.', 'wpjobads') . '</p>';
  262. } else {
  263. $job = wpjobads_get_job(intval($_GET['job_id']));
  264. $post->post_title = __('Pay with PayPal', 'wpjobads');
  265. $post->post_content = '<p>' . $wpjobads_options['terms'] . '</p>' . wpjobads_paypal_form($job);
  266. }
  267. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  268. wpjobads_php4_fix();
  269. return;
  270. }
  271. if (isset($_GET['action']) and $_GET['action'] == 'paypal-return') {
  272. $post->post_title = __('Your payment is being processed.', 'wpjobads');
  273. $post->post_content = wpjobads_paypal_return();
  274. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  275. wpjobads_php4_fix();
  276. return;
  277. }
  278. if (isset($_GET['search'])) {
  279. $post->post_title = $wpjobads_options['title'];
  280. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  281. $post->post_content = wpjobads_job_search($_GET['search']);
  282. wpjobads_php4_fix();
  283. return;
  284. }
  285. if (isset($_GET['jobfeed']) and $_GET['jobfeed'] == 'rss2') {
  286. $cat_ID = isset($_GET['cat_ID']) ? intval($_GET['cat_ID']) : null;
  287. $cat_ID = isset($cat_ID) ? $cat_ID : $_GET['jobcat'];
  288. $jobtype = isset($_GET['jobtype']) ? $_GET['jobtype'] : null;
  289. wpjobads_rss2($cat_ID, $jobtype);
  290. exit;
  291. }
  292. $post->post_title = $wpjobads_options['title'];
  293. add_filter('wp_title', create_function('$title', "return \$title;"), 10);
  294. $post->post_content = wpjobads_job_listing($_GET['jobcat'], $_GET['jobtype']);
  295. wpjobads_php4_fix();
  296. return;
  297. }// }}}
  298. add_action('wp', 'wpjobads_page_handler');
  299. function wpjobads_random_ad($content)// {{{
  300. {
  301. $wpjobads_options = get_option('wpjobads_options');
  302. if (!is_single() or !$wpjobads_options['enable_random_ad']) return $content;
  303. global $wpdb;
  304. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  305. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  306. $columns = "$table_job.id, $table_job.posted, $table_job.title, $table_job.company_name, $table_job.company_url, $table_category.id AS category_id, $table_category.name AS category_name";
  307. $now = gmdate('Y-m-d H:i:s', time());
  308. $sql = "SELECT id FROM $table_job WHERE ad_approved = 1 AND ad_paid = 1 AND ad_published = 1 AND expired > '$now'";
  309. $job_IDs = $wpdb->get_col($sql);
  310. if (is_array($job_IDs) and count($job_IDs)) {
  311. $job_ID = $job_IDs[rand(0, count($job_IDs) - 1)];
  312. $sql = "SELECT $columns FROM $table_job INNER JOIN $table_category ON $table_job.category = $table_category.id WHERE $table_job.id = $job_ID";
  313. $job = $wpdb->get_row($sql);
  314. }
  315. if ($job) {
  316. ob_start();
  317. wpjobads_template_random_ad(array(
  318. 'job' => $job
  319. ));
  320. $random_ad = ob_get_contents();
  321. ob_end_clean();
  322. return $content . $random_ad;
  323. } else {
  324. return $content;
  325. }
  326. }// }}}
  327. add_action('the_content', 'wpjobads_random_ad');
  328. function wpjobads_get_edit_post_link($link)// {{{
  329. {
  330. global $post;
  331. if (!isset($post)) $post =& get_post($id = 0);
  332. $wpjobads_options = get_option('wpjobads_options');
  333. if (isset($post->ID) and $post->ID == $wpjobads_options['post_id']) {
  334. if (isset($_GET['job_id']))
  335. return get_bloginfo('wpurl') . '/wp-admin/admin.php?page=wpjobads-admin-jobs&amp;action=edit&amp;job_ID=' . $_GET['job_id'];
  336. else
  337. return $link;
  338. } else {
  339. return $link;
  340. }
  341. }// }}}
  342. add_filter('get_edit_post_link', 'wpjobads_get_edit_post_link', 1);
  343. // ----------------------------------------------------------------------------
  344. // Front-end functions
  345. function wpjobads_get_permalink($params = '')// {{{
  346. {
  347. $wpjobads_options = get_option('wpjobads_options');
  348. $post_id = $wpjobads_options['post_id'];
  349. $permalink = get_permalink($post_id);
  350. $parsed_url = parse_url($permalink);
  351. if ($params) {
  352. return $permalink . ($parsed_url['query'] ? '&' : '?') . $params;
  353. }
  354. return $permalink;
  355. }// }}}
  356. function wpjobads_selected($current, $option)// {{{
  357. {
  358. if ($current == $option) echo 'selected="selected"';
  359. }// }}}
  360. function wpjobads_checked($current, $checked)// {{{
  361. {
  362. if ($current == $checked) echo 'checked="checked"';
  363. }// }}}
  364. function wpjobads_view_job($job)// {{{
  365. {
  366. ob_start();
  367. wpjobads_template_view_job(array(
  368. 'job' => $job
  369. ));
  370. $content = ob_get_contents();
  371. ob_end_clean();
  372. return $content;
  373. }// }}}
  374. function wpjobads_postjob_form($job = null)// {{{
  375. {
  376. $wpjobads_options = get_option('wpjobads_options');
  377. $categories = wpjobads_get_all_categories();
  378. $types = wpjobads_get_all_types();
  379. ob_start();
  380. $permalink = wpjobads_get_permalink();
  381. $parsed_url = parse_url($permalink);
  382. $path = $parsed_url['path'];
  383. $permalink .= ($path{strlen($path)-1} == '/') ? '#wpjobads' : '/#wpjobads';
  384. ?>
  385. <style>input[type="text"], textarea, select {border:1px solid #aaa;padding: 3px;background-color: #F4F4F4;}</style>
  386. <style>input[type="text"]:focus, textarea:focus, select:focus {background-color: #FFF;}</style>
  387. <style>label {font-weight: bold;}</style>
  388. <style>fieldset {padding: 1em;}</style>
  389. <form style="text-align:left;margin: 1em 0;" method="post" action="<?php echo $permalink ?>">
  390. <fieldset style="border: 1px solid #ccc;">
  391. <legend><?php _e('Job Details', 'wpjobads') ?></legend>
  392. <label for="wpjobads_title"><?php _e('Job title', 'wpjobads') ?></label><br/>
  393. <input type="text" id="wpjobads_title" name="wpjobads_title" size="40" value="<?php echo attribute_escape($job['title']) ?>" tabindex="1" /><br/><br/>
  394. <label for="wpjobads_category"><?php _e('Job category', 'wpjobads') ?></label><br/>
  395. <select style="width: 300px;" id="wpjobads_category" name="wpjobads_category" tabindex="2">
  396. <?php foreach ($categories as $cat): ?>
  397. <option value="<?php echo attribute_escape($cat['id']) ?>" <?php wpjobads_selected($job['category'], $cat['id']) ?>><?php echo attribute_escape($cat['name']) ?></option>
  398. <?php endforeach ?>
  399. </select><br/><br/>
  400. <label for="wpjobads_type"><?php _e('Job type', 'wpjobads') ?></label><br/>
  401. <select style="width: 300px;" id="wpjobads_type" name="wpjobads_type" tabindex="3">
  402. <?php foreach ($types as $type): ?>
  403. <option value="<?php echo attribute_escape($type['id']) ?>" <?php wpjobads_selected($job['type'], $type['id']) ?>><?php echo attribute_escape($type['name']) ?></option>
  404. <?php endforeach ?>
  405. </select><br/><br/>
  406. <label for="wpjobads_description"><?php _e('Description', 'wpjobads') ?></label><br/>
  407. <textarea id="wpjobads_description" name="wpjobads_description" rows="8" cols="50" tabindex="3"><?php echo attribute_escape($job['description']) ?></textarea><br/><br/>
  408. <label for="wpjobads_how_to_apply"><?php _e('How to apply', 'wpjobads') ?></label><br/>
  409. <textarea id="wpjobads_how_to_apply" name="wpjobads_how_to_apply" rows="4" cols="50" tabindex="4"><?php echo attribute_escape($job['how_to_apply']) ?></textarea><br/><br/>
  410. <label for="wpjobads_location"><?php _e('Job location', 'wpjobads') ?></label><br/>
  411. <input type="text" id="wpjobads_location" name="wpjobads_location" size="40" value="<?php echo attribute_escape($job['location']) ?>" tabindex="5" /><br/><br/>
  412. <label for="wpjobads_zipcode"><?php _e('Zipcode (optional)', 'wpjobads') ?></label><br/>
  413. <input type="text" id="wpjobads_zipcode" name="wpjobads_zipcode" size="10" value="<?php echo attribute_escape($job['zipcode']) ?>" tabindex="6" /><br/><br/>
  414. </fieldset>
  415. <br/>
  416. <fieldset style="border: 1px solid #ccc;">
  417. <legend><?php _e('Employer Details', 'wpjobads') ?></legend>
  418. <label for="wpjobads_company_name"><?php _e('Company name', 'wpjobads') ?></label><br/>
  419. <input type="text" id="wpjobads_company_name" name="wpjobads_company_name" size="40" value="<?php echo attribute_escape($job['company_name']) ?>" tabindex="7" /><br/><br/>
  420. <label for="wpjobads_company_url"><?php _e('Company URL (optional)', 'wpjobads') ?></label><br/>
  421. <input type="text" id="wpjobads_company_url" name="wpjobads_company_url" size="40" value="<?php echo attribute_escape($job['company_url']) ?>" tabindex="8" /><br/><br/>
  422. <label for="wpjobads_contact_name"><?php _e('Contact name', 'wpjobads') ?></label><br/>
  423. <input type="text" id="wpjobads_contact_name" name="wpjobads_contact_name" size="40" value="<?php echo attribute_escape($job['contact_name']) ?>" tabindex="9" /><br/><br/>
  424. <label for="wpjobads_contact_email"><?php _e('Contact email', 'wpjobads') ?></label><br/>
  425. <input type="text" id="wpjobads_contact_email" name="wpjobads_contact_email" size="40" value="<?php echo attribute_escape($job['contact_email']) ?>" tabindex="10" /><br/><br/>
  426. </fieldset>
  427. <br/>
  428. <fieldset style="border: 1px solid #ccc;">
  429. <legend><?php _e('Terms &amp; Conditions', 'wpjobads') ?></legend>
  430. <?php echo wpautop(wptexturize($wpjobads_options['terms'])) ?>
  431. </fieldset>
  432. <input type="hidden" name="wpjobads-action" value="preview" />
  433. <p><input id="submit" type="submit" value="<?php echo attribute_escape(__('Post new job', 'wpjobads')) ?>" tabindex="11" /></p>
  434. </form>
  435. <?php
  436. $content = ob_get_contents();
  437. ob_end_clean();
  438. return $content;
  439. }// }}}
  440. function wpjobads_job_listing($cat = null, $type = null)// {{{
  441. {
  442. global $wpdb;
  443. $wpjobads_options = get_option('wpjobads_options');
  444. $jobs = wpjobads_get_all_jobs($cat, $type);
  445. $date_format = $wpjobads_options['date_format'];
  446. $gmt_offset = intval(get_option('gmt_offset')) * 3600;
  447. $invite = empty($wpjobads_options['invite']) ? attribute_escape(_('Post a job and find the right person')) : attribute_escape($wpjobads_options['invite']);
  448. $widget_invite = empty($wpjobads_options['widget_invite']) ? attribute_escape(__('Post new job', 'wpjobads')) : attribute_escape($wpjobads_options['widget_invite']);
  449. ob_start();
  450. wpjobads_template_job_listing(array(
  451. 'enable_frontend' => $wpjobads_options['enable_frontend'],
  452. 'jobs' => $jobs,
  453. 'cat_ID' => $cat,
  454. 'invite' => $invite,
  455. 'widget_invite' => $widget_invite,
  456. 'date_format' => $date_format,
  457. 'gmt_offset' => $gmt_offset
  458. ));
  459. $content = ob_get_contents();
  460. ob_end_clean();
  461. return $content;
  462. }// }}}
  463. function wpjobads_job_search($query) // {{{
  464. {
  465. global $wpdb;
  466. $wpjobads_options = get_option('wpjobads_options');
  467. $jobs = wpjobads_search_all_jobs($query);
  468. $date_format = $wpjobads_options['date_format'];
  469. $gmt_offset = intval(get_option('gmt_offset')) * 3600;
  470. $invite = empty($wpjobads_options['invite']) ? attribute_escape(_('Post a job and find the right person')) : attribute_escape($wpjobads_options['invite']);
  471. $widget_invite = empty($wpjobads_options['widget_invite']) ? attribute_escape(__('Post new job', 'wpjobads')) : attribute_escape($wpjobads_options['widget_invite']);
  472. ob_start();
  473. wpjobads_template_job_listing(array(
  474. 'enable_frontend' => $wpjobads_options['enable_frontend'],
  475. 'jobs' => $jobs,
  476. 'cat_ID' => $cat,
  477. 'invite' => $invite,
  478. 'widget_invite' => $widget_invite,
  479. 'date_format' => $date_format,
  480. 'gmt_offset' => $gmt_offset
  481. ));
  482. $content = ob_get_contents();
  483. ob_end_clean();
  484. return $content;
  485. }// }}}
  486. function wpjobads_rss2($cat_ID = null, $jobtype = null) // {{{
  487. {
  488. global $wpdb;
  489. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  490. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  491. $columns = "$table_job.id, $table_job.posted, $table_job.title, $table_job.description, $table_job.how_to_apply, $table_job.company_name, $table_job.location, $table_job.zipcode, $table_job.company_url, $table_category.id AS category_id, $table_category.name AS category_name, $table_job.type";
  492. $now = gmdate('Y-m-d H:i:s', time());
  493. $where_jobs = array();
  494. $where_count = '';
  495. if ($cat_ID) {
  496. $cat_ID = intval($cat_ID);
  497. $where_jobs[] = "$table_category.id = $cat_ID";
  498. }
  499. if ($jobtype) {
  500. $jobtype = $wpdb->escape($jobtype);
  501. $where_jobs[] = "$table_job.`type` = '$jobtype'";
  502. $where_count = "AND $table_job.`type` = '$jobtype'";
  503. }
  504. $where_jobs = empty($where_jobs) ? '' : ('AND ' . implode(' AND ', $where_jobs));
  505. $jobs_sql = "SELECT $columns FROM $table_job INNER JOIN $table_category ON $table_job.category = $table_category.id WHERE ad_approved = 1 AND ad_paid = 1 AND ad_published = 1 AND (expired > '$now' OR ad_duration = -1) $where_jobs ORDER BY posted DESC";
  506. $jobs = $wpdb->get_results($jobs_sql, ARRAY_A);
  507. $posted_sql = "SELECT MAX($table_job.posted) AS posted FROM $table_job WHERE ad_approved = 1 AND ad_paid = 1 AND ad_published = 1 AND (expired > '$now' OR ad_duration = -1) $where_count ORDER BY posted DESC";
  508. $posted = $wpdb->get_var($posted_sql);
  509. $wpjobads_options = get_option('wpjobads_options');
  510. header('Content-Type: text/xml; charset="' . get_option('blog_charset') . '"', true);
  511. ?>
  512. <?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>
  513. <rss version="2.0"
  514. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  515. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  516. xmlns:dc="http://purl.org/dc/elements/1.1/"
  517. xmlns:atom="http://www.w3.org/2005/Atom"
  518. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  519. >
  520. <channel>
  521. <title><?php echo attribute_escape($wpjobads_options['title']) ?></title>
  522. <link><?php echo wpjobads_get_permalink() ?></link>
  523. <description><?php echo attribute_escape($wpjobads_options['description']) ?></description>
  524. <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', $posted, false); ?></pubDate>
  525. <language><?php echo get_option('rss_language'); ?></language>
  526. <sy:updatePeriod>hourly</sy:updatePeriod>
  527. <sy:updateFrequency>1</sy:updateFrequency>
  528. <?php foreach ($jobs as $job): ?>
  529. <item>
  530. <title><?php echo attribute_escape($job['title']) ?></title>
  531. <link><?php echo attribute_escape(wpjobads_get_permalink('job_id='.$job['id'])) ?></link>
  532. <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', $job['posted'], false); ?></pubDate>
  533. <category><![CDATA[<?php echo html_entity_decode($job['category_name']) ?>]]></category>
  534. <guid isPermaLink="false"><?php echo attribute_escape(wpjobads_get_permalink('job_id='.$job['id'])) ?></guid>
  535. <content:encoded><![CDATA[<?php echo html_entity_decode(wpjobads_view_job($job)) ?>]]></content:encoded>
  536. </item>
  537. <?php endforeach ?>
  538. </channel>
  539. </rss>
  540. <?php
  541. }// }}}
  542. // ----------------------------------------------------------------------------
  543. // HTTP & Net functions
  544. function wpjobads_http_request($method, $url, $data = '', $headers = array(), $timeout = 5)// {{{
  545. {
  546. $url = parse_url($url);
  547. if (!$url['path']) $url['path'] = '/';
  548. if ($url['query']) $url['path'] .= '?' . $url['query'];
  549. $request = strtoupper($method) . ' ' . $url['path'] . " HTTP/1.0\r\n";
  550. $headers['Host'] = $url['host'];
  551. $headers['Content-Length'] = strlen($data);
  552. foreach ($headers as $name => $value) {
  553. $request .= $name . ': ' . $value . "\r\n";
  554. }
  555. $request .= "\r\n";
  556. $request .= $data;
  557. $response = false;
  558. if (!isset($url['port'])) $url['port'] = 80;
  559. if (false != ($http = @fsockopen($url['host'], $url['port'], $errno, $errstr, $timeout)) && is_resource($http)) {
  560. fwrite($http, $request);
  561. while (!feof($http))
  562. $response .= fgets($http, 1160); // One TCP-IP packet
  563. fclose($http);
  564. $response = explode("\r\n\r\n", $response, 2);
  565. }
  566. return $response;
  567. }// }}}
  568. function wpjobads_http_get($url, $data = '', $headers = array(), $timeout = 5)// {{{
  569. {
  570. if ($data) $url .= '?' . $data;
  571. return wpjobads_http_request('GET', $url, '', $headers, $timeout);
  572. }// }}}
  573. function wpjobads_http_post($url, $data = '', $headers = array(), $timout = 5)// {{{
  574. {
  575. if (!isset($headers['Content-Type'])) {
  576. $headers = array_merge($headers, array('Content-Type' => 'application/x-www-form-urlencoded'));
  577. }
  578. return wpjobads_http_request('POST', $url, $data, $headers, $timeout);
  579. }// }}}
  580. function wpjobads_paypal_verify($data = '', $headers = array(), $timeout = 30)// {{{
  581. {
  582. $wpjobads_options = get_option('wpjobads_options');
  583. $url = parse_url($wpjobads_options['paypal_verification_url']);
  584. if (!$url['path']) $url['path'] = '/';
  585. if ($url['query']) $url['path'] .= '?' . $url['query'];
  586. $request = 'POST ' . $url['path'] . " HTTP/1.0\r\n";
  587. $headers['Host'] = $url['host'];
  588. $headers['Content-Length'] = strlen($data);
  589. foreach ($headers as $name => $value) {
  590. $request .= $name . ': ' . $value . "\r\n";
  591. }
  592. $request .= "\r\n";
  593. $request .= $data;
  594. $response = false;
  595. if (!isset($url['port'])) $url['port'] = 443;
  596. if (false != ($http = fsockopen($url['scheme'] . '://' . $url['host'], $url['port'], $errno, $errstr, $timeout)) && is_resource($http)) {
  597. fwrite($http, $request);
  598. while (!feof($http))
  599. $response .= fgets($http, 1160); // One TCP-IP packet
  600. fclose($http);
  601. $response = explode("\r\n\r\n", $response, 2);
  602. } else {
  603. wpjobads_log('HTTP unable to open socket to ' . $wpjobads_options['paypal_verification_url'] . ' with errno = ' . $errno . ' and errstr = ' . $errstr);
  604. }
  605. return $response;
  606. }// }}}
  607. function wpjobads_check_update($plugin_file, $plugin_data, $context)// {{{
  608. {
  609. global $wp_version;
  610. //if (!empty($context) and $context != 'active') return false;
  611. if ($plugin_data['Name'] != 'WPJobAds') return false;
  612. if (!is_callable('fsockopen')) return false;
  613. $wpjobads_options = get_option('wpjobads_options');
  614. if (!WPJOBADS_FORCE_CHECK_UPDATE and (WPJOBADS_CHECK_UPDATE_PERIOD > (time() - $wpjobads_options['last_checked']))) {
  615. if (version_compare($wpjobads_options['new_version'], $wpjobads_options['version']) == 1) {
  616. wpjobads_notify_update($plugin_data['Name'], $wpjobads_options['update_url'], $wpjobads_options['new_version']);
  617. return true;
  618. }
  619. return false;
  620. }
  621. $request = 'v='.urlencode($plugin_data['Version']).'&u='.urlencode(get_bloginfo('url'));
  622. if ($wpjobads_options['license_key']) $request .= '&l='.urlencode(md5($wpjobads_options['license_key']));
  623. $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset');
  624. $headers['User-Agent'] = 'WordPress/' . $wp_version . '; ' . get_bloginfo('url');
  625. list($header, $response) = wpjobads_http_post(WPJOBADS_CHECK_UPDATE_URL, $request, $headers, 30);
  626. $response = unserialize($response);
  627. if (!$response || !$response['v'] || !$response['u']) {
  628. return false;
  629. }
  630. if (version_compare($response['v'], $wpjobads_options['version']) == 1) {
  631. $wpjobads_options['last_checked'] = time();
  632. $wpjobads_options['new_version'] = $response['v'];
  633. $wpjobads_options['update_url'] = $response['u'];
  634. update_option('wpjobads_options', $wpjobads_options);
  635. wpjobads_notify_update($plugin_data['Name'], $wpjobads_options['update_url'], $wpjobads_options['new_version']);
  636. return true;
  637. }
  638. return false;
  639. }// }}}
  640. add_action('after_plugin_row', 'wpjobads_check_update', 10, 3);
  641. function wpjobads_notify_update($plugin_name, $update_url, $new_version)// {{{
  642. {
  643. echo '<tr><td colspan="5" class="plugin-update">';
  644. printf(__('There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> <em>automatic upgrade unavailable for this plugin</em>.'),
  645. $plugin_name, $update_url, $new_version);
  646. echo "</td></tr>";
  647. }// }}}
  648. // ----------------------------------------------------------------------------
  649. // Administrative pages
  650. function wpjobads_install_page()// {{{
  651. {
  652. global $user_ID;
  653. $post['post_type'] = 'page';
  654. $post['post_title'] = __('Jobs', 'wpjobads');
  655. $post['post_name'] = __('jobs', 'wpjobads');
  656. $post['post_content'] = __('This post was auto generated by WPJobAds during installation. Please do not delete this page.', 'wpjobads');
  657. $post['post_excerpt'] = '';
  658. $post['post_parent'] = 0;
  659. $post['to_ping'] = '';
  660. $post['post_author'] = $user_ID;
  661. $post['post_status'] = 'publish';
  662. $post['comment_status'] = 'closed';
  663. $post['ping_status'] = 'closed';
  664. $post_ID = wp_insert_post($post);
  665. if (is_wp_error($post_ID))
  666. return $post_ID;
  667. if (empty($post_ID))
  668. return 0;
  669. return $post_ID;
  670. }// }}}
  671. function wpjobads_install()// {{{
  672. {
  673. global $wpdb;
  674. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  675. if ($wpdb->get_var("SHOW TABLES LIKE '$table_category'") != $table_category) {
  676. $sql = "CREATE TABLE $table_category (
  677. id int(4) unsigned NOT NULL auto_increment,
  678. name varchar(255) NOT NULL,
  679. priority int(10) unsigned NOT NULL default '10',
  680. job_count bigint(20) unsigned NOT NULL default '0',
  681. PRIMARY KEY (id)
  682. );";
  683. require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  684. dbDelta($sql);
  685. $sql = "INSERT INTO $table_category (name)
  686. VALUES('" . $wpdb->escape(__('Miscellaneous', 'wpjobads')) . "')
  687. ";
  688. $result = $wpdb->query($sql);
  689. }
  690. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  691. if ($wpdb->get_var("SHOW TABLES LIKE '$table_job'") != $table_job) {
  692. $sql = "CREATE TABLE $table_job (
  693. id bigint(20) unsigned NOT NULL auto_increment,
  694. posted datetime NOT NULL default '0000-00-00 00:00:00',
  695. modified datetime NOT NULL default '0000-00-00 00:00:00',
  696. expired datetime NOT NULL default '0000-00-00 00:00:00',
  697. title varchar(255) NOT NULL default '',
  698. category int(4) unsigned NOT NULL default '1',
  699. `type` ENUM('fulltime','parttime','freelance','internship') NOT NULL DEFAULT 'fulltime',
  700. description text NOT NULL,
  701. how_to_apply text NOT NULL,
  702. location varchar(100) NOT NULL default '',
  703. zipcode varchar(10) NOT NULL default '',
  704. company_name varchar(100) NOT NULL default '',
  705. company_url varchar(100) NOT NULL default '',
  706. contact_name varchar(100) NOT NULL default '',
  707. contact_email varchar(100) NOT NULL default '',
  708. ad_duration int(4) NOT NULL default '0',
  709. ad_currency char(3) NOT NULL default 'USD',
  710. ad_price double NOT NULL default '0',
  711. ad_paid BOOLEAN NOT NULL default '0',
  712. ad_approved BOOLEAN NOT NULL default '0',
  713. ad_published BOOLEAN NOT NULL default '1',
  714. ip_address varchar(100) NOT NULL default '',
  715. txn_id varchar(17),
  716. PRIMARY KEY (id)
  717. );";
  718. require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  719. dbDelta($sql);
  720. }
  721. $wpjobads_options = get_option('wpjobads_options');
  722. if (!empty($wpjobads_options) and $wpjobads_options['post_id']) {
  723. $post_ID = $wpjobads_options['post_id'];
  724. } else {
  725. $post_ID = wpjobads_install_page();
  726. }
  727. $default_options = array(
  728. 'post_id' => $post_ID,
  729. 'version' => WPJOBADS_VERSION,
  730. 'release_date' => WPJOBADS_RELEASE_DATE,
  731. 'last_checked' => time() - WPJOBADS_CHECK_UPDATE_PERIOD,
  732. 'new_version' => WPJOBADS_VERSION,
  733. 'update_url' => WPJOBADS_UPDATE_URL,
  734. 'license_key' => '',
  735. ###
  736. 'title' => __('Job Board', 'wpjobads'),
  737. 'description' => '',
  738. 'invite' => __('Post a job and find the right person'),
  739. 'enable_frontend' => 0,
  740. 'auto_approve' => 0,
  741. 'force_payment_email' => 1,
  742. 'duration' => 30,
  743. 'currency' => 'USD',
  744. 'fulltime_price' => 0,
  745. 'parttime_price' => 0,
  746. 'freelance_price' => 0,
  747. 'internship_price' => 0,
  748. 'paypal_email' => '',
  749. 'paypal_url' => 'https://www.paypal.com/cgi-bin/webscr',
  750. 'paypal_verification_url' => 'ssl://www.paypal.com:443/cgi-bin/webscr',
  751. 'date_format' => 'n/j',
  752. 'terms' => '',
  753. 'payment_email_subject' => 'Job Board Notification',
  754. 'payment_email_message' => '',
  755. 'publish_email_subject' => 'Job Board Notification',
  756. 'publish_email_message' => '',
  757. 'email_from_name' => 'WPJobAds',
  758. 'email_from' => 'wpjobads@example.com',
  759. 'email_notification' => '',
  760. 'notification_email_subject' => 'Job Ad Submission Notification',
  761. 'notification_email_message' => '',
  762. 'viewable_expired_ads' => 0,
  763. 'enable_random_ad' => 1,
  764. ###
  765. 'default_category' => 1,
  766. 'widget_title' => __('Job Board', 'wpjobads'),
  767. 'widget_invite' => __('Post new job', 'wpjobads')
  768. );
  769. foreach ($default_options as $name => $value) {
  770. if (!isset($wpjobads_options[$name])) {
  771. $wpjobads_options[$name] = $value;
  772. }
  773. }
  774. $wpjobads_options['version'] = WPJOBADS_VERSION;
  775. $wpjobads_options['release_date'] = WPJOBADS_RELEASE_DATE;
  776. if (version_compare(WPJOBADS_VERSION, $wpjobads_options['new_version']) == 1) {
  777. $wpjobads_options['last_checked'] = time();
  778. $wpjobads_options['new_version'] = WPJOBADS_VERSION;
  779. }
  780. update_option('wpjobads_options', $wpjobads_options);
  781. }// }}}
  782. register_activation_hook(__FILE__, 'wpjobads_install');
  783. function wpjobads_uninstall()// {{{
  784. {
  785. global $wpdb;
  786. $wpjobads_options = get_option('wpjobads_options');
  787. $wpdb->query('DROP TABLE ' . $wpdb->prefix . WPJOBADS_CATEGORY);
  788. $wpdb->query('DROP TABLE ' . $wpdb->prefix . WPJOBADS_JOB);
  789. $wpdb->query('DELETE FROM ' . $wpdb->prefix . 'posts WHERE ID = ' . $wpjobads_options['post_id']);
  790. $wpdb->query('DELETE FROM ' . $wpdb->prefix . 'postmeta WHERE post_id = ' . $wpjobads_options['post_id']);
  791. delete_option('wpjobads_options');
  792. deactivate_plugins('wpjobads/wpjobads.php');
  793. wp_redirect('plugins.php?deactivate=true');
  794. }// }}}
  795. function wpjobads_add_admin_pages()// {{{
  796. {
  797. global $wpdb;
  798. global $plugin_page, $pagenow;
  799. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  800. $unapproved = intval($wpdb->get_var("SELECT COUNT(id) AS unapproved FROM $table_job WHERE ad_approved = 0"));
  801. $submenu = array();
  802. add_menu_page(__('WPJobAds for WordPress', 'wpjobads'), __('WPJobAds', 'wpjobads'), 10, __FILE__, 'wpjobads_admin_index');
  803. $submenu['wpjobads_admin_load_jobs'] = add_submenu_page(__FILE__, __('WPJobAds Listings', 'wpjobads'), __('Jobs', 'wpjobads'), 10, 'wpjobads-admin-jobs', 'wpjobads_admin_jobs');
  804. if ($unapproved or ($_GET['page'] == 'wpjobads-admin-approvals' and isset($_GET['message'])))
  805. $submenu['wpjobads_admin_load_approvals'] = add_submenu_page(__FILE__, __('WPJobAds Approvals', 'wpjobads'), sprintf(__('Awaiting Approval (%d)', 'wpjobads'), $unapproved), 10, 'wpjobads-admin-approvals', 'wpjobads_admin_approvals');
  806. $submenu['wpjobads_admin_load_categories'] = add_submenu_page(__FILE__, __('WPJobAds Categories', 'wpjobads'), __('Categories', 'wpjobads'), 10, 'wpjobads-admin-categories', 'wpjobads_admin_categories');
  807. $submenu['wpjobads_admin_load_options'] = add_submenu_page(__FILE__, __('WPJobAds Options', 'wpjobads'), __('Options', 'wpjobads'), 10, 'wpjobads-admin-options', 'wpjobads_admin_options');
  808. $submenu['wpjobads_admin_load_uninstall'] = add_submenu_page(__FILE__, __('WPJobAds Uninstall', 'wpjobads'), __('Uninstall', 'wpjobads'), 10, 'wpjobads-admin-uninstall', 'wpjobads_admin_uninstall');
  809. foreach ($submenu as $handler => $page_hook) {
  810. if ($page_hook == get_plugin_page_hook($plugin_page, $pagenow)) {
  811. add_action('load-' . $page_hook, $handler);
  812. }
  813. }
  814. }// }}}
  815. add_action('admin_menu', 'wpjobads_add_admin_pages');
  816. function wpjobads_submenu_fix()// {{{
  817. {
  818. global $submenu;
  819. if (array_key_exists('wpjobads/wpjobads.php', $submenu)) {
  820. $wpjobads = $submenu['wpjobads/wpjobads.php'][0];
  821. $wpjobads[0] = __('Overview', 'wpjobads');
  822. $wpjobads[3] = __('WPJobAds Overview', 'wpjobads');
  823. $submenu['wpjobads/wpjobads.php'][0] = $wpjobads;
  824. }
  825. }// }}}
  826. add_action('admin_head', 'wpjobads_submenu_fix');
  827. function wpjobads_admin_load_approvals()// {{{
  828. {
  829. if ($_POST['action'] == 'approve') return wpjobads_admin_approve_job();
  830. }// }}}
  831. function wpjobads_admin_approvals()// {{{
  832. {
  833. $wpjobads_options = get_option('wpjobads_options');
  834. if (empty($wpjobads_options['license_key'])) return wpjobads_license_form('wpjobads-admin-approvals');
  835. global $wpdb;
  836. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  837. $unapproved = $wpdb->get_results("SELECT * FROM $table_job WHERE ad_approved = 0 ORDER BY posted ASC", ARRAY_A);
  838. $gmt_offset = intval(get_option('gmt_offset')) * 3600;
  839. $messages[1] = __('Job approved.', 'wpjobads');
  840. $messages[2] = __('Job not approved.', 'wpjobads');
  841. ?>
  842. <?php if (isset($_GET['message'])) : ?>
  843. <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
  844. <?php endif; ?>
  845. <div class="wrap">
  846. <h2><?php _e('Approval Queue', 'wpjobads') ?></h2>
  847. <?php if (empty($unapproved)): ?>
  848. <p><?php _e('No jobs found.', 'wpjobads') ?></p>
  849. <?php else: ?>
  850. <ol class="commentlist">
  851. <?php foreach ($unapproved as $job): ?>
  852. <li>
  853. <p><strong><?php echo $job['title'] ?></strong> | <a href="<?php echo $job['company_url'] ?>"><?php echo $job['company_name'] ?></a> | <a href="mailto:<?php echo $job['contact_email'] ?>"><?php echo $job['contact_email'] ?></a> | <?php _e('IP:', 'wpjobads') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php echo urlencode($job['ip_address']) ?>"><?php echo $job['ip_address'] ?></a></p>
  854. <p><small><?php echo date('M d, g:i A', strtotime($job['posted']) + $gmt_offset) ?> &#8212; [ <a id="showlink-<?php echo $job['id'] ?>" href="javascript:wpjobads_toggle(<?php echo $job['id'] ?>)"><?php _e('Show', 'wpjobads') ?></a> | <a href="admin.php?page=wpjobads-admin-jobs&amp;action=edit&amp;job_ID=<?php echo attribute_escape($job['id']) ?>">Edit</a> | <a href="<?php echo wp_nonce_url('admin.php?page=wpjobads-admin-jobs&amp;action=delete&amp;job_ID=' . $job['id'], 'delete-job_' . $job['id'])?>">Delete</a> ]</small></p>
  855. <div class="jobcontent" id="jobcontent-<?php echo $job['id'] ?>">
  856. <address><?php echo $job['location'] ?> <?php echo $job['zipcode'] ?></address><br/>
  857. <?php echo apply_filters('the_content', $job['description']) ?>
  858. <h4><?php _e('Interested?', 'wpjobads') ?></h4>
  859. <?php echo apply_filters('the_content', $job['how_to_apply']) ?>
  860. </div>
  861. <form method="post" action="admin.php?page=wpjobads-admin-approvals&amp;action=approve">
  862. <input type="hidden" name="job_ID" value="<?php echo attribute_escape($job['id']) ?>" />
  863. <?php wp_nonce_field('approve-job_' . $job['id']) ?>
  864. <input type="hidden" name="action" value="approve" />
  865. <p class="submit" style="text-align: left;"><input type="submit" class="submit" value="<?php _e('Approve', 'wpjobads') ?>"></p>
  866. </form>
  867. </li>
  868. <?php endforeach ?>
  869. </ol>
  870. <script type="text/javascript">
  871. //<![CDATA[
  872. function wpjobads_toggle(id){
  873. var div = $('jobcontent-' + id);
  874. var link = $('showlink-' + id);
  875. if (div.style.display == 'none') {
  876. div.style.display = 'block';
  877. link.innerHTML = '<?php _e('Hide', 'wpjobads') ?>';
  878. } else {
  879. div.style.display = 'none';
  880. link.innerHTML = '<?php _e('Show', 'wpjobads') ?>';
  881. }
  882. }
  883. var wpjobads_contents = document.getElementsByClassName('jobcontent');
  884. for (i = 0; i < wpjobads_contents.length; i++) wpjobads_contents[i].style.display = 'none';
  885. //]]>
  886. </script>
  887. <?php endif ?>
  888. </div>
  889. <?php
  890. }// }}}
  891. function wpjobads_admin_approve_job()// {{{
  892. {
  893. $_POST = stripslashes_deep($_POST);
  894. $job_ID = intval($_POST['job_ID']);
  895. check_admin_referer('approve-job_' . $job_ID);
  896. $job = wpjobads_get_job($job_ID);
  897. if (wpjobads_set_approved($job)) {
  898. if (intval($job['ad_price']) == 0) {
  899. wpjobads_send_publish_email($job);
  900. } else {
  901. wpjobads_send_payment_email($job);
  902. }
  903. wpjobads_log('Job #' . $job['id'] . ' - "' . $job['title'] . '" is set to "approved" and an email has been sent to ' . $job['contact_email']);
  904. wp_redirect('admin.php?page=wpjobads-admin-approvals&message=1');
  905. } else {
  906. wp_redirect('admin.php?page=wpjobads-admin-approvals&message=2');
  907. }
  908. }// }}}
  909. function wpjobads_set_approved($job, $ad_approved = 1)// {{{
  910. {
  911. global $wpdb;
  912. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  913. $now = time();
  914. $modified = $wpdb->escape(gmdate('Y-m-d H:i:s', $now));
  915. $updates = array();
  916. $updates[] = "modified = '$modified'";
  917. $ad_approved = intval($ad_approved) ? 1 : 0;
  918. $updates[] = "ad_approved = $ad_approved";
  919. $expired = gmdate('Y-m-d H:i:s', $now + intval($job['ad_duration']) * 86400);
  920. $expired = $wpdb->escape($expired);
  921. $updates[] = "expired = '$expired'";
  922. $updates = implode(', ', $updates);
  923. return $wpdb->query("UPDATE $table_job SET $updates WHERE id = " . $job['id']);
  924. }// }}}
  925. function wpjobads_set_paid($job, $txn_id, $ad_paid = 1)// {{{
  926. {
  927. global $wpdb;
  928. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  929. $now = time();
  930. $modified = $wpdb->escape(gmdate('Y-m-d H:i:s', $now));
  931. $updates = array();
  932. $updates[] = "modified = '$modified'";
  933. $ad_paid = intval($ad_paid) ? 1 : 0;
  934. $updates[] = "ad_paid = $ad_paid";
  935. $expired = gmdate('Y-m-d H:i:s', $now + intval($job['ad_duration']) * 86400);
  936. $expired = $wpdb->escape($expired);
  937. $updates[] = "expired = '$expired'";
  938. $txn_id = $wpdb->escape($txn_id);
  939. $updates[] = "txn_id = '$txn_id'";
  940. $updates = implode(', ', $updates);
  941. return $wpdb->query("UPDATE $table_job SET $updates WHERE id = " . $job['id']);
  942. }// }}}
  943. function wpjobads_job_paid($job_ID)// {{{
  944. {
  945. global $wpdb;
  946. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  947. $ad_paid = $wpdb->get

Large files files are truncated, but you can click here to view the full file