PageRenderTime 538ms CodeModel.GetById 21ms RepoModel.GetById 2ms app.codeStats 1ms

/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
  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_var("SELECT ad_paid FROM $table_job WHERE id = " . $job_ID, 0);
  948. return $ad_paid == 1 ? true : false;
  949. }// }}}
  950. function wpjobads_admin_index()// {{{
  951. {
  952. global $wpdb;
  953. $wpjobads_options = get_option('wpjobads_options');
  954. if (empty($wpjobads_options['license_key'])) return wpjobads_license_form();
  955. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  956. $total = intval($wpdb->get_var("SELECT COUNT(id) AS total FROM $table_job WHERE ad_approved = 1", 0));
  957. $age = floor((time() - strtotime($wpjobads_options['release_date'])) / (24 * 3600));
  958. $url = urlencode(get_bloginfo('url'));
  959. ?>
  960. <div class="wrap">
  961. <h2><?php _e('Overview', 'wpjobads') ?></h2>
  962. <p><?php echo sprintf(__('Your WPJobAds version is <span style="background-color: #FFF9D8; font-weight: bold;">%d</span> days old.', 'wpjobads'), intval($age)) ?></p>
  963. <p><?php echo sprintf(__('Visit %s to check on the latest news and updates.', 'wpjobads'), '<a href="http://www.wpjobads.com/?url='.urlencode($url).'&l='.urlencode(md5($wpjobads_options['license_key'])).'">WPJobAds.com</a>') ?></p>
  964. </div>
  965. <?php
  966. }// }}}
  967. function wpjobads_admin_load_categories()// {{{
  968. {
  969. if ($_POST['action'] == 'add') return wpjobads_admin_add_category();
  970. elseif ($_POST['action'] == 'update') return wpjobads_admin_update_category();
  971. elseif ($_GET['action'] == 'delete') return wpjobads_admin_delete_category();
  972. }// }}}
  973. function wpjobads_admin_categories()// {{{
  974. {
  975. $wpjobads_options = get_option('wpjobads_options');
  976. if (empty($wpjobads_options['license_key'])) return wpjobads_license_form('wpjobads-admin-categories');
  977. if ($_GET['action'] == 'edit') return wpjobads_admin_edit_category();
  978. $categories = wpjobads_get_all_categories();
  979. $messages[1] = __('Category added.', 'wpjobads');
  980. $messages[2] = __('Category deleted.', 'wpjobads');
  981. $messages[3] = __('Category updated.', 'wpjobads');
  982. $messages[4] = __('Category not added.', 'wpjobads');
  983. $messages[5] = __('Category not updated.', 'wpjobads');
  984. $form = '<form name="addcat" id="addcat" method="post" action="admin.php?page=wpjobads-admin-categories&action=add">';
  985. $action = 'add';
  986. $nonce_action = 'add-job-category';
  987. $heading = __('Add Job Category', 'wpjobads');
  988. $submit_text = __('Add Job Category', 'wpjobads');
  989. ?>
  990. <?php if (isset($_GET['message'])) : ?>
  991. <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
  992. <?php endif; ?>
  993. <div class="wrap">
  994. <h2><?php _e('Job Categories (<a href="#addcat">add new</a>)', 'wpjobads') ?></h2>
  995. <table class="widefat">
  996. <thead>
  997. <tr>
  998. <th style="text-align: center;" scope="col">ID</th>
  999. <th scope="col">Name</th>
  1000. <th width="90" style="text-align: center;" scope="col">Jobs</th>
  1001. <th width="90" style="text-align: center;" scope="col">Priority</th>
  1002. <th width="200" colspan="2" style="text-align: center;" scope="col">Action</th>
  1003. </tr>
  1004. </thead>
  1005. <tbody>
  1006. <?php foreach ($categories as $i => $cat): ?>
  1007. <?php if ($i % 2): ?>
  1008. <tr>
  1009. <?php else: ?>
  1010. <tr class="alternate">
  1011. <?php endif ?>
  1012. <td style="text-align: center;"><?php echo attribute_escape($cat['id']) ?></td>
  1013. <td><?php echo attribute_escape($cat['name']) ?></td>
  1014. <td style="text-align: center;"><?php echo attribute_escape($cat['job_count']) ?></td>
  1015. <td style="text-align: center;"><?php echo attribute_escape($cat['priority']) ?></td>
  1016. <td><a class="edit" href="admin.php?page=wpjobads-admin-categories&amp;action=edit&amp;cat_ID=<?php echo attribute_escape($cat['id']) ?>"><?php _e('Edit', 'wpjobads') ?></a></td>
  1017. <?php if ($cat['id'] != intval($wpjobads_options['default_category'])): ?>
  1018. <td><a class="delete" href="<?php echo wp_nonce_url('admin.php?page=wpjobads-admin-categories&amp;action=delete&amp;cat_ID=' . $cat['id'], 'delete-job-category_' . $cat['id'])?>" ><?php _e('Delete', 'wpjobads') ?></a></td>
  1019. <?php else: ?>
  1020. <td style="text-align: center;"><?php _e('Default', 'wpjobads') ?></td>
  1021. <?php endif ?>
  1022. </tr>
  1023. <?php endforeach ?>
  1024. </tbody>
  1025. </table>
  1026. </div>
  1027. <?php if ( current_user_can('manage_categories') ) : ?>
  1028. <div class="wrap">
  1029. <p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete the jobs in that category. Instead, jobs that were assigned to the deleted category are set to the category <strong>%s</strong>.', 'wpjobads'), wpjobads_get_catname($wpjobads_options['default_category'])) ?></p>
  1030. </div>
  1031. <div class="wrap">
  1032. <h2><?php echo $heading ?></h2>
  1033. <?php wpjobads_admin_category_form(null, $form, $action, $nonce_action, $submit_text) ?>
  1034. </div>
  1035. <?php endif;
  1036. }// }}}
  1037. function wpjobads_admin_category_form($category, $form, $action, $nonce_action, $submit_text)// {{{
  1038. {
  1039. global $wp_version;
  1040. if (is_null($category)) {
  1041. $category = array();
  1042. $category['id'] = '';
  1043. $category['name'] = '';
  1044. $category['priority'] = 1;
  1045. }
  1046. ?>
  1047. <?php echo $form ?>
  1048. <input type="hidden" value="<?php echo $action ?>" name="action" />
  1049. <input type="hidden" value="<?php echo attribute_escape($category['id']) ?>" name="cat_ID"/>
  1050. <?php wp_nonce_field($nonce_action) ?>
  1051. <?php if (version_compare($wp_version, '2.5', '>=') == TRUE): ?>
  1052. <table class="form-table" width="100%" cellspacing="2" cellpadding="5">
  1053. <?php else: ?>
  1054. <table class="editform" width="100%" cellspacing="2" cellpadding="5">
  1055. <?php endif ?>
  1056. <tr>
  1057. <th scope="row" valign="top"><label for="name"><?php _e('Category name:', 'wpjobads') ?></label></th>
  1058. <td><input type="text" class="regular-text" id="name" name="name" size="40" value="<?php echo attribute_escape($category['name']) ?>" tabindex="1" /></td>
  1059. </tr>
  1060. <tr>
  1061. <th scope="row" valign="top"><label for="priority"><?php _e('Priority:', 'wpjobads') ?></label></th>
  1062. <td>
  1063. <input type="text" id="priority" name="priority" size="3" value="<?php echo attribute_escape($category['priority']) ?>" tabindex="2" />
  1064. <br/>
  1065. <?php _e('Determines the order of display.', 'wpjobads') ?>
  1066. </td>
  1067. </tr>
  1068. </table>
  1069. <p class="submit">
  1070. <input type="submit" name="Submit" value="<?php echo attribute_escape($submit_text) ?>" />
  1071. </p>
  1072. </form>
  1073. <?php
  1074. }// }}}
  1075. function wpjobads_admin_load_jobs()// {{{
  1076. {
  1077. if ($_POST['action'] == 'add') return wpjobads_admin_add_job();
  1078. elseif ($_POST['action'] == 'update') return wpjobads_admin_update_job();
  1079. elseif ($_GET['action'] == 'delete') return wpjobads_admin_delete_job();
  1080. }// }}}
  1081. function wpjobads_admin_jobs()// {{{
  1082. {
  1083. $wpjobads_options = get_option('wpjobads_options');
  1084. if (empty($wpjobads_options['license_key'])) return wpjobads_license_form('wpjobads-admin-jobs');
  1085. if ($_GET['action'] == 'edit') return wpjobads_admin_edit_job();
  1086. global $wpdb, $wp_version;
  1087. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1088. $columns = 'id, posted, modified, title, category, type, company_name, company_url, ad_approved, ad_paid, ad_published, ad_currency, ad_price';
  1089. $page = max(isset($_GET['paged']) ? intval($_GET['paged']) : 1, 1);
  1090. $limit = WPJOBADS_ADMIN_JOB_ENTRIES;
  1091. $offset = ($page - 1) * $limit;
  1092. if (isset($_GET['s'])) {
  1093. $search = $wpdb->escape($_GET['s']);
  1094. $sql = "SELECT $columns FROM $table_job WHERE title LIKE '%$search%' ORDER BY posted DESC LIMIT $limit OFFSET $offset";
  1095. $jobs = $wpdb->get_results($sql, ARRAY_A);
  1096. $total = intval($wpdb->get_var("SELECT COUNT(id) AS total FROM $table_job WHERE title LIKE '%$search%' ORDER BY posted DESC", 0));
  1097. } else {
  1098. $sql = "SELECT $columns FROM $table_job ORDER BY posted DESC LIMIT $limit OFFSET $offset";
  1099. $jobs = $wpdb->get_results($sql, ARRAY_A);
  1100. $total = intval($wpdb->get_var("SELECT COUNT(id) AS total FROM $table_job ORDER BY posted DESC", 0));
  1101. }
  1102. if (!$jobs) $jobs = array();
  1103. $prev = $offset + $limit < $total ? true : false;
  1104. $next = $page > 1 ? true : false;
  1105. $messages[1] = __('Job added.', 'wpjobads');
  1106. $messages[2] = __('Job deleted.', 'wpjobads');
  1107. $messages[3] = __('Job updated.', 'wpjobads');
  1108. $messages[4] = __('Job not added.', 'wpjobads');
  1109. $messages[5] = __('Job not updated.', 'wpjobads');
  1110. $form = '<form name="addjob" id="addjob" method="post" action="admin.php?page=wpjobads-admin-jobs&action=add">';
  1111. $action = 'add';
  1112. $nonce_action = 'add-job-listing';
  1113. $heading = __('Add Job Listing', 'wpjobads');
  1114. $submit_text = __('Add Job Listing', 'wpjobads');
  1115. $gmt_offset = intval(get_option('gmt_offset')) * 3600;
  1116. $colors = array('fulltime' => '#009900', 'parttime' => '#663366', 'freelance' => '#FE8433', 'internship' => '#000000');
  1117. $labels = array('fulltime' => __('Full Time', 'wpjobads'), 'parttime' => __('Part Time', 'wpjobads'), 'freelance' => __('Freelance', 'wpjobads'), 'internship' => __('Internship', 'wpjobads'));
  1118. ?>
  1119. <?php if (isset($_GET['message'])) : ?>
  1120. <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
  1121. <?php endif; ?>
  1122. <div class="wrap">
  1123. <div id="icon-edit" class="icon32">
  1124. <br/>
  1125. </div>
  1126. <h2><?php _e('Job Listing (<a href="#addjob">add new</a>)', 'wpjobads') ?></h2>
  1127. <form style="position:relative;" method="get">
  1128. <ul class="subsubsub">
  1129. <li><a class="current"><?php _e('All', 'wpjobads') ?></a></li>
  1130. </ul>
  1131. <p class="search-box">
  1132. <input type="hidden" name="page" value="<?php echo attribute_escape(stripslashes($_GET['page'])) ?>">
  1133. <input type="text" class="search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])) ?>" />
  1134. <input type="submit" value="Search Jobs" class="button" style="font-size:13px;padding:3px;" />
  1135. </p>
  1136. <div class="clear" />
  1137. </form>
  1138. <br class="clear" />
  1139. <table class="widefat">
  1140. <thead>
  1141. <tr>
  1142. <th style="text-align: center;" scope="col"><?php _e('ID', 'wpjobads') ?></th>
  1143. <th scope="col"><?php _e('When', 'wpjobads') ?></th>
  1144. <th scope="col"><?php _e('Title', 'wpjobads') ?></th>
  1145. <th style="text-align: center;" scope="col"><?php _e('Published', 'wpjobads') ?></th>
  1146. <th style="text-align: center;" scope="col"><?php _e('Approved', 'wpjobads') ?></th>
  1147. <th style="text-align: center;" scope="col"><?php _e('Price', 'wpjobads') ?></th>
  1148. <th style="text-align: center;" scope="col"><?php _e('Paid', 'wpjobads') ?></th>
  1149. <th colspan="2" style="text-align: center;" scope="col"><?php _e('Action', 'wpjobads') ?></th>
  1150. </tr>
  1151. </thead>
  1152. <tbody>
  1153. <?php if (empty($jobs)): ?>
  1154. <tr><td colspan="7"><?php _e('No jobs found.', 'wpjobads') ?></td></tr>
  1155. <?php endif ?>
  1156. <?php foreach ($jobs as $i => $job): ?>
  1157. <?php if ($i % 2): ?>
  1158. <tr>
  1159. <?php else: ?>
  1160. <tr class="alternate">
  1161. <?php endif ?>
  1162. <td style="text-align: center;"><?php echo attribute_escape($job['id']) ?></td>
  1163. <td>
  1164. <?php echo attribute_escape(date('Y-m-d', strtotime($job['posted']) + $gmt_offset)) ?>
  1165. <br/>
  1166. <?php echo attribute_escape(date('g:i:s a', strtotime($job['posted']) + $gmt_offset)) ?>
  1167. </td>
  1168. <td>
  1169. <span style="color:white;background-color:<?php echo $colors[$job['type']] ?>;padding:1px;font-family:Helvetica;font-size:8px;font-weight:bold;text-transform:uppercase;"><?php echo attribute_escape($labels[$job['type']]) ?></span>
  1170. <?php if ($job['company_url']): ?>
  1171. <?php echo sprintf(__('%1$s at %2$s', 'wpjobads'), attribute_escape($job['title']), '<a href="'.attribute_escape($job['company_url']).'">'.attribute_escape($job['company_name'])).'</a>' ?>
  1172. <?php else: ?>
  1173. <?php echo sprintf(__('%1$s at %2$s', 'wpjobads'), attribute_escape($job['title']), attribute_escape($job['company_name'])) ?>
  1174. <?php endif ?>
  1175. </td>
  1176. <td style="text-align: center;"><?php $job['ad_published'] ? _e('Yes') : _e('No') ?></td>
  1177. <td style="text-align: center;"><?php $job['ad_approved'] ? _e('Yes') : _e('No') ?></td>
  1178. <?php if ($job['ad_price']): ?>
  1179. <td style="text-align: center;"><?php echo $job['ad_currency'] ?> <?php echo $job['ad_price'] ?></td>
  1180. <td style="text-align: center;"><?php $job['ad_paid'] ? _e('Yes') : _e('No') ?></td>
  1181. <?php else: ?>
  1182. <td style="text-align: center;" colspan="2"><?php _e('Free listing', 'wpjobads') ?></td>
  1183. <?php endif ?>
  1184. <td><a class="edit" href="admin.php?page=wpjobads-admin-jobs&amp;action=edit&amp;job_ID=<?php echo attribute_escape($job['id']) ?>"><?php _e('Edit', 'wpjobads') ?></a></td>
  1185. <td><a class="delete" href="<?php echo wp_nonce_url('admin.php?page=wpjobads-admin-jobs&amp;action=delete&amp;job_ID=' . $job['id'], 'delete-job_' . $job['id']) ?>" ><?php _e('Delete', 'wpjobads') ?></a></td>
  1186. </tr>
  1187. <?php endforeach ?>
  1188. </tbody>
  1189. </table>
  1190. <div class="navigation">
  1191. <?php if ($prev): ?>
  1192. <div class="alignleft">
  1193. <a href="admin.php?page=wpjobads-admin-jobs&amp;paged=<?php echo $page + 1 ?>"><?php _e('&laquo; Previous Entries', 'wpjobads') ?></a>
  1194. </div>
  1195. <?php endif ?>
  1196. <?php if ($next): ?>
  1197. <div class="alignright">
  1198. <a href="admin.php?page=wpjobads-admin-jobs&amp;paged=<?php echo $page - 1 ?>"><?php _e('Next Entries &raquo;', 'wpjobads') ?></a>
  1199. </div>
  1200. <?php endif ?>
  1201. </div>
  1202. </div>
  1203. <div class="wrap">
  1204. <h2><?php echo $heading ?></h2>
  1205. <?php wpjobads_admin_add_job_form(null, $form, $action, $nonce_action, $submit_text) ?>
  1206. </div>
  1207. <?php
  1208. }// }}}
  1209. function wpjobads_admin_job_form($job, $form, $action, $nonce_action, $submit_text)// {{{
  1210. {
  1211. global $wp_version;
  1212. $categories = wpjobads_get_all_categories();
  1213. $types = wpjobads_get_all_types();
  1214. $currencies = wpjobads_get_all_currencies();
  1215. $gmt_offset = intval(get_option('gmt_offset')) * 3600;
  1216. $date_format = get_option('date_format');
  1217. $time_format = get_option('time_format');
  1218. gmdate('Y-m-d H:i:s', $now + intval($job['ad_duration']) * 86400)
  1219. ?>
  1220. <?php echo $form ?>
  1221. <input type="hidden" value="<?php echo $action ?>" name="action" />
  1222. <input type="hidden" value="<?php echo attribute_escape($job['id']) ?>" name="job_ID"/>
  1223. <?php wp_nonce_field($nonce_action) ?>
  1224. <?php if (version_compare($wp_version, '2.5', '>=') == TRUE): ?>
  1225. <table class="form-table" width="100%" cellspacing="2" cellpadding="5">
  1226. <?php else: ?>
  1227. <table class="editform" width="100%" cellspacing="2" cellpadding="5">
  1228. <?php endif ?>
  1229. <tr>
  1230. <th scope="row" valign="middle"><label for="title"><?php _e('Job title:', 'wpjobads') ?></label></th>
  1231. <td><input type="text" class="regular-text" id="title" name="title" size="40" value="<?php echo attribute_escape($job['title']) ?>" tabindex="1" /></td>
  1232. </tr>
  1233. <tr>
  1234. <th scope="row" valign="top"><label for="category"><?php _e('Category:', 'wpjobads') ?></label></th>
  1235. <td>
  1236. <select id="category" name="category" tabindex="2">
  1237. <?php foreach ($categories as $cat): ?>
  1238. <option value="<?php echo attribute_escape($cat['id']) ?>" <?php wpjobads_selected($job['category'], $cat['id']) ?>><?php echo attribute_escape($cat['name']) ?></option>
  1239. <?php endforeach ?>
  1240. </select>
  1241. </td>
  1242. </tr>
  1243. <tr>
  1244. <th scope="row" valign="top"><label for="type"><?php _e('Type:', 'wpjobads') ?></label></th>
  1245. <td>
  1246. <select id="type" name="type" tabindex="3">
  1247. <?php foreach ($types as $type): ?>
  1248. <option value="<?php echo attribute_escape($type['id']) ?>" <?php wpjobads_selected($job['type'], $type['id']) ?>><?php echo attribute_escape($type['name']) ?></option>
  1249. <?php endforeach ?>
  1250. </select>
  1251. </td>
  1252. </tr>
  1253. <tr>
  1254. <th scope="row" valign="top"><label for="description"><?php _e('Description:', 'wpjobads') ?></label></th>
  1255. <td>
  1256. <textarea id="description" name="description" rows="7" cols="30" tabindex="3"><?php echo attribute_escape($job['description']) ?></textarea>
  1257. </td>
  1258. </tr>
  1259. <tr>
  1260. <th scope="row" valign="top"><label for="how_to_apply"><?php _e('How to apply:', 'wpjobads') ?></label></th>
  1261. <td>
  1262. <textarea id="how_to_apply" name="how_to_apply" rows="4" cols="30" tabindex="4"><?php echo attribute_escape($job['how_to_apply']) ?></textarea>
  1263. </td>
  1264. </tr>
  1265. <tr>
  1266. <th scope="row" valign="top"><label for="location"><?php _e('Job location:', 'wpjobads') ?></label></th>
  1267. <td><input type="text" class="regular-text" id="location" name="location" size="40" value="<?php echo attribute_escape($job['location']) ?>" tabindex="5" /></td>
  1268. </tr>
  1269. <tr>
  1270. <th scope="row" valign="top"><label for="zipcode"><?php _e('Zipcode (optional):', 'wpjobads') ?></label></th>
  1271. <td><input type="text" class="regular-text" id="zipcode" name="zipcode" size="10" value="<?php echo attribute_escape($job['zipcode']) ?>" tabindex="6" /></td>
  1272. </tr>
  1273. <tr>
  1274. <th scope="row" valign="top"><label for="company_name"><?php _e('Company name:', 'wpjobads') ?></label></th>
  1275. <td><input type="text" class="regular-text" id="company_name" name="company_name" size="40" value="<?php echo attribute_escape($job['company_name']) ?>" tabindex="7" /></td>
  1276. </tr>
  1277. <tr>
  1278. <th scope="row" valign="top"><label for="company_url"><?php _e('Company URL (optional):', 'wpjobads') ?></label></th>
  1279. <td>
  1280. <input type="text" class="regular-text" id="company_url" name="company_url" size="40" value="<?php echo attribute_escape($job['company_url']) ?>" tabindex="8" />
  1281. <br/>
  1282. <?php _e("Don't forget the http:// part.", 'wpjobads') ?>
  1283. </td>
  1284. </tr>
  1285. <tr>
  1286. <th scope="row" valign="top"><label for="contact_name"><?php _e('Contact name:', 'wpjobads') ?></label></th>
  1287. <td><input type="text" class="regular-text" id="contact_name" name="contact_name" size="40" value="<?php echo attribute_escape($job['contact_name']) ?>" tabindex="9" /></td>
  1288. </tr>
  1289. <tr>
  1290. <th scope="row" valign="top"><label for="contact_email"><?php _e('Contact email:', 'wpjobads') ?></label></th>
  1291. <td><input type="text" class="regular-text" id="contact_email" name="contact_email" size="40" value="<?php echo attribute_escape($job['contact_email']) ?>" tabindex="10" /></td>
  1292. </tr>
  1293. <tr valign="top">
  1294. <th scope="row"><label for="ad_duration"><?php _e('Duration (in days):', 'wpjobads') ?></label></th>
  1295. <td>
  1296. <input type="text" id="ad_duration" name="ad_duration" value="<?php echo attribute_escape($job['ad_duration']) ?>" size="3" tabindex="11" />
  1297. Expiration date: <?php echo date($date_format . ' ' . $time_format, strtotime($job['expired']) + $gmt_offset) ?>
  1298. <br/>
  1299. <?php _e('Setting the duration to -1 means the duration is indefinite.', 'wpjobads') ?>
  1300. </td>
  1301. </tr>
  1302. <tr valign="top">
  1303. <th scope="row"><label for="ad_currency"><?php _e('Currency &amp; price:', 'wpjobads') ?></label></th>
  1304. <td>
  1305. <select id="ad_currency" name="ad_currency" tabindex="12">
  1306. <?php foreach ($currencies as $cur => $txt): ?>
  1307. <option value="<?php echo attribute_escape($cur) ?>" <?php wpjobads_selected($job['ad_currency'], $cur) ?>><?php echo attribute_escape($txt) ?></option>
  1308. <?php endforeach ?>
  1309. </select>
  1310. <input type="text" name="ad_price" value="<?php echo attribute_escape($job['ad_price']) ?>" size="3" tabindex="13" />
  1311. <br/>
  1312. <?php _e('Setting the price to 0 means free job listings.', 'wpjobads') ?>
  1313. </td>
  1314. </tr>
  1315. <tr>
  1316. <th scope="row" valign="top"><label for="ad_paid"><?php _e('Paid:', 'wpjobads') ?></label></th>
  1317. <td>
  1318. <select id="ad_paid" name="ad_paid" tabindex="14">
  1319. <option value="0" <?php wpjobads_selected($job['ad_paid'], 0) ?>><?php _e('No') ?></option>
  1320. <option value="1" <?php wpjobads_selected($job['ad_paid'], 1) ?>><?php _e('Yes') ?></option>
  1321. </select>
  1322. </td>
  1323. </tr>
  1324. <tr>
  1325. <th scope="row" valign="top"><label for="ad_approved"><?php _e('Approved:', 'wpjobads') ?></label></th>
  1326. <td>
  1327. <select id="ad_approved" name="ad_approved" tabindex="15">
  1328. <option value="0" <?php wpjobads_selected($job['ad_approved'], 0) ?>><?php _e('No') ?></option>
  1329. <option value="1" <?php wpjobads_selected($job['ad_approved'], 1) ?>><?php _e('Yes') ?></option>
  1330. </select>
  1331. </td>
  1332. </tr>
  1333. <tr>
  1334. <th scope="row" valign="top"><label for="ad_published"><?php _e('Published:', 'wpjobads') ?></label></th>
  1335. <td>
  1336. <select id="ad_published" name="ad_published" tabindex="16">
  1337. <option value="0" <?php wpjobads_selected($job['ad_published'], 0) ?>><?php _e('No') ?></option>
  1338. <option value="1" <?php wpjobads_selected($job['ad_published'], 1) ?>><?php _e('Yes') ?></option>
  1339. </select>
  1340. </td>
  1341. </tr>
  1342. <tr>
  1343. <th scope="row" valign="top"><label for="txn_id"><?php _e('PayPal Transaction ID:', 'wpjobads') ?></th>
  1344. <td><input type="text" class="regular-text" id="txn_id" name="txn_id" size="40" value="<?php echo attribute_escape($job['txn_id']) ?>" tabindex="17" /></td>
  1345. </tr>
  1346. </table>
  1347. <p class="submit">
  1348. <input type="submit" name="Submit" value="<?php echo attribute_escape($submit_text) ?>" tabindex="18" />
  1349. </p>
  1350. </form>
  1351. <?php
  1352. }// }}}
  1353. function wpjobads_admin_add_job_form($job, $form, $action, $nonce_action, $submit_text)// {{{
  1354. {
  1355. if (is_null($job)) {
  1356. $wpjobads_options = get_option('wpjobads_options');
  1357. $job = array();
  1358. $job['id'] = '';
  1359. $job['posted'] = '';
  1360. $job['modified'] = $job['posted'];
  1361. $job['expired'] = gmdate('Y-m-d H:i:s', time() + intval($wpjobads_options['duration']) * 86400);
  1362. $job['title'] = '';
  1363. $job['category'] = $wpjobads_options['default_category'];
  1364. $job['description'] = '';
  1365. $job['how_to_apply'] = '';
  1366. $job['company_name'] = '';
  1367. $job['location'] = '';
  1368. $job['zipcode'] = '';
  1369. $job['company_url'] = '';
  1370. $job['contact_name'] = '';
  1371. $job['contact_email'] = '';
  1372. $job['ad_duration'] = intval($wpjobads_options['duration']);
  1373. $job['ad_currency'] = $wpjobads_options['currency'];
  1374. $job['ad_price'] = 0;
  1375. $job['ad_paid'] = 0;
  1376. $job['ad_approved'] = 0;
  1377. $job['ad_published'] = 0;
  1378. $job['txn_id'] = '';
  1379. }
  1380. wpjobads_admin_job_form($job, $form, $action, $nonce_action, $submit_text);
  1381. }// }}}
  1382. function wpjobads_admin_edit_job_form($job, $form, $action, $nonce_action, $submit_text)// {{{
  1383. {
  1384. wpjobads_admin_job_form($job, $form, $action, $nonce_action, $submit_text);
  1385. }// }}}
  1386. function wpjobads_admin_load_options()// {{{
  1387. {
  1388. if ($_POST['action'] == 'activate') return wpjobads_admin_activate_license();
  1389. if ($_POST['action'] == 'update') return wpjobads_admin_update_options();
  1390. }// }}}
  1391. function wpjobads_admin_options()// {{{
  1392. {
  1393. $wpjobads_options = get_option('wpjobads_options');
  1394. if (empty($wpjobads_options['license_key'])) return wpjobads_license_form('wpjobads-admin-options');
  1395. $messages[1] = __('Options updated.', 'wpjobads');
  1396. $messages[2] = __('Options not updated.', 'wpjobads');
  1397. $form = '<form method="post" action="admin.php?page=wpjobads-admin-options&amp;action=update">';
  1398. $action = 'update';
  1399. $nonce_action = 'update-options';
  1400. $heading = __('Options', 'wpjobads');
  1401. $submit_text = __('Save Changes');
  1402. ?>
  1403. <?php if (isset($_GET['message'])) : ?>
  1404. <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
  1405. <?php endif; ?>
  1406. <div class="wrap">
  1407. <div id="icon-options-general" class="icon32">
  1408. <br/>
  1409. </div>
  1410. <h2><?php echo $heading ?></h2>
  1411. <?php wpjobads_admin_options_form($wpjobads_options, $form, $action, $nonce_action, $submit_text) ?>
  1412. </div>
  1413. <?php
  1414. }// }}}
  1415. function wpjobads_admin_load_uninstall()// {{{
  1416. {
  1417. if ($_POST['action'] == 'uninstall') return wpjobads_uninstall();
  1418. }// }}}
  1419. function wpjobads_admin_uninstall()// {{{
  1420. {
  1421. $heading = __('Uninstall', 'wpjobads');
  1422. ?>
  1423. <div class="wrap">
  1424. <h2><?php echo $heading ?></h2>
  1425. <p>Remove all data associated with this plugin and deactivate it.</p>
  1426. <form method="post" action="admin.php?page=wpjobads-admin-uninstall">
  1427. <input type="hidden" name="action" value="uninstall">
  1428. <input type="submit" class="button-secondary action" value="Uninstall Now" />
  1429. </form>
  1430. <p>Warning: This action <em>cannot</em> be undone.</p>
  1431. </div>
  1432. <?php
  1433. }// }}}
  1434. function wpjobads_get_all_currencies()// {{{
  1435. {
  1436. return array('USD' => 'USD', 'CAD' => 'CAD', 'EUR' => 'EUR', 'GBP' => 'GBP', 'YEN' => 'YEN', 'AUD' => 'AUD', 'NZD' => 'NZD', 'CHF' => 'CHF', 'HKD' => 'HKD', 'SGD' => 'SGD', 'SEK' => 'SEK', 'DKK' => 'DKK', 'PLN' => 'PLN', 'NOK' => 'NOK', 'HUF' => 'HUF', 'CZK' => 'CZK');
  1437. }// }}}
  1438. function wpjobads_admin_options_form($wpjobads_options, $form, $action, $nonce_action, $submit_text)// {{{
  1439. {
  1440. global $wpdb, $wp_version;
  1441. if (!$wpjobads_options) {
  1442. $wpjobads_options = get_option('wpjobads_options');
  1443. }
  1444. $currencies = wpjobads_get_all_currencies();
  1445. ?>
  1446. <?php echo $form ?>
  1447. <input type="hidden" name="action" value="<?php echo $action ?>" />
  1448. <?php wp_nonce_field($nonce_action) ?>
  1449. <?php if (version_compare($wp_version, '2.5', '>=') == TRUE): ?>
  1450. <table class="form-table">
  1451. <?php else: ?>
  1452. <table class="optiontable">
  1453. <?php endif ?>
  1454. <tr valign="top">
  1455. <th scope="row"><?php _e('Job board title:', 'wpjobads') ?></th>
  1456. <td>
  1457. <input type="text" class="regular-text" name="title" value="<?php echo attribute_escape($wpjobads_options['title']) ?>" size="40" />
  1458. </td>
  1459. </tr>
  1460. <tr valign="top">
  1461. <th scope="row"><?php _e('Description:', 'wpjobads') ?></th>
  1462. <td>
  1463. <textarea name="description" class="large-text" rows="10" cols="50"><?php echo $wpjobads_options['description'] ?></textarea>
  1464. <br/>
  1465. <?php _e('Shown at the very top of "Post new job" form.', 'wpjobads') ?>
  1466. </td>
  1467. </tr>
  1468. <tr valign="top">
  1469. <th scope="row"><?php _e('Invite:', 'wpjobads') ?></th>
  1470. <td>
  1471. <input type="text" class="regular-text" name="invite" value="<?php echo attribute_escape($wpjobads_options['invite']) ?>" size="40" />
  1472. </td>
  1473. </tr>
  1474. <tr valign="top">
  1475. <th scope="row"><?php _e('Enable new job listings?', 'wpjobads') ?></th>
  1476. <td>
  1477. <input type="hidden" name="enable_frontend" value="0" />
  1478. <input type="checkbox" id="enable_frontend" name="enable_frontend" value="1" <?php wpjobads_checked($wpjobads_options['enable_frontend'], 1) ?> tabindex="1" />
  1479. <label for="enable_frontend"><?php _e('Checking this will enable the "Post new job" form.', 'wpjobads') ?></label>
  1480. </td>
  1481. </tr>
  1482. <tr valign="top">
  1483. <th scope="row"><?php _e('Auto approve listings?', 'wpjobads') ?></th>
  1484. <td>
  1485. <input type="hidden" name="auto_approve" value="0" />
  1486. <input type="checkbox" id="auto_approve" name="auto_approve" value="1" <?php wpjobads_checked($wpjobads_options['auto_approve'], 1) ?> />
  1487. <label for="auto_approve"><?php _e('Checking this will automatically approve any incoming job ads', 'wpjobads') ?></label>
  1488. </td>
  1489. </tr>
  1490. <tr valign="top">
  1491. <th scope="row"><?php _e('Send payment email on auto approve?', 'wpjobads') ?></th>
  1492. <td>
  1493. <input type="hidden" name="force_payment_email" value="0" />
  1494. <input type="checkbox" id="force_payment_email" name="force_payment_email" value="1" <?php wpjobads_checked($wpjobads_options['force_payment_email'], 1) ?> />
  1495. <label for="force_payment_email"><?php _e('Checking this will send the payment email message (if any) even if auto approve is on', 'wpjobads') ?></label>
  1496. </td>
  1497. </tr>
  1498. <tr valign="top">
  1499. <th scope="row"><?php _e('Duration (in days):', 'wpjobads') ?></th>
  1500. <td><input type="text" name="duration" value="<?php echo attribute_escape($wpjobads_options['duration']) ?>" size="3" /></td>
  1501. </tr>
  1502. <tr valign="top">
  1503. <th scope="row"><?php _e('Currency:', 'wpjobads') ?></th>
  1504. <td>
  1505. <select name="currency">
  1506. <?php foreach ($currencies as $cur => $txt): ?>
  1507. <option value="<?php echo attribute_escape($cur) ?>" <?php wpjobads_selected($wpjobads_options['currency'], $cur) ?>><?php echo attribute_escape($txt) ?></option>
  1508. <?php endforeach ?>
  1509. </select>
  1510. </td>
  1511. </tr>
  1512. <tr valign="top">
  1513. <th><?php _e('Full time price:', 'wpjobads') ?></th>
  1514. <td>
  1515. <input type="text" name="fulltime_price" value="<?php echo attribute_escape($wpjobads_options['fulltime_price']) ?>" size="3" />
  1516. </td>
  1517. </tr>
  1518. <tr valign="top">
  1519. <th><?php _e('Part time price:', 'wpjobads') ?></th>
  1520. <td>
  1521. <input type="text" name="parttime_price" value="<?php echo attribute_escape($wpjobads_options['parttime_price']) ?>" size="3" />
  1522. </td>
  1523. </tr>
  1524. <tr valign="top">
  1525. <th><?php _e('Freelance price:', 'wpjobads') ?></th>
  1526. <td>
  1527. <input type="text" name="freelance_price" value="<?php echo attribute_escape($wpjobads_options['freelance_price']) ?>" size="3" />
  1528. </td>
  1529. </tr>
  1530. <tr valign="top">
  1531. <th><?php _e('Internship price:', 'wpjobads') ?></th>
  1532. <td>
  1533. <input type="text" name="internship_price" value="<?php echo attribute_escape($wpjobads_options['internship_price']) ?>" size="3" />
  1534. </td>
  1535. </tr>
  1536. <tr valign="top">
  1537. <th scope="row"><?php _e('PayPal email:', 'wpjobads') ?></th>
  1538. <td>
  1539. <input type="text" class="code" name="paypal_email" value="<?php echo attribute_escape($wpjobads_options['paypal_email']) ?>" size="40" />
  1540. <br/>
  1541. <?php _e('This email address must match your PayPal email address.', 'wpjobads') ?>
  1542. </td>
  1543. </tr>
  1544. <tr valign="top">
  1545. <th scope="row"><?php _e('PayPal URL:', 'wpjobads') ?></th>
  1546. <td>
  1547. <input type="text" class="code" name="paypal_url" value="<?php echo attribute_escape($wpjobads_options['paypal_url']) ?>" size="40" />
  1548. <br/>
  1549. <span class="code"><?php _e('This should generally be https://www.paypal.com/cgi-bin/webscr', 'wpjobads') ?></span>
  1550. </td>
  1551. </tr>
  1552. <tr valign="top">
  1553. <th scope="row"><?php _e('PayPal verification URL') ?></th>
  1554. <td>
  1555. <input type="text" class="code" name="paypal_verification_url" value="<?php echo attribute_escape($wpjobads_options['paypal_verification_url']) ?>" size="40" />
  1556. <br/>
  1557. <span class="code"><?php _e('This should generally be ssl://www.paypal.com:443/cgi-bin/webscr', 'wpjobads') ?></span>
  1558. </td>
  1559. </tr>
  1560. <tr valign="top">
  1561. <th scope="row"><?php _e('SSL availability:', 'wpjobads') ?></th>
  1562. <td>
  1563. <?php if (extension_loaded('openssl')): ?>
  1564. <?php _e('Installed.', 'wpjobads') ?>
  1565. <?php else: ?>
  1566. <?php _e('Not installed. In order for PayPal to work right, you <em>must</em> enable SSL (openssl) support.', 'wpjobads') ?>
  1567. <?php endif ?>
  1568. </td>
  1569. </tr>
  1570. <tr valign="top">
  1571. <th scope="row"><?php _e('Job listing date format:', 'wpjobads') ?></th>
  1572. <td>
  1573. <input type="text" class="regular-text" name="date_format" value="<?php echo attribute_escape($wpjobads_options['date_format']) ?>" size="30" />
  1574. <br/>
  1575. Output: <strong><?php echo date($wpjobads_options['date_format'], time()) ?></strong>
  1576. <br/>
  1577. <?php _e('<a href="http://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date formatting</a>. Click "Save Changes" to update sample output.', 'wpjobads') ?>
  1578. </td>
  1579. </tr>
  1580. <tr valign="top">
  1581. <th scope="row" valign="top"><?php _e('Terms:', 'wpjobads') ?></th>
  1582. <td>
  1583. <textarea name="terms" class="large-text" rows="10" cols="50"><?php echo attribute_escape($wpjobads_options['terms']) ?></textarea>
  1584. <br/>
  1585. <?php _e('Shown to ad buyers prior to submission.', 'wpjobads') ?>
  1586. </td>
  1587. </tr>
  1588. <tr valign="top">
  1589. <th scope="row" valign="top"><?php _e('Payment email:', 'wpjobads') ?></th>
  1590. <td>
  1591. Subject<br/><input type="text" class="regular-text" name="payment_email_subject" value="<?php echo attribute_escape($wpjobads_options['payment_email_subject']) ?>" size="40" /><br/>
  1592. Message<br/><textarea name="payment_email_message" class="large-text" rows="10" cols="50"><?php echo attribute_escape($wpjobads_options['payment_email_message']) ?></textarea><br/>
  1593. <?php _e('Sent to advertisers prior to payment.', 'wpjobads') ?>
  1594. </td>
  1595. </tr>
  1596. <tr valign="top">
  1597. <th scope="row" valign="top"><?php _e('Publish email:', 'wpjobads') ?></th>
  1598. <td>
  1599. Subject<br/><input type="text" class="regular-text" name="publish_email_subject" value="<?php echo attribute_escape($wpjobads_options['publish_email_subject']) ?>" size="40" /><br/>
  1600. Message<br/><textarea name="publish_email_message" class="large-text" rows="10" cols="50"><?php echo attribute_escape($wpjobads_options['publish_email_message']) ?></textarea><br/>
  1601. <?php _e('Sent to advertisers when their ad is published.', 'wpjobads') ?>
  1602. </td>
  1603. </tr>
  1604. <tr valign="top">
  1605. <th scope="row" valign="top"><?php _e('Email from:', 'wpjobads') ?></th>
  1606. <td>
  1607. <input type="text" name="email_from_name" value="<?php echo attribute_escape($wpjobads_options['email_from_name']) ?>" size="20" />
  1608. <input type="text" name="email_from" value="<?php echo attribute_escape($wpjobads_options['email_from']) ?>" size="20" />
  1609. <br/>
  1610. <?php _e('Name and email address all outgoing mails are from', 'wpjobads') ?>
  1611. </td>
  1612. </tr>
  1613. <tr valign="top">
  1614. <th scope="row" valign="top"><?php _e('Email notification:', 'wpjobads') ?></th>
  1615. <td>
  1616. <input type="text" name="email_notification" value="<?php echo attribute_escape($wpjobads_options['email_notification']) ?>" size="40" />
  1617. <br/>
  1618. <?php _e('Email address to be notified when a new listing is submitted. Empty this field if you do not want notifications.', 'wpjobads') ?>
  1619. </td>
  1620. </tr>
  1621. <tr valign="top">
  1622. <th scope="row" valign="top"><?php _e('Notification email:', 'wpjobads') ?></th>
  1623. <td>
  1624. Subject<br/><input type="text" class="regular-text" name="notification_email_subject" value="<?php echo attribute_escape($wpjobads_options['notification_email_subject']) ?>" size="40" /><br/>
  1625. Message<br/><textarea name="notification_email_message" class="large-text" rows="10" cols="50"><?php echo attribute_escape($wpjobads_options['notification_email_message']) ?></textarea><br/>
  1626. <?php _e('Sent to email notification address defined above when a new listing is submitted.', 'wpjobads') ?>
  1627. </td>
  1628. </tr>
  1629. <tr valign="top">
  1630. <th scope="row" valign="top"><?php _e('Expired ads viewable?', 'wpjobads') ?></th>
  1631. <td>
  1632. <input type="hidden" name="viewable_expired_ads" value="0" />
  1633. <input type="checkbox" id="viewable_expired_ads" name="viewable_expired_ads" value="1" <?php wpjobads_checked($wpjobads_options['viewable_expired_ads'], 1) ?> />
  1634. <label for="viewable_expired_ads"><?php _e('Checking this will allow your site users to view expired ads', 'wpjobads') ?></label>
  1635. </td>
  1636. </tr>
  1637. <tr valign="top">
  1638. <th scope="row" valign="top"><?php _e('Enable random job ad in posts?', 'wpjobads') ?></th>
  1639. <td>
  1640. <input type="hidden" name="enable_random_ad" value="0" />
  1641. <input type="checkbox" id="enable_random_ad" name="enable_random_ad" value="1" <?php wpjobads_checked($wpjobads_options['enable_random_ad'], 1) ?> />
  1642. <label for="enable_random_ad"><?php _e('Checking this will enable random job ad in every post', 'wpjobads') ?></label>
  1643. </td>
  1644. </tr>
  1645. </table>
  1646. <input type="hidden" name="page_options" value="title,description,invite,enable_frontend,auto_approve,force_payment_email,duration,currency,fulltime_price,parttime_price,freelance_price,internship_price,paypal_email,paypal_url,paypal_verification_url,date_format,terms,payment_email_subject,payment_email_message,publish_email_subject,publish_email_message,email_from_name,email_from,email_notification,notification_email_subject,notification_email_message,viewable_expired_ads,enable_random_ad" />
  1647. <p class="submit">
  1648. <input type="submit" name="Submit" value="<?php echo attribute_escape($submit_text) ?>" />
  1649. </p>
  1650. </form>
  1651. <?php
  1652. }// }}}
  1653. function wpjobads_admin_activate_license()// {{{
  1654. {
  1655. check_admin_referer('activate-license');
  1656. if (!current_user_can('manage_options'))
  1657. wp_die(__('Cheatin&#8217; uh?'));
  1658. $_POST['license_key'] = strtoupper($_POST['license_key']);
  1659. if (!preg_match('/[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}/', $_POST['license_key'])) {
  1660. wp_redirect('admin.php?page=' . $_POST['r'] . '&m=' . urlencode(base64_encode('Invalid license key')));
  1661. return;
  1662. }
  1663. $wpjobads_options = get_option('wpjobads_options');
  1664. $wpjobads_options['license_key'] = $_POST['license_key'];
  1665. update_option('wpjobads_options', $wpjobads_options);
  1666. wp_redirect('admin.php?page=' . $_POST['r']);
  1667. }// }}}
  1668. function wpjobads_admin_update_options()// {{{
  1669. {
  1670. check_admin_referer('update-options');
  1671. if (!current_user_can('manage_options'))
  1672. wp_die(__('Cheatin&#8217; uh?'));
  1673. if (wpjobads_update_options(stripslashes_deep($_POST))) {
  1674. wp_redirect('admin.php?page=wpjobads-admin-options&message=1');
  1675. } else {
  1676. wp_redirect('admin.php?page=wpjobads-admin-options&message=2');
  1677. }
  1678. }// }}}
  1679. function wpjobads_update_options($options)// {{{
  1680. {
  1681. $wpjobads_options = get_option('wpjobads_options');
  1682. $page_options = explode(',', $options['page_options']);
  1683. foreach ($page_options as $key) {
  1684. if (isset($options[$key]))
  1685. $wpjobads_options[$key] = $options[$key];
  1686. }
  1687. return update_option('wpjobads_options', $wpjobads_options);
  1688. }// }}}
  1689. function wpjobads_admin_add_category()// {{{
  1690. {
  1691. check_admin_referer('add-job-category');
  1692. if (!current_user_can('manage_options'))
  1693. wp_die(__('Cheatin&#8217; uh?'));
  1694. if(wpjobads_insert_category(stripslashes_deep($_POST))) {
  1695. wp_redirect('admin.php?page=wpjobads-admin-categories&message=1');
  1696. } else {
  1697. wp_redirect('admin.php?page=wpjobads-admin-categories&message=4');
  1698. }
  1699. }// }}}
  1700. function wpjobads_admin_edit_category()// {{{
  1701. {
  1702. $cat_ID = (int) $_GET['cat_ID'];
  1703. $category = wpjobads_get_category($cat_ID);
  1704. $heading = __('Edit Job Category', 'wpjobads');
  1705. $submit_text = __('Update Job Category', 'wpjobads');
  1706. $form = '<form name="editcat" id="editcat" method="post" action="admin.php?page=wpjobads-admin-categories&amp;action=update">';
  1707. $action = 'update';
  1708. $nonce_action = 'update-job-category_' . $cat_ID;
  1709. ?>
  1710. <div class="wrap">
  1711. <h2><?php echo $heading ?></h2>
  1712. <?php wpjobads_admin_category_form($category, $form, $action, $nonce_action, $submit_text) ?>
  1713. </div>
  1714. <?php
  1715. }// }}}
  1716. function wpjobads_admin_update_category()// {{{
  1717. {
  1718. $cat_ID = (int) $_POST['cat_ID'];
  1719. check_admin_referer('update-job-category_' . $cat_ID);
  1720. if (!current_user_can('manage_options'))
  1721. wp_die(__('Cheatin&#8217; uh?'));
  1722. if (wpjobads_update_category(stripslashes_deep($_POST)))
  1723. wp_redirect('admin.php?page=wpjobads-admin-categories&message=3');
  1724. else
  1725. wp_redirect('admin.php?page=wpjobads-admin-categories&message=5');
  1726. }// }}}
  1727. function wpjobads_admin_delete_category()// {{{
  1728. {
  1729. $cat_ID = (int) $_GET['cat_ID'];
  1730. check_admin_referer('delete-job-category_' . $cat_ID);
  1731. if (!current_user_can('manage_options'))
  1732. wp_die(__('Cheatin&#8217; uh?'));
  1733. $cat_name = wpjobads_get_catname($cat_ID);
  1734. $wpjobads_options = get_option('wpjobads_options');
  1735. if ($cat_ID == $wpjobads_options['default_category'])
  1736. wp_die(sprintf(__('Can&#8217;t delete the <strong>%s</strong> category: this is the default one'), $cat_name));
  1737. wpjobads_delete_category($cat_ID);
  1738. wp_redirect('admin.php?page=wpjobads-admin-categories&message=2');
  1739. }// }}}
  1740. function wpjobads_admin_add_job()// {{{
  1741. {
  1742. check_admin_referer('add-job-listing');
  1743. if (!current_user_can('manage_options'))
  1744. wp_die(__('Cheatin&#8217; uh?'));
  1745. $_POST['ad_paid'] = intval($_POST['ad_price']) == 0 ? 1 : 0;
  1746. if(wpjobads_insert_job(stripslashes_deep($_POST))) {
  1747. wp_redirect('admin.php?page=wpjobads-admin-jobs&message=1');
  1748. } else {
  1749. wp_redirect('admin.php?page=wpjobads-admin-jobs&message=4');
  1750. }
  1751. }// }}}
  1752. function wpjobads_admin_edit_job()// {{{
  1753. {
  1754. $job_ID = (int) $_GET['job_ID'];
  1755. $job = wpjobads_get_job($job_ID);
  1756. $heading = __('Edit Job', 'wpjobads');
  1757. $submit_text = __('Update Job', 'wpjobads');
  1758. $form = '<form name="editjob" id="editjob" method="post" action="admin.php?page=wpjobads-admin-jobs&amp;action=update">';
  1759. $action = 'update';
  1760. $nonce_action = 'update-job_' . $job_ID;
  1761. ?>
  1762. <div class="wrap">
  1763. <h2><?php echo $heading ?></h2>
  1764. <?php wpjobads_admin_edit_job_form($job, $form, $action, $nonce_action, $submit_text) ?>
  1765. </div>
  1766. <?php
  1767. }// }}}
  1768. function wpjobads_admin_update_job()// {{{
  1769. {
  1770. $job_ID = (int) $_POST['job_ID'];
  1771. check_admin_referer('update-job_' . $job_ID);
  1772. if (!current_user_can('manage_options'))
  1773. wp_die(__('Cheatin&#8217; uh?'));
  1774. if (wpjobads_update_job(stripslashes_deep($_POST)))
  1775. wp_redirect('admin.php?page=wpjobads-admin-jobs&message=3');
  1776. else
  1777. wp_redirect('admin.php?page=wpjobads-admin-jobs&message=5');
  1778. }// }}}
  1779. function wpjobads_admin_delete_job()// {{{
  1780. {
  1781. $job_ID = (int) $_GET['job_ID'];
  1782. check_admin_referer('delete-job_' . $job_ID);
  1783. if (!current_user_can('manage_options'))
  1784. wp_die(__('Cheatin&#8217; uh?'));
  1785. wpjobads_delete_job($job_ID);
  1786. wp_redirect('admin.php?page=wpjobads-admin-jobs&message=2');
  1787. }// }}}
  1788. // ----------------------------------------------------------------------------
  1789. // Data functions
  1790. function wpjobads_get_category($cat_ID)// {{{
  1791. {
  1792. global $wpdb;
  1793. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1794. $sql = "SELECT id, name, priority, job_count FROM $table_category WHERE id = " . intval($cat_ID) . " LIMIT 1";
  1795. $category = $wpdb->get_row($sql, ARRAY_A);
  1796. return $category;
  1797. }// }}}
  1798. function wpjobads_get_all_categories()// {{{
  1799. {
  1800. global $wpdb;
  1801. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1802. $sql = "SELECT id, name, priority, job_count FROM $table_category ORDER BY priority ASC, name ASC";
  1803. $categories = $wpdb->get_results($sql, ARRAY_A);
  1804. return $categories;
  1805. }// }}}
  1806. function wpjobads_get_catname($cat_ID)// {{{
  1807. {
  1808. global $wpdb;
  1809. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1810. $sql = "SELECT name FROM $table_category WHERE id = " . intval($cat_ID) . " LIMIT 1";
  1811. $name = $wpdb->get_var($sql);
  1812. return $name;
  1813. }// }}}
  1814. function wpjobads_insert_category($category)// {{{
  1815. {
  1816. global $wpdb;
  1817. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1818. if (empty($category['name']))
  1819. return false;
  1820. $category['priority'] = intval($category['priority']);
  1821. if (!$category['priority'])
  1822. return false;
  1823. $sql = "INSERT INTO $table_category (name, priority)
  1824. VALUES ('" . $wpdb->escape($category['name']) . "', " . $category['priority'] . ")";
  1825. $result = $wpdb->query($sql);
  1826. return $result;
  1827. }// }}}
  1828. function wpjobads_update_category($category)// {{{
  1829. {
  1830. global $wpdb;
  1831. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1832. if (empty($category['cat_ID']) || empty($category['name']) || empty($category['priority']))
  1833. return false;
  1834. $category['id'] = intval($category['cat_ID']);
  1835. $category['priority'] = intval($category['priority']);
  1836. if ($category['priority'] < 1) return false;
  1837. $sql = "UPDATE $table_category SET name = '" . $wpdb->escape($category['name']) . "',
  1838. priority = " . $category['priority'] . " WHERE id = " . $category['id'];
  1839. $result = $wpdb->query($sql);
  1840. return $result;
  1841. }// }}}
  1842. function wpjobads_delete_category($cat_ID)// {{{
  1843. {
  1844. global $wpdb;
  1845. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1846. $sql = "DELETE FROM $table_category WHERE id = " . intval($cat_ID);
  1847. $result = $wpdb->query($sql);
  1848. return $result;
  1849. }// }}}
  1850. function wpjobads_get_all_types()// {{{
  1851. {
  1852. return array(
  1853. array('id' => 'fulltime', 'name' => __('Full Time', 'wpjobads')),
  1854. array('id' => 'parttime', 'name' => __('Part Time', 'wpjobads')),
  1855. array('id' => 'freelance', 'name' => __('Freelance', 'wpjobads')),
  1856. array('id' => 'internship', 'name' => __('Internship', 'wpjobads'))
  1857. );
  1858. }// }}}
  1859. function wpjobads_job_is_viewable($job_ID, $strict = true)// {{{
  1860. {
  1861. global $wpdb;
  1862. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1863. if ($strict) {
  1864. $now = gmdate('Y-m-d H:i:s', time());
  1865. $sql = "SELECT COUNT(id) FROM $table_job WHERE id = " . $job_ID . " AND ad_paid = 1 AND ad_approved = 1 AND expired > '$now'";
  1866. } else {
  1867. $sql = "SELECT COUNT(id) FROM $table_job WHERE id = " . $job_ID . " AND ad_paid = 1 AND ad_approved = 1";
  1868. }
  1869. $viewable = $wpdb->get_var($sql);
  1870. return (bool) $viewable;
  1871. }// }}}
  1872. function wpjobads_get_job($job_ID)// {{{
  1873. {
  1874. global $wpdb;
  1875. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1876. $sql = "SELECT * FROM $table_job WHERE id = " . intval($job_ID) . " LIMIT 1";
  1877. $job = $wpdb->get_row($sql, ARRAY_A);
  1878. return $job;
  1879. }// }}}
  1880. function wpjobads_get_all_jobs($cat_ID = null, $type = null, $ad_approved = 1, $ad_paid = 1, $ad_published = 1)// {{{
  1881. {
  1882. global $wpdb;
  1883. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1884. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1885. $columns = "$table_job.id, $table_job.posted, $table_job.title, $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";
  1886. $now = gmdate('Y-m-d H:i:s', time());
  1887. $categories = wpjobads_get_all_categories();
  1888. $conditions = array();
  1889. if ($cat_ID) {
  1890. $cat_ID = $wpdb->escape($cat_ID);
  1891. $conditions[] = "$table_category.id = $cat_ID";
  1892. }
  1893. if ($type) {
  1894. $type = $wpdb->escape($type);
  1895. $conditions[] = "$table_job.type = '$type'";
  1896. }
  1897. $conditions = empty($conditions) ? '' : 'AND ' . implode(' AND ', $conditions);
  1898. $sql = "SELECT $columns FROM $table_job INNER JOIN $table_category ON $table_job.category = $table_category.id WHERE ad_approved = $ad_approved AND ad_paid = $ad_paid AND ad_published = $ad_published AND (expired > '$now' OR ad_duration = -1) $conditions ORDER BY posted DESC";
  1899. $jobs = array();
  1900. $_jobs = $wpdb->get_results($sql, ARRAY_A);
  1901. $__jobs = array();
  1902. foreach ($categories as $category) {
  1903. $__jobs[$category['id']]['label'] = $category['name'];
  1904. $__jobs[$category['id']]['listing'] = array();
  1905. }
  1906. if (!empty($_jobs)) {
  1907. foreach ($_jobs as $job) {
  1908. $__jobs[$job['category_id']]['listing'][] = $job;
  1909. }
  1910. foreach ($__jobs as $cat => $job) {
  1911. if (!empty($job['listing'])) {
  1912. $jobs[$cat] = $job;
  1913. }
  1914. }
  1915. } elseif (isset($cat_ID)) {
  1916. $jobs[$cat_ID] = array('label' => wpjobads_get_catname($cat_ID), 'listing' => array());
  1917. }
  1918. return $jobs;
  1919. }// }}}
  1920. function wpjobads_search_all_jobs($query = '', $ad_approved = 1, $ad_paid = 1, $ad_published = 1)// {{{
  1921. {
  1922. global $wpdb;
  1923. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1924. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  1925. $columns = "$table_job.id, $table_job.posted, $table_job.title, $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";
  1926. $now = gmdate('Y-m-d H:i:s', time());
  1927. $categories = wpjobads_get_all_categories();
  1928. if ($query) {
  1929. $query = $wpdb->escape($query);
  1930. $sql = "SELECT $columns FROM $table_job INNER JOIN $table_category ON $table_job.category = $table_category.id WHERE ad_approved = $ad_approved AND ad_paid = $ad_paid AND ad_published = $ad_published AND (expired > '$now' OR ad_duration = -1) AND ($table_job.title LIKE '%$query%' OR $table_job.description LIKE '%$query%') ORDER BY posted DESC";
  1931. }
  1932. $jobs = array();
  1933. $_jobs = $wpdb->get_results($sql, ARRAY_A);
  1934. $__jobs = array();
  1935. foreach ($categories as $category) {
  1936. $__jobs[$category['id']]['label'] = $category['name'];
  1937. $__jobs[$category['id']]['listing'] = array();
  1938. }
  1939. if (!empty($_jobs)) {
  1940. foreach ($_jobs as $job) {
  1941. $__jobs[$job['category_id']]['listing'][] = $job;
  1942. }
  1943. foreach ($__jobs as $cat => $job) {
  1944. if (!empty($job['listing'])) {
  1945. $jobs[$cat] = $job;
  1946. }
  1947. }
  1948. } elseif (isset($cat_ID)) {
  1949. $jobs[$cat_ID] = array('label' => wpjobads_get_catname($cat_ID), 'listing' => array());
  1950. }
  1951. return $jobs;
  1952. }// }}}
  1953. function wpjobads_valid_job($job)// {{{
  1954. {
  1955. if (empty($job['title'])) return false;
  1956. if (!intval($job['category'])) return false;
  1957. if (empty($job['description'])) return false;
  1958. if (empty($job['how_to_apply'])) return false;
  1959. if (empty($job['location'])) return false;
  1960. if (empty($job['company_name'])) return false;
  1961. //if (empty($job['company_url'])) return false;
  1962. if (empty($job['contact_name'])) return false;
  1963. if (empty($job['contact_email'])) return false;
  1964. return true;
  1965. }// }}}
  1966. function wpjobads_insert_job($job)// {{{
  1967. {
  1968. global $wpdb;
  1969. $wpjobads_options = get_option('wpjobads_options');
  1970. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  1971. if (!wpjobads_valid_job($job)) return false;
  1972. $now = time();
  1973. $job['posted'] = $job['modified'] = $wpdb->escape(gmdate('Y-m-d H:i:s', $now));
  1974. $job['expired'] = $wpdb->escape(gmdate('Y-m-d H:i:s', $now + intval($job['ad_duration']) * 86400));
  1975. $job['title'] = $wpdb->escape($job['title']);
  1976. $job['category'] = intval($job['category']);
  1977. $job['type'] = $wpdb->escape($job['type']);
  1978. $job['description'] = $wpdb->escape($job['description']);
  1979. $job['how_to_apply'] = $wpdb->escape($job['how_to_apply']);
  1980. $job['location'] = $wpdb->escape($job['location']);
  1981. $job['zipcode'] = $wpdb->escape($job['zipcode']);
  1982. $job['company_name'] = $wpdb->escape($job['company_name']);
  1983. $job['company_url'] = $wpdb->escape($job['company_url']);
  1984. $job['contact_name'] = $wpdb->escape($job['contact_name']);
  1985. $job['contact_email'] = $wpdb->escape($job['contact_email']);
  1986. $job['ad_duration'] = $wpdb->escape($job['ad_duration']);
  1987. $job['ad_currency'] = $wpdb->escape($job['ad_currency']);
  1988. $job['ad_price'] = $wpdb->escape($job['ad_price']);
  1989. $job['ad_paid'] = $wpdb->escape($job['ad_paid']);
  1990. $job['ad_approved'] = $wpdb->escape($job['ad_approved']);
  1991. $job['ad_published'] = $wpdb->escape($job['ad_published']);
  1992. $job['txn_id'] = $wpdb->escape(trim($job['txn_id']));
  1993. $job['ip_address'] = $wpdb->escape(preg_replace('/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR']));
  1994. $sql = "INSERT INTO $table_job
  1995. (`posted`, `modified`, `expired`, `title`, `category`, `type`, `description`,
  1996. `how_to_apply`, `company_name`, `location`, `zipcode`, `company_url`, `contact_name`, `contact_email`, `ip_address`, `ad_approved`, `ad_paid`, `ad_duration`, `ad_currency`, `ad_price`, `ad_published`".($job['txn_id']?', `txn_id`':null).")
  1997. VALUES
  1998. ('".$job['posted']."', '".$job['modified']."', '".$job['expired']."', '".$job['title']."', ".$job['category'].", '".$job['type']."', '".$job['description']."',
  1999. '".$job['how_to_apply']."', '".$job['company_name']."', '".$job['location']."', '".$job['zipcode']."', '".$job['company_url']."', '".$job['contact_name']."', '".$job['contact_email']."', '".$job['ip_address']."', ".$job['ad_approved'].", ".$job['ad_paid'].", ".$job['ad_duration'].", '".$job['ad_currency']."', ".$job['ad_price'].", ".$job['ad_published'].($job['txn_id']?", '".$job['txn_id']."'":null).")";
  2000. $result = $wpdb->query($sql);
  2001. if ($result) {
  2002. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  2003. $sql = "UPDATE $table_category SET job_count = job_count + 1 WHERE id = " . $job['category'];
  2004. $wpdb->query($sql);
  2005. }
  2006. return $result;
  2007. }// }}}
  2008. function wpjobads_update_job($job)// {{{
  2009. {
  2010. global $wpdb;
  2011. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  2012. if (!wpjobads_valid_job($job)) return false;
  2013. $job['id'] = $job['job_ID'];
  2014. $job['modified'] = $wpdb->escape(gmdate('Y-m-d H:i:s', time()));
  2015. $job['title'] = $wpdb->escape($job['title']);
  2016. $job['category'] = intval($job['category']);
  2017. $job['type'] = $wpdb->escape($job['type']);
  2018. $job['description'] = $wpdb->escape($job['description']);
  2019. $job['how_to_apply'] = $wpdb->escape($job['how_to_apply']);
  2020. $job['location'] = $wpdb->escape($job['location']);
  2021. $job['zipcode'] = $wpdb->escape($job['zipcode']);
  2022. $job['company_name'] = $wpdb->escape($job['company_name']);
  2023. $job['company_url'] = $wpdb->escape($job['company_url']);
  2024. $job['contact_name'] = $wpdb->escape($job['contact_name']);
  2025. $job['contact_email'] = $wpdb->escape($job['contact_email']);
  2026. $job['ad_duration'] = $wpdb->escape($job['ad_duration']);
  2027. $job['ad_currency'] = $wpdb->escape($job['ad_currency']);
  2028. $job['ad_price'] = $wpdb->escape($job['ad_price']);
  2029. $job['ad_paid'] = $wpdb->escape($job['ad_paid']);
  2030. $job['ad_approved'] = $wpdb->escape($job['ad_approved']);
  2031. $job['ad_published'] = $wpdb->escape($job['ad_published']);
  2032. $job['txn_id'] = $wpdb->escape(trim($job['txn_id']));
  2033. $old = wpjobads_get_job($job['job_ID']);
  2034. $sql = "UPDATE $table_job SET
  2035. `modified` = '".$job['modified']."', `title` = '".$job['title']."', `category` = ".$job['category'].", `type` = '".$job['type']."', `description` = '".$job['description']."',
  2036. `how_to_apply` = '".$job['how_to_apply']."', `company_name` = '".$job['company_name']."', `location` = '".$job['location']."', `zipcode` = '".$job['zipcode']."',
  2037. `company_url` = '".$job['company_url']."', `contact_name` = '".$job['contact_name']."', `contact_email` = '".$job['contact_email']."', `ad_duration` = ".$job['ad_duration'].", `ad_currency` = '".$job['ad_currency']."', `ad_price` = ".$job['ad_price'].", `ad_paid` = ".$job['ad_paid'].", `ad_approved` = ".$job['ad_approved'].", `ad_published` = ".$job['ad_published'].($job['txn_id']?", `txn_id` = '".$job['txn_id']."'":null)." WHERE `id` = ".$job['id'];
  2038. $result = $wpdb->query($sql);
  2039. if ($result and ($old['category'] != $job['category'])) {
  2040. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  2041. $wpdb->query("UPDATE $table_category SET job_count = job_count - 1 WHERE job_count > 0 AND id = " . intval($old['category']));
  2042. $wpdb->query("UPDATE $table_category SET job_count = job_count + 1 WHERE id = " . $job['category']);
  2043. }
  2044. return $result;
  2045. }// }}}
  2046. function wpjobads_delete_job($job_ID)// {{{
  2047. {
  2048. global $wpdb;
  2049. $job = wpjobads_get_job($job_ID);
  2050. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  2051. $sql = "DELETE FROM $table_job WHERE id = " . intval($job_ID);
  2052. $result = $wpdb->query($sql);
  2053. if ($result) {
  2054. $table_category = $wpdb->prefix . WPJOBADS_CATEGORY;
  2055. $sql = "UPDATE $table_category SET job_count = job_count - 1 WHERE id = " . $job['category'];
  2056. $wpdb->query($sql);
  2057. }
  2058. return $result;
  2059. }// }}}
  2060. // ----------------------------------------------------------------------------
  2061. // PayPal functions
  2062. function wpjobads_paypal_form($job)// {{{
  2063. {
  2064. $wpjobads_options = get_option('wpjobads_options');
  2065. ob_start();
  2066. $permalink = wpjobads_get_permalink();
  2067. $parsed_url = parse_url($permalink);
  2068. $path = $parsed_url['path'];
  2069. $permalink .= ($path{strlen($path)-1} == '/') ? '#wpjobads' : '/#wpjobads';
  2070. ?>
  2071. <form method="post" action="<?php echo attribute_escape($wpjobads_options['paypal_url']) ?>">
  2072. <input type="hidden" name="cmd" value="_xclick">
  2073. <input type="hidden" name="business" value="<?php echo attribute_escape($wpjobads_options['paypal_email']) ?>">
  2074. <input type="hidden" name="item_name" value="<?php echo attribute_escape(sprintf(__('Job Ad: %s', 'wpjobads'), $job['title']))?>">
  2075. <input type="hidden" name="item_number" value="<?php echo attribute_escape($job['id']) ?>">
  2076. <input type="hidden" name="amount" value="<?php echo attribute_escape($job['ad_price']) ?>">
  2077. <input type="hidden" name="no_shipping" value="2">
  2078. <input type="hidden" name="no_note" value="1">
  2079. <input type="hidden" name="currency_code" value="<?php echo attribute_escape($job['ad_currency']) ?>">
  2080. <input type="hidden" name="return" value="<?php echo attribute_escape(wpjobads_get_permalink('action=paypal-return')) ?>">
  2081. <input type="hidden" name="notify_url" value="<?php echo attribute_escape($permalink) ?>">
  2082. <input type="hidden" name="rm" value="1">
  2083. <input type="hidden" name="bn" value="PP-BuyNowBF">
  2084. <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but23.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
  2085. <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
  2086. </form>
  2087. <?php
  2088. $contents = ob_get_contents();
  2089. ob_end_clean();
  2090. return $contents;
  2091. }// }}}
  2092. function wpjobads_paypal_ipn()// {{{
  2093. {
  2094. $request[] = 'cmd=_notify-validate';
  2095. foreach ($_POST as $key => $value) {
  2096. $request[] = urlencode(stripslashes($key)) . '=' . urlencode(stripslashes($value));
  2097. }
  2098. $job = wpjobads_get_job($_POST['item_number']);
  2099. if (!$job) {
  2100. wpjobads_log('PayPal payment_status incomplete (' . $_POST['payment_status'] . ') for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2101. header('HTTP/1.1 200 OK');
  2102. exit;
  2103. }
  2104. $wpjobads_options = get_option('wpjobads_options');
  2105. $paypal_url = $wpjobads_options['paypal_url'];
  2106. //list($header, $response) = wpjobads_http_post($paypal_url, implode('&', $request), array(), 30);
  2107. list($header, $response) = wpjobads_paypal_verify(implode('&', $request), array(), 30);
  2108. // make sure we send HTTP 200 response
  2109. header('HTTP/1.1 200 OK');
  2110. if ($response !== false) {
  2111. // check for validation
  2112. if (strcmp(strtoupper($response), 'VERIFIED') == 0) {
  2113. // check that the payment_status is Completed
  2114. if ($_POST['payment_status'] != 'Completed') {
  2115. wpjobads_log('PayPal payment_status incomplete (' . $_POST['payment_status'] . ') for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2116. exit;
  2117. }
  2118. // check that txn_id has not been previously processed
  2119. if (wpjobads_txn_id_exists($_POST['txn_id'])) {
  2120. wpjobads_log('PayPal txn_id "'.$_POST['txn_id'].'" already exists for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2121. exit;
  2122. }
  2123. // check that receiver_email is your primary PayPal email
  2124. if ($_POST['receiver_email'] != $wpjobads_options['paypal_email']) {
  2125. wpjobads_log('PayPal receiver_email error for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2126. exit;
  2127. }
  2128. // check that item_number, payment_amount and payment_currency are all correct
  2129. if ($_POST['item_number'] != $job['id'] or $_POST['mc_gross'] != $job['ad_price'] or $_POST['mc_currency'] != $job['ad_currency']) {
  2130. wpjobads_log('PayPal item_number/payment_amount/payment_currency error for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2131. exit;
  2132. }
  2133. // set job ad to "paid" and update its txn_id in one go
  2134. wpjobads_set_paid($job, $_POST['txn_id']);
  2135. // send email to advertiser
  2136. wpjobads_send_publish_email($job);
  2137. wpjobads_log(
  2138. 'PayPal VERIFIED response for job #' . $job['id'] . ' - "' . $job['title'] . '"',
  2139. 'Job #' . $job['id'] . ' - "' . $job['title'] . '" is set to "paid" and an email has been sent to ' . $job['contact_email']
  2140. );
  2141. // done!
  2142. exit;
  2143. } elseif (strcmp(strtoupper($response), 'INVALID') == 0) {
  2144. // silently log for manual investigation later
  2145. wpjobads_log('PayPal INVALID response for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2146. header('HTTP/1.1 200 OK');
  2147. exit;
  2148. }
  2149. } else {
  2150. wpjobads_log('PayPal unable to receive verification response for job #' . $job['id'] . ' - "' . $job['title'] . '"');
  2151. exit;
  2152. }
  2153. }// }}}
  2154. function wpjobads_log($log)// {{{
  2155. {
  2156. if (!WPJOBADS_WRITE_LOG) return;
  2157. $time = gmdate('H:i:s', time());
  2158. $logs = func_get_args();
  2159. $logs_dir = realpath(ABSPATH . PLUGINDIR . '/wpjobads/logs/');
  2160. if (is_writable($logs_dir)) {
  2161. $log_filename = $logs_dir . DIRECTORY_SEPARATOR . gmdate('Y-m-d', time()) . '.txt';
  2162. $fp = fopen($log_filename, 'a+');
  2163. if ($fp) {
  2164. foreach ($logs as $log)
  2165. fwrite($fp, "$time - $log\n");
  2166. fclose($fp);
  2167. }
  2168. }
  2169. }// }}}
  2170. function wpjobads_paypal_return()// {{{
  2171. {
  2172. ob_start();
  2173. ?>
  2174. <p><?php _e('Thank you for your purchase. Your payment is being processed.', 'wpjobads') ?></p>
  2175. <?php
  2176. $contents = ob_get_contents();
  2177. ob_end_clean();
  2178. return $contents;
  2179. }// }}}
  2180. function wpjobads_txn_id_exists($txn_id)// {{{
  2181. {
  2182. global $wpdb;
  2183. $table_job = $wpdb->prefix . WPJOBADS_JOB;
  2184. $txn_id = $wpdb->escape($txn_id);
  2185. $total = $wpdb->get_var("SELECT COUNT(txn_id) AS total FROM $table_job WHERE txn_id = '$txn_id'");
  2186. return $total != '0' ? true : false;
  2187. }// }}}
  2188. // ----------------------------------------------------------------------------
  2189. // Mail functions
  2190. function wpjobads_send_payment_email($job)// {{{
  2191. {
  2192. if (!WPJOBADS_SEND_EMAIL) return true;
  2193. $wpjobads_options = get_option('wpjobads_options');
  2194. $to = $job['contact_email'];
  2195. $subject = $wpjobads_options['payment_email_subject'];
  2196. $message = $wpjobads_options['payment_email_message'];
  2197. $subject = preg_replace('/%job_title%/', $job['title'], $subject);
  2198. $subject = preg_replace('/%contact_name%/', $job['contact_name'], $subject);
  2199. $message = preg_replace('/%job_title%/', $job['title'], $message);
  2200. $message = preg_replace('/%payment_url%/', wpjobads_get_permalink('action=paypal&job_id=' . $job['id']), $message);
  2201. $message = preg_replace('/%payment_link%/', '<a href="' . wpjobads_get_permalink('action=paypal&job_id=' . $job['id']) . '">' . attribute_escape($job['title']) . '</a>', $message);
  2202. $message = preg_replace('/%company_name%/', $job['company_name'], $message);
  2203. $message = preg_replace('/%company_url%/', $job['company_url'], $message);
  2204. $message = preg_replace('/%contact_name%/', $job['contact_name'], $message);
  2205. $message = preg_replace('/%contact_email%/', $job['contact_email'], $message);
  2206. $message = preg_replace('/%ad_expiration%/', $job['expired'], $message);
  2207. add_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2208. add_filter('wp_mail_from', 'wpjobads_mail_from');
  2209. $sent = wp_mail($to, $subject, $message, $headers = '');
  2210. remove_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2211. remove_filter('wp_mail_from', 'wpjobads_mail_from');
  2212. return $sent;
  2213. }// }}}
  2214. function wpjobads_send_publish_email($job)// {{{
  2215. {
  2216. if (!WPJOBADS_SEND_EMAIL) return true;
  2217. $wpjobads_options = get_option('wpjobads_options');
  2218. $to = $job['contact_email'];
  2219. $subject = $wpjobads_options['publish_email_subject'];
  2220. $message = $wpjobads_options['publish_email_message'];
  2221. $subject = preg_replace('/%job_title%/', $job['title'], $subject);
  2222. $subject = preg_replace('/%contact_name%/', $job['contact_name'], $subject);
  2223. $message = preg_replace('/%job_title%/', $job['title'], $message);
  2224. $message = preg_replace('/%ad_url%/', wpjobads_get_permalink('job_id=' . $job['id']), $message);
  2225. $message = preg_replace('/%ad_link%/', '<a href="' . wpjobads_get_permalink('job_id=' . $job['id']) . '">' . attribute_escape($job['title']) . '</a>', $message);
  2226. $message = preg_replace('/%company_name%/', $job['company_name'], $message);
  2227. $message = preg_replace('/%company_url%/', $job['company_url'], $message);
  2228. $message = preg_replace('/%contact_name%/', $job['contact_name'], $message);
  2229. $message = preg_replace('/%contact_email%/', $job['contact_email'], $message);
  2230. $message = preg_replace('/%ad_expiration%/', $job['expired'], $message);
  2231. add_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2232. add_filter('wp_mail_from', 'wpjobads_mail_from');
  2233. $sent = wp_mail($to, $subject, $message, $headers = '');
  2234. remove_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2235. remove_filter('wp_mail_from', 'wpjobads_mail_from');
  2236. return $sent;
  2237. }// }}}
  2238. function wpjobads_send_notification_email($job)// {{{
  2239. {
  2240. if (!WPJOBADS_SEND_EMAIL) return true;
  2241. $wpjobads_options = get_option('wpjobads_options');
  2242. $to = $wpjobads_options['email_notification'];
  2243. $subject = $wpjobads_options['notification_email_subject'];
  2244. $message = $wpjobads_options['notification_email_message'];
  2245. $subject = preg_replace('/%job_id%/', $job['id'], $subject);
  2246. $subject = preg_replace('/%job_title%/', $job['title'], $subject);
  2247. $message = preg_replace('/%job_id%/', $job['id'], $message);
  2248. $message = preg_replace('/%job_title%/', $job['title'], $message);
  2249. $message = preg_replace('/%company_name%/', $job['company_name'], $message);
  2250. $message = preg_replace('/%company_url%/', $job['company_url'], $message);
  2251. $message = preg_replace('/%contact_name%/', $job['contact_name'], $message);
  2252. $message = preg_replace('/%contact_email%/', $job['contact_email'], $message);
  2253. $message = preg_replace('/%ad_expiration%/', $job['expired'], $message);
  2254. add_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2255. add_filter('wp_mail_from', 'wpjobads_mail_from');
  2256. $sent = wp_mail($to, $subject, $message, $headers = '');
  2257. remove_filter('wp_mail_from_name', 'wpjobads_mail_from_name');
  2258. remove_filter('wp_mail_from', 'wpjobads_mail_from');
  2259. return $sent;
  2260. }// }}}
  2261. function wpjobads_mail_from_name($value)// {{{
  2262. {
  2263. $wpjobads_options = get_option('wpjobads_options');
  2264. return $wpjobads_options['email_from_name'];
  2265. }// }}}
  2266. function wpjobads_mail_from($value)// {{{
  2267. {
  2268. $wpjobads_options = get_option('wpjobads_options');
  2269. return $wpjobads_options['email_from'];
  2270. }// }}}
  2271. // ----------------------------------------------------------------------------
  2272. // Widget functions
  2273. function wpjobads_widget_init()// {{{
  2274. {
  2275. if (!function_exists('wp_register_sidebar_widget') or !function_exists('wp_register_widget_control')) {
  2276. return;
  2277. } else {
  2278. wp_register_sidebar_widget('wpjobads', 'WPJobAds', 'wpjobads_widget', array('classname' => 'widget_wpjobads', 'description' => __('WPJobAds list of job categories', 'wpjobads')));
  2279. wp_register_widget_control('wpjobads', 'WPJobAds', 'wpjobads_widget_control');
  2280. wp_register_sidebar_widget('wpjobads_search', 'WPJobAds Search', 'wpjobads_widget_search', array('classname' => 'widget_wpjobads', 'description' => __('WPJobAds search widget', 'wpjobads')));
  2281. }
  2282. }// }}}
  2283. add_action('plugins_loaded', 'wpjobads_widget_init');
  2284. function wpjobads_widget($args)// {{{
  2285. {
  2286. extract($args);
  2287. $wpjobads_options = get_option('wpjobads_options');
  2288. $widget_title = empty($wpjobads_options['widget_title']) ? attribute_escape(__('Job Board', 'wpjobads')) : attribute_escape($wpjobads_options['widget_title']);
  2289. $widget_invite = empty($wpjobads_options['widget_invite']) ? attribute_escape(__('Post new job', 'wpjobads')) : attribute_escape($wpjobads_options['widget_invite']);
  2290. $categories = wpjobads_get_all_categories();
  2291. $out = '<li><a href="' . wpjobads_get_permalink() . '">' . __('All Jobs', 'wpjobads') . '</a></li>';
  2292. foreach ($categories as $cat) {
  2293. $out .= '<li><a href="' . wpjobads_get_permalink('jobcat=' . attribute_escape($cat['id'])) . '">' . attribute_escape($cat['name']) . '</a></li>';
  2294. }
  2295. if ($wpjobads_options['enable_frontend'])
  2296. $out .= '<p><a href="' . wpjobads_get_permalink('action=postjob') . '">' . $widget_invite . '</a></p>';
  2297. $out .= '<p>' . sprintf(__('Powered by %s', 'wpjobads'), '<a href="http://www.wpjobads.com">WPJobAds</a>') . '</p>';
  2298. ?>
  2299. <?php echo $before_widget ?>
  2300. <?php echo $before_title . $widget_title . $after_title ?>
  2301. <ul>
  2302. <?php echo $out ?>
  2303. </ul>
  2304. <?php echo $after_widget ?>
  2305. <?php
  2306. }// }}}
  2307. function wpjobads_widget_control()// {{{
  2308. {
  2309. $wpjobads_options = get_option('wpjobads_options');
  2310. if ($_POST['wpjobads-submit']) {
  2311. $new_options = $wpjobads_options;
  2312. $widget_title = strip_tags(stripslashes($_POST['wpjobads-title']));
  2313. if ($wpjobads_options['widget_title'] != $widget_title) {
  2314. $new_options['widget_title'] = $widget_title;
  2315. }
  2316. $invite = strip_tags(stripslashes($_POST['wpjobads-invite']));
  2317. if ($wpjobads_options['widget_invite'] != $invite) {
  2318. $new_options['widget_invite'] = $invite;
  2319. }
  2320. if ($wpjobads_options != $new_options) {
  2321. $wpjobads_options = $new_options;
  2322. update_option('wpjobads_options', $wpjobads_options);
  2323. }
  2324. }
  2325. ?>
  2326. <p><label for="wpjobads-title"><?php _e('Title:', 'wpjobads'); ?></label> <input id="wpjobads-title" class="widefat" name="wpjobads-title" type="text" value="<?php echo attribute_escape($wpjobads_options['widget_title']) ?>" /></p>
  2327. <p><label for="wpjobads-invite"><?php _e('Invite:', 'wpjobads'); ?></label> <input id="wpjobads-invite" class="widefat" name="wpjobads-invite" type="text" value="<?php echo attribute_escape($wpjobads_options['widget_invite']) ?>" /></p>
  2328. <input type="hidden" id="wpjobads-submit" name="wpjobads-submit" value="1" />
  2329. <?php
  2330. }// }}}
  2331. function wpjobads_widget_search($args)// {{{
  2332. {
  2333. extract($args);
  2334. $search_url = get_option('home');
  2335. $wpjobads_options = get_option('wpjobads_options');
  2336. ?>
  2337. <form method="get" action="<?php echo attribute_escape($search_url) ?>">
  2338. <label class="hidden" for="jobsearch"><?php _e('Search Job:', 'wpjobads') ?></label>
  2339. <div>
  2340. <input type="hidden" value="<?php echo attribute_escape($wpjobads_options['post_id']) ?>" name="page_id" />
  2341. <input type="text" value="<?php echo attribute_escape($_GET['search']) ?>" name="search" id="search" />
  2342. <input type="submit" value="<?php _e('Search Job', 'wpjobads') ?>" id="jobsearchsubmit" />
  2343. </div>
  2344. </form>
  2345. <?php
  2346. }// }}}
  2347. function wpjobads_rss($args)// {{{
  2348. {
  2349. $wpjobads_rss_url = wpjobads_get_permalink('jobfeed=rss2');
  2350. ?>
  2351. <li><a href="<?php echo attribute_escape($wpjobads_rss_url) ?>" title="<?php echo attribute_escape(__('Syndicate this site using RSS 2.0')); ?>"><?php _e('Jobs <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
  2352. <?php
  2353. }// }}}
  2354. add_action('wp_meta', 'wpjobads_rss');