fork download
  1. <?php
  2.  
  3. /**
  4. * Class TMM_Ext_PostType_Car
  5. */
  6. class TMM_Ext_PostType_Car {
  7.  
  8. public static $slug = 'car';
  9. public static $specifications_array = array();
  10. public static $image_sizes = array();
  11. public static $max_image_width = 1130;
  12. public static $max_image_height = 732;
  13. public static $car_options = array();
  14. public static $allowed_car_data_options = array(); //for security
  15.  
  16. public static function register($options) {
  17.  
  18. self::init_options($options);
  19.  
  20. //filter cars by id
  21. add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
  22. add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
  23. add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
  24.  
  25. add_filter("manage_" . self::$slug . "_posts_columns", array(__CLASS__, "show_edit_columns"));
  26. add_action("manage_" . self::$slug . "_posts_custom_column", array(__CLASS__, "show_edit_columns_content"));
  27. add_filter("manage_edit-" . self::$slug . "_sortable_columns", array(__CLASS__, "show_edit_sortable_columns"));
  28. add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
  29. add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
  30.  
  31. /* ajax callbacks */
  32. add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
  33. }
  34.  
  35. public static function init_options($cars_options) {
  36.  
  37. self::$car_options = $cars_options;
  38.  
  39. //image sizes
  40. $slider_size = self::slider_image_size();
  41. self::$image_sizes = array(
  42. 'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
  43. 'main' => array('width' => self::$max_image_width, 'height' => self::$max_image_height, 'description' => __('Full image', 'cardealer')),
  44. 'single_thumb_widget' => array('width' => 80, 'height' => 70, 'description' => __('Single page image thumb', 'cardealer')),
  45. 'thumb' => array('width' => 460, 'height' => 290, 'description' => __('Thumb of image', 'cardealer')),
  46. );
  47.  
  48. $data_groups = TMM_Cardealer_DataConstructor::get_data_groups();
  49. if (!empty($data_groups)) {
  50. if (is_array($data_groups)) {
  51. foreach ($data_groups as $key => $value) {
  52. self::$specifications_array[$key] = $value['name'];
  53. }
  54. }
  55. }
  56.  
  57. self::$allowed_car_data_options = array(
  58. 'car_is_new',
  59. 'car_is_damaged',
  60. 'car_is_used',
  61. 'car_price',
  62. 'car_year',
  63. 'car_mileage',
  64. 'car_transmission',
  65. 'car_fuel_type',
  66. 'car_body',
  67. 'car_vin',
  68. 'car_doors_count',
  69. 'car_interrior_color',
  70. 'car_interior_color',
  71. 'car_exterior_color',
  72. 'car_engine_size',
  73. 'car_engine_additional',
  74. 'car_owner_number',
  75. 'car_cover_image',
  76. 'advanced'
  77. );
  78.  
  79.  
  80. self::$allowed_car_data_options = array_merge(self::$allowed_car_data_options, array_keys(self::$specifications_array));
  81. }
  82.  
  83. /**
  84.   * Add car (ajax request)
  85.   */
  86. public static function add_car() {
  87. $user_ID = get_current_user_id();
  88. $data = array();
  89. parse_str($_REQUEST['data'], $data);
  90.  
  91. $args = array(
  92. 'ID' => 0,
  93. 'post_author' => $user_ID,
  94. 'post_status' => 'draft',
  95. 'post_excerpt' => mb_substr($data['description']['desc'], 0, (int) TMM::get_option('car_adv_desc_signs_count', TMM_APP_CARDEALER_PREFIX)),
  96. 'post_type' => self::$slug
  97. );
  98.  
  99. do_action('tmm_wpml_switch_lang_to_default');
  100.  
  101. $post_ID = wp_insert_post($args);
  102.  
  103. if (!empty($data)) {
  104.  
  105. foreach ($data as $key => $value) {
  106.  
  107. if ($key == 'description') {
  108. continue;
  109. }
  110.  
  111. if ($key == 'car_cover_image' && !empty($value)) {
  112. self::set_car_cover_image($post_ID, $value);
  113. }
  114.  
  115. if ($key == 'car_carlocation') {
  116. update_post_meta($post_ID, "car_carlocation", $value);
  117.  
  118. foreach ($value as $k => $loc) {
  119. if ($k == 0) {
  120. update_post_meta($post_ID, "car_carlocation_1", $loc);
  121. }
  122. if ($k == 1) {
  123. update_post_meta($post_ID, "car_carlocation_2", $loc);
  124. }
  125. if ($k == 2) {
  126. update_post_meta($post_ID, "car_carlocation_3", $loc);
  127. }
  128. }
  129. }
  130.  
  131. if ($key == 'cars_videos') {
  132. update_post_meta($post_ID, "cars_videos", $value);
  133. }
  134.  
  135. if ($key == 'photo_set_hash') {
  136. continue;
  137. }
  138.  
  139. if ($key == 'car_state'){
  140. update_post_meta($post_ID, 'car_condition', $value);
  141. }
  142.  
  143. if ($key == 'car_engine_size'){
  144. update_post_meta($post_ID, $key, str_replace(",", ".", $value));
  145. }
  146.  
  147. if ($key == 'car_taxonomies') {
  148.  
  149. foreach ($value as $tax => $tax_ids) {
  150. if (!empty($tax_ids)) {
  151. foreach ($tax_ids as $tax_id) {
  152. if (term_exists(intval($tax_id), $tax)) {
  153. wp_set_object_terms($post_ID, intval($tax_id), $tax, true);
  154. }
  155. }
  156. }
  157. }
  158.  
  159. continue;
  160. }
  161.  
  162. if ($key === 'tmm_advanced') {
  163. update_post_meta($post_ID, "advanced", $value);
  164. }
  165.  
  166. if (empty($key)) {
  167. continue;
  168. }
  169.  
  170. if (in_array($key, self::$allowed_car_data_options)) {
  171. add_post_meta($post_ID, $key, $value);
  172. }
  173. }
  174. }
  175.  
  176. //important, for listing
  177. update_post_meta($post_ID, "car_is_featured", 0);
  178.  
  179. //update post title
  180. $car_data = TMM_Ext_PostType_Car::get_car_data($post_ID);
  181. $car_producer = explode('/', $car_data['car_producer']);
  182. $def_title = @$car_producer[0] . " " . @$car_producer[1] . ' ' . $car_data['car_year'];
  183. $title = !empty($data['post_title']) ? trim( $data['post_title'] ) : '';
  184.  
  185. $args = array(
  186. 'ID' => $post_ID,
  187. 'post_status' => 'publish',
  188. 'post_title' => !empty($title) ? $title : $def_title,
  189. );
  190.  
  191. if (TMM::get_option('approve_new_car', TMM_APP_CARDEALER_PREFIX)) {
  192. update_post_meta($post_ID, 'unapproved', 1);
  193. $args['post_status'] = 'draft';
  194. }
  195.  
  196. if (TMM::get_option('allow_custom_title', TMM_APP_CARDEALER_PREFIX ) === '1' && TMM::get_option('car_link_type', TMM_APP_CARDEALER_PREFIX ) === 'custom' && !empty($title)) {
  197. $slug = $title;
  198. } else {
  199. $slug = $def_title;
  200. }
  201.  
  202. $slug = sanitize_title( $slug, $post_ID );
  203. $slug = wp_unique_post_slug($slug, 0, 'publish', TMM_Ext_PostType_Car::$slug, 0);
  204.  
  205. $args['post_name'] = $slug;
  206.  
  207. if(isset($_POST['description']['desc'])){
  208. $args['post_excerpt'] = mb_substr($_POST['description']['desc'], 0, (int) TMM::get_option('car_adv_desc_signs_count', TMM_APP_CARDEALER_PREFIX));
  209. }
  210.  
  211. wp_update_post($args);
  212.  
  213. //copy photo folder of the post
  214. $targetFolder = self::get_image_upload_folder() . $user_ID;
  215. if (!file_exists($targetFolder)) {
  216. @mkdir($targetFolder, 0755);
  217. }
  218.  
  219. $targetFolder = self::get_image_upload_folder() . $user_ID . '/' . $post_ID;
  220. @mkdir($targetFolder, 0755);
  221.  
  222. $oldFolder = self::get_image_upload_folder() . $user_ID . '/tmp/' . $data['photo_set_hash'];
  223. TMM_Helper::recursive_copy($oldFolder, $targetFolder);
  224. TMM_Helper::delete_dir($oldFolder);
  225.  
  226. do_action('tmm_wpml_duplicate_posts', $post_ID);
  227. do_action('tmm_wpml_switch_lang_to_current');
  228.  
  229. $rel_post_ID = apply_filters('tmm_current_lang_postid', $post_ID);
  230. $permalink = get_post_permalink($rel_post_ID, true);
  231. $user_obj = get_userdata($user_ID);
  232.  
  233. if (get_option('permalink_structure') == '') {
  234. $permalink = str_replace('='.$rel_post_ID, '='.$slug, $permalink);
  235. } else {
  236. $permalink = str_replace('%'.self::$slug.'%', $slug, $permalink);
  237. }
  238.  
  239. /* Send notification to user by email */
  240. if (tmm_allow_user_email($user_ID, 'user_posts_emails')) {
  241. global $tmm_config;
  242.  
  243. $email = $user_obj->user_email;
  244. $user_cars_page = TMM_Helper::get_permalink_by_lang( TMM::get_option('user_cars_page', TMM_APP_CARDEALER_PREFIX) );
  245.  
  246. if (!empty($user_cars_page)){
  247. $user_cars_page_link = '<a href="' . $user_cars_page . '">' . __("My Cars", 'cardealer') . '</a>';
  248. }else{
  249. $user_cars_page_link = __("My Cars", 'cardealer');
  250. }
  251.  
  252. $subject = __( TMM::get_option('new_car_email_subject', TMM_APP_CARDEALER_PREFIX), 'cardealer' );
  253. $message = __( TMM::get_option('new_car_email', TMM_APP_CARDEALER_PREFIX), 'cardealer' );
  254.  
  255. if (empty($subject)) {
  256. $subject = $tmm_config['emails']['create_car']['subject'];
  257. }
  258.  
  259. if (empty($message)) {
  260. $message = $tmm_config['emails']['create_car']['message'];
  261. }
  262.  
  263. $message = str_replace(
  264. array('__USER__', '__BR__', '__CARLINK__', '__USERCARSLINK__', '__SITENAME__'),
  265. array($user_obj->display_name, "<br>", '<a href="'.$permalink.'">'.$permalink.'</a>', $user_cars_page_link, get_bloginfo('name')),
  266. $message );
  267.  
  268. TMM_Cardealer_User::send_email($email, $subject, $message);
  269. }
  270.  
  271. if (TMM::get_option('approve_new_car', TMM_APP_CARDEALER_PREFIX) && TMM::get_option('approve_new_car_email', TMM_APP_CARDEALER_PREFIX)) {
  272. $args = array(
  273. 'preview' => true,
  274. //'_wpnonce' => wp_create_nonce('tmm'),
  275. );
  276.  
  277. $car_title = tmm_get_car_title($rel_post_ID);
  278. $subject = sprintf( __('[%1$s] Please moderate: "%2$s"', 'cardealer'), wp_specialchars_decode(get_option('blogname'), ENT_QUOTES), $car_title );
  279.  
  280. $message = sprintf( __('A new car ad "%s" is waiting for your approval', 'cardealer'), $car_title ) . "\r\n";
  281. $message .= add_query_arg($args, $permalink) . "\r\n\r\n";
  282. $message .= sprintf( __('Dealer: %s', 'cardealer' ), $user_obj->display_name) . "\r\n";
  283. $message .= sprintf( __('E-mail: %s', 'cardealer' ), $user_obj->user_email) . "\r\n";
  284.  
  285. $message .= __('Please visit the moderation panel:', 'cardealer') . "\r\n";
  286. $message .= admin_url("edit.php?post_status=draft&post_type=car") . "\r\n";
  287.  
  288. $admin_email = get_option('admin_email');
  289.  
  290. if (!$admin_email) {
  291. $admin_email = get_bloginfo('admin_email');
  292. }
  293.  
  294. $sended = wp_mail($admin_email, $subject, $message);
  295.  
  296. if (!$sended) {
  297. mail($admin_email, $subject, $message);
  298. }
  299.  
  300. }
  301.  
  302. wp_die($post_ID);
  303. }
  304.  
  305. /**
  306.   * Save car post metadata when a post is saved.
  307.   *
  308.   * @param int $post_id The post ID.
  309.   * @param post $post The post object.
  310.   * @param bool $update Whether this is an existing post being updated or not.
  311.   */
  312. public static function save($post_id, $post = null, $update = false) {
  313.  
  314. if (!empty($_POST) && isset($_POST['tmm_meta_saving'])) {
  315. wp_set_post_terms($post_id, @$_POST['car_taxonomies']['carproducer'], 'carproducer', false);
  316.  
  317. update_post_meta($post_id, "car_carlocation", $_POST["car_carlocation"]);
  318. update_post_meta($post_id, "car_carlocation_1", $_POST["car_carlocation"][0]);
  319. if(!empty($_POST["car_carlocation"][1])){
  320. update_post_meta($post_id, "car_carlocation_2", $_POST["car_carlocation"][1]);
  321. }
  322. if(!empty($_POST["car_carlocation"][2])){
  323. update_post_meta($post_id, "car_carlocation_3", $_POST["car_carlocation"][2]);
  324. }
  325.  
  326. update_post_meta($post_id, "car_condition", $_POST["car_state"]);
  327. update_post_meta($post_id, "car_vin", $_POST["car_vin"]);
  328. update_post_meta($post_id, "car_price", $_POST["car_price"]);
  329. update_post_meta($post_id, "car_year", $_POST["car_year"]);
  330. update_post_meta($post_id, "car_body", $_POST["car_body"]);
  331. update_post_meta($post_id, "car_doors_count", $_POST["car_doors_count"]);
  332. update_post_meta($post_id, "car_transmission", $_POST["car_transmission"]);
  333. update_post_meta($post_id, "car_fuel_type", $_POST["car_fuel_type"]);
  334. update_post_meta($post_id, "car_interrior_color", $_POST["car_interrior_color"]);
  335. update_post_meta($post_id, "car_exterior_color", $_POST["car_exterior_color"]);
  336. update_post_meta($post_id, "car_mileage", $_POST["car_mileage"]);
  337. update_post_meta($post_id, "car_engine_size", str_replace(",", ".", $_POST["car_engine_size"]));
  338. update_post_meta($post_id, "car_engine_additional", $_POST["car_engine_additional"]);
  339. update_post_meta($post_id, "car_owner_number", (int) $_POST["car_owner_number"]);
  340. update_post_meta($post_id, "cars_videos", $_POST["cars_videos"]);
  341.  
  342. /* remove unneeded meta fields */
  343. delete_post_meta($post_id, "used_car");
  344. delete_post_meta($post_id, "car_is_new");
  345. delete_post_meta($post_id, "car_is_damaged");
  346.  
  347. //important for car listing!!
  348. $car_is_featured = get_post_meta($post_id, 'car_is_featured', true);
  349. if (empty($car_is_featured)) {
  350. update_post_meta($post_id, "car_is_featured", 0);
  351. }
  352.  
  353. if (isset($_POST["tmm_advanced"])) {
  354. update_post_meta($post_id, "advanced", $_POST["tmm_advanced"]);
  355. }
  356.  
  357. //update post title
  358. $car_data = TMM_Ext_PostType_Car::get_car_data($post_id);
  359. $car_producer = explode('/', $car_data['car_producer']);
  360. $def_title = @$car_producer[0] . " " . @$car_producer[1] . ' ' . $car_data['car_year'];
  361. $title = !empty($_POST['post_title']) ? trim( $_POST['post_title'] ) : '';
  362.  
  363. $args = array(
  364. 'ID' => $post_id,
  365. 'post_title' => !empty($title) ? $title : $def_title,
  366. );
  367.  
  368. if( is_admin() && isset($_POST['tmm_new_post_saving']) && $_POST['tmm_new_post_saving'] ){
  369.  
  370. if (TMM::get_option('allow_custom_title', TMM_APP_CARDEALER_PREFIX ) === '1' && TMM::get_option('car_link_type', TMM_APP_CARDEALER_PREFIX ) === 'custom' && !empty($title)) {
  371. $slug = $title;
  372. } else {
  373. $slug = $def_title;
  374. }
  375.  
  376. $slug = sanitize_title( $slug, $post_id );
  377. $slug = wp_unique_post_slug($slug, 0, 'publish', TMM_Ext_PostType_Car::$slug, 0);
  378. $args['post_name'] = $slug;
  379. }
  380.  
  381. if(isset($_POST['description']['desc'])){
  382. $args['post_excerpt'] = mb_substr($_POST['description']['desc'], 0, (int) TMM::get_option('car_adv_desc_signs_count', TMM_APP_CARDEALER_PREFIX));
  383. }
  384.  
  385. global $wpdb;
  386. $where = array( 'ID' => $post_id );
  387. $wpdb->update( $wpdb->posts, $args, $where );
  388. }
  389.  
  390. }
  391.  
  392. /**
  393.   * Delete car (ajax request)
  394.   */
  395. public static function delete_car() {
  396. $post_id = (int) $_REQUEST['post_id'];
  397. $current_user_id = get_current_user_id();
  398. $post_user_id = get_post_field('post_author', $post_id);
  399. if ($current_user_id == $post_user_id OR current_user_can('delete_posts')) {
  400. $dir = self::get_image_upload_folder() . $post_user_id . '/' . $post_id;
  401. if (file_exists($dir)) {
  402. TMM_Helper::delete_dir($dir);
  403. }
  404. wp_delete_post($post_id);
  405. } else {
  406. $response = array();
  407. $response['error'] = __('Error!', 'cardealer');
  408. echo json_encode($response);
  409. }
  410.  
  411. exit;
  412. }
  413.  
  414. /**
  415.   * Get featured cars
  416.   * @param $count
  417.   * @param string $orderby (rand, post_date)
  418.   *
  419.   * @return array
  420.   */
  421. public static function get_featured_cars($count, $orderby = 'rand') {
  422. $meta_query_array = array();
  423. $meta_query_array[] = array(
  424. 'key' => 'car_is_featured',
  425. 'value' => 1,
  426. 'type' => 'numeric',
  427. 'compare' => '='
  428. );
  429.  
  430. if(!defined('ICL_LANGUAGE_CODE')){
  431. $meta_query_array[] = array(
  432. 'key' => '_icl_lang_duplicate_of',
  433. 'value' => '',
  434. 'compare' => 'NOT EXISTS'
  435. );
  436. }
  437.  
  438. $args = array(
  439. 'post_type' => self::$slug,
  440. 'meta_query' => $meta_query_array,
  441. 'post_status' => array('publish'),
  442. 'posts_per_page' => $count,
  443. 'orderby' => $orderby,
  444. 'order' => 'DESC'
  445. );
  446.  
  447. $results = array();
  448. $query = new WP_Query($args);
  449.  
  450. if (!empty($query->posts)) {
  451. foreach ($query->posts as $key => $value) {
  452. $results[$value->ID] = array(
  453. 'ID' => $value->ID,
  454. 'post_title' => $value->post_title,
  455. 'post_excerpt' => $value->post_excerpt,
  456. 'data' => self::get_car_data($value->ID)
  457. );
  458. }
  459. }
  460.  
  461. wp_reset_postdata();
  462.  
  463. return $results;
  464. }
  465.  
  466. /**
  467.   * Set post as featured (ajax)
  468.   *
  469.   * @param int $post_id
  470.   * @param int $value
  471.   * @return int
  472.   */
  473. public static function set_as_featured($post_id = 0, $value = 1) {
  474. $by_ajax = false;
  475.  
  476. if (!empty($_POST['post_id']) && isset($_POST['value'])) {
  477. $post_id = (int) $_POST['post_id'];
  478. $value = (int) $_POST['value'];
  479. $by_ajax = true;
  480. }
  481.  
  482. if ($post_id) {
  483. global $wpdb;
  484. $modified_date = date('Y-m-d', time());
  485.  
  486. update_post_meta($post_id, 'car_is_featured', $value);
  487.  
  488. $wpdb->update(
  489. $wpdb->posts,
  490. array(
  491. 'post_modified' => $modified_date,
  492. 'post_modified_gmt' => $modified_date
  493. ),
  494. array(
  495. 'ID' => $post_id,
  496. 'post_type' => self::$slug
  497. ),
  498. null,
  499. array( '%d', '%s' )
  500. );
  501. }
  502.  
  503. if ($by_ajax) {
  504. ob_clean();
  505. wp_die($value);
  506. } else {
  507. return $value;
  508. }
  509.  
  510. }
  511.  
  512. //ajax
  513. public static function sold_car() {
  514. $post_id = (int) $_REQUEST['post_id'];
  515. $current_user_id = get_current_user_id();
  516. $post_user_id = get_post_field('post_author', $post_id);
  517. if ($current_user_id == $post_user_id OR current_user_can('delete_posts')) {
  518. $is_car_sold = (int) $_REQUEST['car_is_sold'];
  519. update_post_meta($post_id, 'car_is_sold', $is_car_sold);
  520. if($is_car_sold === 1){
  521. self::set_as_featured($post_id, 0);
  522. }
  523. } else {
  524. $response = array();
  525. $response['error'] = __('Error!', 'cardealer');
  526. echo json_encode($response);
  527. }
  528.  
  529. exit;
  530. }
  531.  
  532. //ajax
  533. public static function draft_car() {
  534.  
  535. $post_id = (int) $_REQUEST['post_id'];
  536. $current_user_id = get_current_user_id();
  537. $post_user_id = get_post_field('post_author', $post_id);
  538. $post_status = 'draft';
  539. if ($_REQUEST['car_is_draft'] == 0) {
  540. $post_status = 'publish';
  541. }
  542.  
  543. if ($current_user_id == $post_user_id OR current_user_can('delete_posts')) {
  544. global $wpdb;
  545. //*** check is user can publish car (how cars can be public in current packet)
  546. if ($post_status == 'publish' AND !current_user_can('delete_posts')) {
  547. $options = TMM_Cardealer_User::get_default_user_role_options($current_user_id);
  548. $count = TMM_Cardealer_User::count_users_cars($post_user_id);
  549. if ($count >= $options['max_cars']) {
  550. $response = array();
  551. $response['error'] = sprintf(__('You can not publish more than %d cars', 'cardealer'), $options['max_cars']);
  552. wp_die(json_encode($response));
  553. }
  554. }
  555.  
  556. $modified_date = date('Y-m-d', time());
  557. $wpdb->update(
  558. $wpdb->posts,
  559. array(
  560. 'post_status' => $post_status,
  561. 'post_modified' => $modified_date,
  562. 'post_modified_gmt' => $modified_date
  563. ),
  564. array(
  565. 'ID' => $post_id,
  566. 'post_type' => self::$slug
  567. ),
  568. null,
  569. array( '%d', '%s' )
  570. );
  571.  
  572. } else {
  573. $response = array();
  574. $response['error'] = __('Error!', 'cardealer');
  575. echo json_encode($response);
  576. }
  577.  
  578. exit;
  579. }
  580.  
  581. public static function admin_posts_filter($query) {
  582. global $pagenow;
  583. if (is_admin() && $pagenow == 'edit.php') {
  584.  
  585. if(isset($_GET['car_ids'])) {
  586. $_GET['car_ids'] = trim($_GET['car_ids']);
  587.  
  588. if (!empty($_GET['car_ids'])) {
  589. $query->query_vars['post__in'] = explode(',', $_GET['car_ids']);
  590. }
  591. }
  592.  
  593. if(isset($_GET['author_ids'])) {
  594. $author_ids = explode(',' , $_GET['author_ids']);
  595. $author_ids = array_map('intval', $author_ids);
  596.  
  597. if (!empty($_GET['author_ids'])) {
  598. $query->query_vars['author'] = implode(',' , $author_ids);
  599. }
  600. }
  601.  
  602. }
  603. }
  604.  
  605. public static function filter_restrict_manage_posts() {
  606. if (isset($_GET['post_type'])) {
  607. if ($_GET['post_type'] == TMM_Ext_PostType_Car::$slug) {
  608. echo '<input placeholder="' . __('Cars id\'s', 'cardealer') . '" type = "text" name = "car_ids" value = "' . (isset($_GET['car_ids']) ? $_GET['car_ids'] : '') . '" />';
  609. echo '<input placeholder="' . __('Users id\'s', 'cardealer') . '" type = "text" name = "author_ids" value = "' . (isset($_GET['author_ids']) ? $_GET['author_ids'] : '') . '" />';
  610. }
  611. }
  612. }
  613.  
  614. public static function admin_head() {
  615. ?>
  616. <script type="text/javascript">
  617. var lang_thememakers_cardealer_featured_car_set = "<?php _e("You have marked this car as featured", 'cardealer') ?>";
  618. var lang_thememakers_cardealer_featured_car_unset = "<?php _e("You have unmarked this car as featured", 'cardealer') ?>";
  619. var lang_tmm_cardealer_draft_car_set = "<?php _e("You have marked this car as draft", 'cardealer') ?>";
  620. var lang_tmm_cardealer_sold_car_set = "<?php _e("You have marked this car as sold", 'cardealer') ?>";
  621. var lang_tmm_cardealer_draft_car_unset = "<?php _e("You have unmarked this car as draft", 'cardealer') ?>";
  622. var lang_tmm_cardealer_sold_car_unset = "<?php _e("You have unmarked this car as sold", 'cardealer') ?>";
  623. var lang_tmm_enter_data_right = "<?php _e("Please enter the correct data accordingly!", 'cardealer') ?>";
  624. var lang_have_data_saved = "<?php _e("Pleae make sure you saved the data!", 'cardealer') ?>";
  625. var lang_sure2 = "<?php _e("You do not need this. Right?", 'cardealer') ?>";
  626. </script>
  627. <?php
  628. }
  629.  
  630. public static function get_location_string($ids) {
  631. $res = "";
  632. if (!empty($ids)) {
  633. if (is_array($ids)) {
  634. foreach ($ids as $key => $id) {
  635. if(!empty($id)){
  636. $name = self::get_location_name($id);
  637. if($name == ''){
  638. break;
  639. }
  640. if ($key > 0) {
  641. $res .= ' / ';
  642. }
  643. $res .= __($name, 'cardealer');
  644. }
  645. }
  646. }
  647. }
  648. return $res;
  649. }
  650.  
  651. public static function get_location_name($id) {
  652. global $wpdb;
  653. return $wpdb->get_var("SELECT name FROM tmm_cars_locations WHERE id=" . (int) $id);
  654. }
  655.  
  656. public static function get_locations($parent_id = 0) {
  657. global $wpdb;
  658. $res = $wpdb->get_results("SELECT * FROM tmm_cars_locations WHERE parent_id=" . (int) $parent_id . " ORDER BY `name`");
  659. return $res;
  660. }
  661.  
  662. //work with tmm_cars_locations END
  663.  
  664. public static function get_car_data($post_id, $term_divider = '/') {
  665. $data = array();
  666. $meta = get_post_meta($post_id);
  667.  
  668. $data['car_is_featured'] = isset($meta["car_is_featured"][0]) ? $meta["car_is_featured"][0] : '';
  669. $data['car_carlocation'] = isset($meta["car_carlocation"][0]) ? $meta["car_carlocation"][0] : '';
  670. if (!empty($data['car_carlocation'])) {
  671. if (is_serialized($data['car_carlocation'])) {
  672. $data['car_carlocation'] = @unserialize($data['car_carlocation']);
  673. }
  674. }
  675.  
  676. if(isset($meta["used_car"]) && is_array($meta["used_car"])){
  677. $data['car_is_used'] = $meta["used_car"][0];
  678. }else{
  679. $data['car_is_used'] = '';
  680. }
  681.  
  682. $data['car_is_new'] = isset($meta["car_is_new"][0]) ? $meta["car_is_new"][0] : '';
  683.  
  684. if(isset($meta["car_is_damaged"]) && is_array($meta["car_is_damaged"])){
  685. $data['car_is_damaged'] = $meta["car_is_damaged"][0];
  686. }else{
  687. $data['car_is_damaged'] = '';
  688. }
  689.  
  690. $data['car_vin'] = isset($meta["car_vin"][0]) ? $meta["car_vin"][0] : '';
  691. $data['car_price'] = isset($meta["car_price"][0]) ? $meta["car_price"][0] : '';
  692. $data['car_year'] = isset($meta["car_year"][0]) ? $meta["car_year"][0] : '';
  693. $data['car_mileage'] = !empty($meta["car_mileage"]) ? $meta["car_mileage"][0] : 0;
  694. $data['car_body'] = isset($meta["car_body"][0]) ? $meta["car_body"][0] : '';
  695. $data['car_doors_count'] = isset($meta["car_doors_count"][0]) ? $meta["car_doors_count"][0] : '';
  696. $data['car_transmission'] = isset($meta["car_transmission"][0]) ? $meta["car_transmission"][0] : '';
  697. $data['car_fuel_type'] = isset($meta["car_fuel_type"][0]) ? $meta["car_fuel_type"][0] : '';
  698. $data['car_interior_color'] = isset($meta["car_interior_color"][0]) ? $meta["car_interrior_color"][0] : '';
  699. $data['car_exterior_color'] = isset($meta["car_exterior_color"][0]) ? $meta["car_exterior_color"][0] : '';
  700. $data['car_engine_size'] = isset($meta["car_engine_size"][0]) ? $meta["car_engine_size"][0] : '';
  701. $data['car_engine_additional'] = isset($meta["car_engine_additional"][0]) ? $meta["car_engine_additional"][0] : '';
  702. $data['car_owner_number'] = isset($meta["car_owner_number"][0]) ? $meta["car_owner_number"][0] : '';
  703.  
  704. if(isset($meta["car_cover_image"]) && is_array($meta["car_cover_image"])){
  705. $data['car_cover_image'] = $meta["car_cover_image"][0];
  706. }else{
  707. $data['car_cover_image'] = '';
  708. }
  709.  
  710. if(isset($meta["car_is_sold"]) && is_array($meta["car_is_sold"])){
  711. $data['car_is_sold'] = $meta["car_is_sold"][0];
  712. }else{
  713. $data['car_is_sold'] = '';
  714. }
  715.  
  716. if (isset($meta["cars_videos"]) && is_array($meta["cars_videos"])) {
  717. $data['cars_videos'] = @unserialize($meta["cars_videos"][0]);
  718. }else{
  719. $data['cars_videos'] = '';
  720. }
  721.  
  722. if(isset($meta["advanced"]) && is_array($meta["advanced"])){
  723. $data['advanced'] = @unserialize($meta["advanced"][0]);
  724. }else{
  725. $data['advanced'] = '';
  726. }
  727.  
  728. $term_list_object = new GetTheTermList();
  729.  
  730. if(defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != ''){
  731. global $sitepress;
  732. $default_lang_post_id = icl_object_id( $post_id, self::$slug, true, $sitepress->get_default_language() );
  733. }else{
  734. $default_lang_post_id = $post_id;
  735. }
  736.  
  737. $car_producer = $term_list_object->get_the_term_list($default_lang_post_id, 'carproducer', $term_divider);
  738.  
  739. if(defined('ICL_LANGUAGE_CODE')){
  740. $data['car_producer'] = str_replace('@'.ICL_LANGUAGE_CODE, '', $car_producer['string_name']);
  741. }else{
  742. $data['car_producer'] = $car_producer['string_name'];
  743. }
  744.  
  745. $data['car_producer_data'] = $car_producer['data'];
  746.  
  747. $data_group_indexes = array_keys(self::$specifications_array);
  748. if (!empty($data_group_indexes)) {
  749. foreach ($data_group_indexes as $value) {
  750. if(isset($meta[$value]) && is_array($meta[$value]) && isset($meta[$value][0])){
  751. $data[$value] = @unserialize($meta[$value][0]);
  752. }
  753. }
  754. }
  755.  
  756. return $data;
  757. }
  758.  
  759. public static function init_meta_boxes() {
  760. add_meta_box("car_photos", __("Car photos", 'cardealer'), array(__CLASS__, 'car_photos'), self::$slug, "normal", "low");
  761. add_meta_box("car_attributes", __("Car attributes", 'cardealer'), array(__CLASS__, 'car_attributes'), self::$slug, "normal", "low");
  762. }
  763.  
  764. /*
  765.   * Folder where cars images live
  766.   */
  767.  
  768. public static function get_image_upload_folder() {
  769. $path = TMM_Helper::get_upload_folder();
  770.  
  771. $path = $path . 'cardealer/';
  772. if (!file_exists($path)) {
  773. @mkdir($path, 0775);
  774. }
  775.  
  776. return $path;
  777. }
  778.  
  779. public static function get_image_upload_folder_uri() {
  780. $link = TMM_Helper::get_upload_folder_uri();
  781. return $link . 'cardealer/';
  782. }
  783.  
  784. public static function car_attributes() {
  785. global $post;
  786. $data = self::get_car_data($post->ID);
  787. echo TMM::draw_free_page(TMM_Ext_Car_Dealer::get_application_path() . '/views/admin/car_attributes.php', $data);
  788. }
  789.  
  790. public static function show_edit_columns_content($column) {
  791. global $post;
  792.  
  793. switch ($column) {
  794. case "image":
  795. $image_url = tmm_get_car_cover_image($post->ID, 'thumb');
  796. if (!empty($image_url)) {
  797. echo '<img width="178" src = "' . $image_url . '" alt = "" style="max-width:100%" />';
  798. }
  799. break;
  800. case "car_price":
  801. echo '<font color = "red">' . esc_html( tmm_get_car_price($post->ID) ) . '</font>';
  802. break;
  803. case "car_year":
  804. echo get_post_meta($post->ID, 'car_year', true);
  805. break;
  806. case "car_mileage":
  807. echo "<i>" . get_post_meta($post->ID, 'car_mileage', true) . " " . tmm_get_car_mileage_unit() . "</i>";
  808. break;
  809. case "car_engine_size":
  810. echo "<b>" . get_post_meta($post->ID, 'car_engine_size', true) . "</b> " . tmm_get_car_engine_unit();
  811. break;
  812. case "car_is_featured":
  813. $is_featured = (int) get_post_meta($post->ID, 'car_is_featured', true);
  814. echo '<input type = "checkbox" class = "js_car_is_featured" value = "' . $post->ID . '" ' . ($is_featured ? 'checked' : '') . ' />';
  815. break;
  816. case "car_is_sold":
  817. $is_sold = (int) get_post_meta($post->ID, 'car_is_sold', true);
  818. echo '<input type = "checkbox" class = "js_car_is_sold" value = "' . $post->ID . '" ' . ($is_sold ? 'checked' : '') . ' />';
  819. break;
  820. case "car_is_draft":
  821. $is_draft = get_post_field('post_status', $post);
  822. $unapproved = get_post_meta($post->ID, 'unapproved', 1);
  823. $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-car_$post->ID" ) );
  824.  
  825. $approve_url = admin_url("edit.php?post={$post->ID}&approved=true&$approve_nonce");
  826. $unapprove_url = admin_url("edit.php?post={$post->ID}&approved=false&$approve_nonce");
  827.  
  828. echo '<input type = "checkbox" class = "js_car_is_draft" value = "' . $post->ID . '" ' . ($is_draft != 'publish' ? 'checked' : '') . ' />';
  829. echo '<div class="' . ($unapproved ? 'unapproved' : 'approved') . '"><br>
  830. <span class="approve">
  831. <a href="'.$approve_url.'" style="color:#006505">'. __('Approve', 'cardealer') .'</a>
  832. </span>
  833. <span class="unapprove">
  834. <a href="'.$unapprove_url.'" style="color:#d98500">'. __('Unapprove', 'cardealer') .'</a>
  835. </span>
  836. </div>';
  837. break;
  838. case "user":
  839. $user_info = get_userdata($post->post_author);
  840. echo ($user_info ? $user_info->display_name : '') . " (#{$post->post_author})";
  841. break;
  842. }
  843. }
  844.  
  845. public static function show_edit_columns($columns) {
  846. $columns = array(
  847. "cb" => '<input type="checkbox" />',
  848. "title" => __("Title", 'cardealer'),
  849. "image" => __("Main Photo", 'cardealer'),
  850. "car_price" => __("Price", 'cardealer'),
  851. "car_year" => __("Year", 'cardealer'),
  852. "car_mileage" => __("Mileage", 'cardealer'),
  853. "car_engine_size" => __("Engine Size", 'cardealer'),
  854. "car_is_featured" => __("Featured", 'cardealer'),
  855. "car_is_sold" => __("Sold", 'cardealer'),
  856. "car_is_draft" => __("Draft", 'cardealer'),
  857. "user" => __("User", 'cardealer'),
  858. "date" => __("Date", 'cardealer'),
  859. );
  860.  
  861. return $columns;
  862. }
  863.  
  864. public static function show_edit_sortable_columns($columns) {
  865.  
  866. $columns["car_price"] = "car_price";
  867. $columns["car_year"] = "car_year";
  868. $columns["car_mileage"] = "car_mileage";
  869. $columns["car_engine_size"] = "car_engine_size";
  870. $columns["car_is_featured"] = "car_is_featured";
  871. $columns["car_is_sold"] = "car_is_sold";
  872. $columns["car_is_draft"] = "car_is_draft";
  873. $columns["user"] = "post_author";
  874.  
  875. return $columns;
  876. }
  877.  
  878. public static function show_edit_sortable_columns_act() {
  879. add_filter('request', array(__CLASS__, 'sequence_col_sort_logic'));
  880.  
  881. if (!empty($_GET['approved']) && !empty($_GET['post'])) {
  882. $post_id = (int) $_GET['post'];
  883. $approved = $_GET['approved'] === 'true' ? 1 : 0;
  884.  
  885. if (get_post_type($post_id) === 'car') {
  886.  
  887. if (check_admin_referer( 'approve-car_' . $post_id )) {
  888. update_post_meta($post_id, 'unapproved', ($approved ? 0 : 1));
  889.  
  890. $args = array(
  891. 'ID' => $post_id,
  892. 'post_status' => $approved ? 'publish' : 'draft',
  893. );
  894.  
  895. wp_update_post( $args );
  896. }
  897.  
  898. wp_redirect( wp_get_referer() );
  899. die;
  900. }
  901.  
  902. }
  903. }
  904.  
  905. public static function sequence_col_sort_logic($vars) {
  906. $columns = array();
  907. $columns["car_price"] = "car_price";
  908. $columns["car_year"] = "car_year";
  909. $columns["car_mileage"] = "car_mileage";
  910. $columns["car_engine_size"] = "car_engine_size";
  911. $columns["car_is_featured"] = "car_is_featured";
  912. $columns["car_is_sold"] = "car_is_sold";
  913. $columns["car_is_draft"] = "car_is_draft";
  914.  
  915. if (isset($vars['post_type']) && self::$slug == $vars['post_type']) {
  916. if (isset($vars['orderby']) && in_array($vars['orderby'], $columns)) {
  917. $vars = array_merge($vars, array('meta_key' => $vars['orderby'], 'orderby' => 'meta_value_num'));
  918. }
  919. }
  920.  
  921. return $vars;
  922. }
  923.  
  924. //ajax
  925. /**
  926.   * Deprecated: only for compatibility
  927.   * todo: remove
  928.   */
  929. public static function set_car_cover_image($post_id = false, $image_name = false) {
  930. if($post_id == false){
  931. $post_id = $_REQUEST['post_id'];
  932. }
  933.  
  934. if($image_name == false){
  935. $image_name = $_REQUEST['image_name'];
  936. }
  937.  
  938. if($post_id && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != ''){
  939. global $sitepress;
  940. $post_id = icl_object_id( $post_id, self::$slug, true, $sitepress->get_default_language() );
  941. }
  942. update_post_meta($post_id, "car_cover_image", $image_name);
  943.  
  944. if($post_id === false){
  945. exit;
  946. }
  947. }
  948.  
  949. /**
  950.   * Deprecated: only for compatibility
  951.   * todo: remove
  952.   * @param $post_id
  953.   * @param string $folder
  954.   * @param bool $sidebar
  955.   *
  956.   * @return string
  957.   */
  958. public static function get_car_cover_image($post_id, $folder = 'main', $sidebar = true) {
  959. return TMM_Car_Image::get_cover_image($post_id, $folder, $sidebar);
  960. }
  961.  
  962. //for meta box in admin panel
  963. public static function car_photos() {
  964. global $post;
  965. $post_id = $post->ID;
  966. if($post_id && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != ''){
  967. global $sitepress;
  968. $post_id = icl_object_id( $post_id, self::$slug, true, $sitepress->get_default_language() );
  969. }
  970. $data = array();
  971. $data['post_id'] = $post_id;
  972. $data['photo_set_hash'] = $post_id;
  973. $data['car_cover_image'] = get_post_meta($post_id, 'car_cover_image', true);
  974. echo TMM::draw_free_page(TMM_Ext_Car_Dealer::get_application_path() . '/views/admin/car_photos.php', $data);
  975. }
  976.  
  977. public static function delete_post_photo($user_id, $post_id, $image_name, $is_new_car = false) {
  978. $folders = array_keys(self::$image_sizes);
  979. foreach ($folders as $folder) {
  980. if (!$is_new_car) {
  981. $file = self::get_image_upload_folder() . $user_id . '/' . $post_id . '/' . $folder . '/' . $image_name;
  982. @unlink( apply_filters( 'wp_delete_file', $file ) );
  983. } else {
  984. $file = self::get_image_upload_folder() . $user_id . '/tmp/' . $post_id . '/' . $folder . '/' . $image_name;
  985. @unlink( apply_filters( 'wp_delete_file', $file ) );
  986. }
  987. }
  988. }
  989.  
  990. public static function get_post_photos($post_id, $user_ID, $folder = 'main', $is_new_car = false) {
  991. if(!$is_new_car && $post_id && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != ''){
  992. global $sitepress;
  993. $post_id = icl_object_id( $post_id, self::$slug, true, $sitepress->get_default_language() );
  994. }
  995. $targetFolder = self::get_image_upload_folder() . $user_ID;
  996. if (!file_exists($targetFolder)) {
  997. @mkdir($targetFolder, 0755);
  998. }
  999.  
  1000. if (!$is_new_car) {
  1001. $targetFolder = self::get_image_upload_folder() . $user_ID . '/' . $post_id;
  1002. } else {
  1003. $targetFolder = self::get_image_upload_folder() . $user_ID . '/tmp/' . $post_id;
  1004. }
  1005.  
  1006. if (!file_exists($targetFolder)) {
  1007. @mkdir($targetFolder, 0755);
  1008. $folders = array_keys(self::$image_sizes);
  1009. foreach ($folders as $folder) {
  1010. @mkdir($targetFolder . '/' . $folder . '/', 0755);
  1011. }
  1012. }
  1013. return self::get_user_photo_set($user_ID, $post_id, $folder, $is_new_car);
  1014. }
  1015.  
  1016. //return array of images links of the user of the post_id
  1017. public static function get_user_photo_set($user_ID, $post_id, $folder = 'main', $is_new_car = false) {
  1018. if (!$is_new_car) {
  1019. $targetFolder = self::get_image_upload_folder() . $user_ID . '/' . $post_id . '/' . $folder . '/';
  1020. } else {
  1021. $targetFolder = self::get_image_upload_folder() . $user_ID . '/tmp/' . $post_id . '/' . $folder . '/';
  1022. }
  1023.  
  1024. if (!file_exists($targetFolder)) {
  1025. return array();
  1026. }
  1027.  
  1028. $images = array();
  1029. $files = glob($targetFolder.'*.*');
  1030.  
  1031. if (is_array($files)) {
  1032. foreach ($files as $file) {
  1033. $file = basename($file);
  1034. if ($file != '.' && $file != '..') {
  1035. if (!$is_new_car) {
  1036. $images[] = self::get_image_upload_folder_uri() . $user_ID . '/' . $post_id . '/' . $folder . '/' . $file;
  1037. } else {
  1038. $images[] = self::get_image_upload_folder_uri() . $user_ID . '/tmp/' . $post_id . '/' . $folder . '/' . $file;
  1039. }
  1040. }
  1041. }
  1042. }
  1043.  
  1044. return $images;
  1045. }
  1046.  
  1047. //ajax
  1048. public static function draw_quicksearch_locations($is_ajax = true, $selected_region = 0) {//params is for quicksearch.php only
  1049. global $wpdb;
  1050. $parent_id = isset($_REQUEST['parent_id']) ? (int) $_REQUEST['parent_id'] : 0;
  1051. $level = isset($_REQUEST['level']) ? (int) $_REQUEST['level'] : 0;
  1052. $locations = TMM_Ext_PostType_Car::get_locations($parent_id);
  1053.  
  1054. if (isset($_REQUEST['selected_region'])) {
  1055. $selected_region = (int) $_REQUEST['selected_region'];
  1056. }
  1057.  
  1058. ob_clean();
  1059.  
  1060. if (!empty($locations)) {
  1061. if (is_array($locations)) {
  1062. foreach ($locations as $key => $option) {
  1063. $meta_key = 'car_carlocation_' . ($level + 1);
  1064. $meta_value = $option->id;
  1065. $sql = "SELECT count(DISTINCT pm.post_id)
  1066. FROM $wpdb->postmeta pm
  1067. JOIN $wpdb->posts p ON (p.ID = pm.post_id)
  1068. WHERE pm.meta_key = '$meta_key'
  1069. AND pm.meta_value = '$meta_value'
  1070. AND p.post_type = '" . self::$slug . "'
  1071. AND p.post_status = 'publish'
  1072. ";
  1073. $count = $wpdb->get_var($sql);
  1074.  
  1075. if (!TMM::get_option('locations_show_empty_search_widget', TMM_APP_CARDEALER_PREFIX)) {
  1076. if ($count != 0) {
  1077. echo '<option value="' . $option->id . '" ' . ($selected_region == $option->id ? 'selected' : '') . '>' . __($option->name, 'cardealer') . ' (' . $count . ')</option>';
  1078. }
  1079. }else{
  1080. echo '<option value="' . $option->id . '" ' . ($selected_region == $option->id ? 'selected' : '') . '>' . __($option->name, 'cardealer') . ' (' . $count . ')</option>';
  1081. }
  1082. }
  1083. }
  1084. }
  1085.  
  1086. if (isset($_REQUEST['action'])) {
  1087. exit;
  1088. }
  1089. }
  1090.  
  1091. public static function draw_quicksearch_models($is_ajax = true) {
  1092. global $wpdb;
  1093.  
  1094. $location_id = isset($_REQUEST['location_id']) ? (int) $_REQUEST['location_id'] : 0;
  1095. $producer_id = (int) $_REQUEST['producer_id'];
  1096. $level = (int) $_REQUEST['level'];
  1097. $selected_region_id = isset($_REQUEST['selected_region_id']) ? (int) $_REQUEST['selected_region_id'] : 0;
  1098. $selected_model_id = isset($_REQUEST['selected_model']) ? (int) $_REQUEST['selected_model'] : $producer_id;
  1099.  
  1100. $meta_query_str_join = "";
  1101. $meta_query_str_where = "";
  1102.  
  1103. if ($location_id > 0) {
  1104.  
  1105. $meta_query_str_join = " INNER JOIN {$wpdb->postmeta} postmeta ON posts.ID = postmeta.post_id";
  1106. $meta_query_str_where = " AND postmeta.meta_key = 'car_carlocation_1' AND postmeta.meta_value = {$location_id} ";
  1107.  
  1108. if ($selected_region_id > 0) {
  1109.  
  1110. $meta_query_str_where = " AND postmeta.meta_key = 'car_carlocation_{$level}' AND postmeta.meta_value = {$selected_region_id} ";
  1111.  
  1112. }
  1113.  
  1114. }
  1115.  
  1116. $q = $wpdb->prepare("
  1117. SELECT posts.ID, term_relationships.term_taxonomy_id FROM {$wpdb->posts} posts
  1118. INNER JOIN {$wpdb->term_relationships} term_relationships
  1119. ON posts.ID = term_relationships.object_id
  1120. INNER JOIN {$wpdb->term_taxonomy} taxonomy
  1121. ON taxonomy.term_taxonomy_id = term_relationships.term_taxonomy_id
  1122. " . $meta_query_str_join . "
  1123. WHERE 1=1
  1124. AND posts.post_type = '%s'
  1125. AND posts.post_status = 'publish'
  1126. AND taxonomy.parent != 0
  1127. " . $meta_query_str_where . "
  1128. ORDER BY posts.post_date DESC
  1129. ", self::$slug);
  1130.  
  1131. $posts = $wpdb->get_results($q, OBJECT_K);
  1132. $term_taxonomy_posts = array();
  1133.  
  1134. foreach ($posts as $ar) {
  1135. $term_taxonomy_posts[$ar->term_taxonomy_id][] = $ar->ID;
  1136. }
  1137.  
  1138. $args = array(
  1139. 'orderby' => 'name',
  1140. 'order' => 'ASC',
  1141. 'hierarchical' => 1,
  1142. 'show_count' => 1,
  1143. 'parent' => $producer_id,
  1144. 'hide_empty' => false
  1145. );
  1146.  
  1147. $terms = get_terms('carproducer', $args);
  1148.  
  1149. foreach ($terms as &$term) {
  1150. $term_count = 0;
  1151.  
  1152. if (isset( $term_taxonomy_posts[$term->term_taxonomy_id] )) {
  1153. $term_count = count($term_taxonomy_posts[$term->term_taxonomy_id]);
  1154. }
  1155.  
  1156. $term->count = $term_count;
  1157. }
  1158.  
  1159. ob_clean();
  1160.  
  1161. echo self::draw_terms_dropdown(array(0 => $terms), 0, $selected_model_id, 0);
  1162.  
  1163. if (isset($_REQUEST['action'])) {
  1164. exit;
  1165. }
  1166. }
  1167.  
  1168. public static function draw_quicksearch_producers($is_ajax = true, $selected_producer_id = 0) {
  1169. global $wpdb;
  1170.  
  1171. $location_id = isset($_REQUEST['location_id']) ? (int) $_REQUEST['location_id'] : 0;
  1172. $level = (int) $_REQUEST['level'];
  1173. $selected_region_id = (int) $_REQUEST['selected_region_id'];
  1174.  
  1175. if (isset($_REQUEST['selected_producer_id'])) {
  1176. $selected_producer_id = (int) $_REQUEST['selected_producer_id'];
  1177. }
  1178.  
  1179. $meta_query_str_join = "";
  1180. $meta_query_str_where = "";
  1181.  
  1182. if ($location_id > 0) {
  1183.  
  1184. $meta_query_str_join = " INNER JOIN {$wpdb->postmeta} postmeta ON posts.ID = postmeta.post_id";
  1185. $meta_query_str_where = " AND postmeta.meta_key = 'car_carlocation_1' AND postmeta.meta_value = {$location_id} ";
  1186.  
  1187. if ($selected_region_id > 0) {
  1188.  
  1189. $meta_query_str_where = " AND postmeta.meta_key = 'car_carlocation_{$level}' AND postmeta.meta_value = {$selected_region_id} ";
  1190.  
  1191. }
  1192.  
  1193. }
  1194.  
  1195. $q = $wpdb->prepare("
  1196. SELECT posts.ID, term_relationships.term_taxonomy_id FROM {$wpdb->posts} posts
  1197. INNER JOIN {$wpdb->term_relationships} term_relationships
  1198. ON posts.ID = term_relationships.object_id
  1199. LEFT JOIN {$wpdb->term_taxonomy} taxonomy
  1200. ON term_relationships.term_taxonomy_id = taxonomy.term_taxonomy_id
  1201. " . $meta_query_str_join . "
  1202. WHERE 1=1
  1203. AND posts.post_type = '%s'
  1204. AND posts.post_status = 'publish'
  1205. AND taxonomy.parent = 0
  1206. " . $meta_query_str_where . "
  1207. ORDER BY posts.post_date DESC
  1208. ", self::$slug);
  1209.  
  1210. $posts = $wpdb->get_results($q, OBJECT_K);
  1211. $term_taxonomy_posts = array();
  1212.  
  1213. foreach ($posts as $ar) {
  1214. $term_taxonomy_posts[$ar->term_taxonomy_id][] = $ar->ID;
  1215. }
  1216.  
  1217. $args = array(
  1218. 'orderby' => 'name',
  1219. 'order' => 'ASC',
  1220. 'hierarchical' => 1,
  1221. 'show_count' => 1,
  1222. 'parent' => 0,
  1223. 'hide_empty' => false
  1224. );
  1225.  
  1226. $terms = get_terms('carproducer', $args);
  1227.  
  1228. foreach ($terms as &$term) {
  1229. $term_count = 0;
  1230.  
  1231. if (isset( $term_taxonomy_posts[$term->term_taxonomy_id] )) {
  1232. $term_count = count($term_taxonomy_posts[$term->term_taxonomy_id]);
  1233. }
  1234.  
  1235. $term->count = $term_count;
  1236. }
  1237.  
  1238. ob_clean();
  1239. echo self::draw_terms_dropdown(array(0 => $terms), 0, $selected_producer_id, 0);
  1240.  
  1241. if (isset($_REQUEST['action'])) {
  1242. exit;
  1243. }
  1244. }
  1245.  
  1246. public static function draw_terms_dropdown($terms, $parent_id, $selected_model_id, $level) {//$level is for function itself, when recursion doing
  1247. $margin = "";
  1248. if ($level > 0) {
  1249. for ($i = 0; $i < $level; $i++) {
  1250. $margin.="&nbsp;&nbsp;&nbsp;";
  1251. }
  1252. }
  1253.  
  1254. //*****
  1255. $output = "";
  1256. if (!empty($terms[$parent_id])) {
  1257. if (!TMM::get_option('producers_show_empty_search_widget', TMM_APP_CARDEALER_PREFIX)) {
  1258. foreach ($terms[$parent_id] as $term) {
  1259. if ($term->count != 0) {
  1260. $output.="<option " . ($term->count == 0 ? 'disabled' : '') . " " . ($selected_model_id == $term->term_id ? "selected" : "") . " value='" . $term->term_id . "'>" . $margin . $term->name . "&nbsp;&nbsp;(" . $term->count . ")</option>";
  1261. $output.=self::draw_terms_dropdown($terms, $term->term_id, $selected_model_id, $level + 1);
  1262. }
  1263. }
  1264. } else {
  1265.  
  1266. foreach ($terms[$parent_id] as $term) {
  1267. $output.="<option " . ($term->count == 0 ? 'disabled' : '') . " " . ($selected_model_id == $term->term_id ? "selected" : "") . " value='" . $term->term_id . "'>" . $margin . $term->name . "&nbsp;&nbsp;(" . $term->count . ")</option>";
  1268. $output.=self::draw_terms_dropdown($terms, $term->term_id, $selected_model_id, $level + 1);
  1269. }
  1270. }
  1271. }
  1272. return $output;
  1273. }
  1274.  
  1275. public static function process_advanced_search_params() {
  1276. $data = array();
  1277. parse_str($_REQUEST['advanced_search_params'], $data);
  1278.  
  1279. if (isset($data['advanced']) && !empty($data['advanced'])) {
  1280. foreach ($data as $key => $value) {
  1281. if (is_array($value)) {
  1282. foreach ($value as $key2 => $v) {
  1283. if ($v <= 0) {
  1284. unset($data[$key][$key2]);
  1285. }
  1286. }
  1287. } else {
  1288.  
  1289. //if ($value <= 0) {
  1290. unset($data[$key]);
  1291. //}
  1292.  
  1293. continue;
  1294. }
  1295. }
  1296. //*****
  1297. foreach ($data as $key => $value) {
  1298. if (is_array($value)) {
  1299. if (empty($value)) {
  1300. unset($data[$key]);
  1301. }
  1302. }
  1303. }
  1304. }
  1305.  
  1306. $params = base64_encode(serialize($data));
  1307. /* fix bug with base64 ending in query string */
  1308. // $params = str_replace('=', '', $params );
  1309. // $params = str_replace('=', '', $params );
  1310. echo $params;
  1311. exit;
  1312. }
  1313.  
  1314. //draw taxonomies while adding or editing cars on front
  1315. public static function wp_list_categories($args = '') {
  1316. $defaults = array(
  1317. 'show_option_all' => '', 'show_option_none' => __('No categories', 'cardealer'),
  1318. 'orderby' => 'name', 'order' => 'ASC',
  1319. 'style' => 'list',
  1320. 'show_count' => 0, 'hide_empty' => 0,
  1321. 'use_desc_for_title' => 1, 'child_of' => 0,
  1322. 'feed' => '', 'feed_type' => '',
  1323. 'feed_image' => '', 'exclude' => '',
  1324. 'exclude_tree' => '', 'current_category' => 0,
  1325. 'hierarchical' => true, 'title_li' => '',
  1326. 'echo' => 1, 'depth' => 0,
  1327. 'taxonomy' => 'category'
  1328. );
  1329.  
  1330. $r = wp_parse_args($args, $defaults);
  1331.  
  1332. if (!isset($r['pad_counts']) && $r['show_count'] && $r['hierarchical'])
  1333. $r['pad_counts'] = true;
  1334.  
  1335. if (true == $r['hierarchical']) {
  1336. $r['exclude_tree'] = $r['exclude'];
  1337. $r['exclude'] = '';
  1338. }
  1339.  
  1340. if (!isset($r['class']))
  1341. $r['class'] = ( 'category' == $r['taxonomy'] ) ? 'categories' : $r['taxonomy'];
  1342.  
  1343. extract($r);
  1344.  
  1345. if (!taxonomy_exists($taxonomy))
  1346. return false;
  1347.  
  1348. $categories = get_categories($r);
  1349.  
  1350. $output = '';
  1351. if ($title_li && 'list' == $style)
  1352. $output = '<li class = "' . esc_attr($class) . '">' . $title_li . '<ul>';
  1353.  
  1354. if (empty($categories)) {
  1355. if (!empty($show_option_none)) {
  1356. if ('list' == $style)
  1357. $output .= '<li>' . $show_option_none . '</li>';
  1358. else
  1359. $output .= $show_option_none;
  1360. }
  1361. } else {
  1362. if (!empty($show_option_all)) {
  1363. $posts_page = ( 'page' == get_option('show_on_front') && get_option('page_for_posts') ) ? get_permalink(get_option('page_for_posts')) : home_url('/');
  1364. $posts_page = esc_url($posts_page);
  1365. if ('list' == $style)
  1366. $output .= "<li><input type='checkbox' />&nbsp;<a href='$posts_page'>$show_option_all</a></li>";
  1367. else
  1368. $output .= "<a href='$posts_page'>$show_option_all</a>";
  1369. }
  1370.  
  1371. if (empty($r['current_category']) && ( is_category() || is_tax() || is_tag() )) {
  1372. $current_term_object = get_queried_object();
  1373. if ($r['taxonomy'] == $current_term_object->taxonomy)
  1374. $r['current_category'] = get_queried_object_id();
  1375. }
  1376.  
  1377. if ($hierarchical)
  1378. $depth = $r['depth'];
  1379. else
  1380. $depth = -1; // Flat.
  1381.  
  1382. $r['checkbox_name'] = $checkbox_name;
  1383. $output .= self::walk_category_tree($categories, $depth, $r);
  1384. }
  1385.  
  1386. if ($title_li && 'list' == $style)
  1387. $output .= '</ul></li>';
  1388.  
  1389. $output = apply_filters('wp_list_categories', $output, $args);
  1390.  
  1391. if ($echo)
  1392. echo $output;
  1393. else
  1394. return $output;
  1395. }
  1396.  
  1397. private static function walk_category_tree() {
  1398. $args = func_get_args();
  1399. // the user's options are the third parameter
  1400. if (empty($args[2]['walker']) || !is_a($args[2]['walker'], 'Walker'))
  1401. $walker = new TMM_Ext_PostType_Car_Walker_Category;
  1402. else
  1403. $walker = $args[2]['walker'];
  1404.  
  1405. return call_user_func_array(array(&$walker, 'walk'), $args);
  1406. }
  1407.  
  1408. //car specifications fields
  1409. public static function get_attribute_constructors($data_group_index) {
  1410. $block = array();
  1411. $data_groups = TMM_Cardealer_DataConstructor::get_data_groups();
  1412. $data = $data_groups[$data_group_index];
  1413.  
  1414. if (!empty($data['data'])) {
  1415. foreach ($data['data'] as $opt_key => $value) {
  1416. $key = !empty($value['slug']) ? $value['slug'] : $opt_key;
  1417.  
  1418. $block[$key]['name'] = $value['name'];
  1419. $block[$key]['slug'] = !empty($value['slug']) ? $value['slug'] : "";
  1420. $block[$key]['type'] = $value['type'];
  1421. $block[$key]['description'] = $value['description'];
  1422. switch ($block[$key]['type']) {
  1423. case 'textinput':
  1424. $block[$key]['values'] = $value['textinput'];
  1425. break;
  1426. case 'checkbox':
  1427. $block[$key]['values'] = $value['checkbox'];
  1428. break;
  1429. case 'select':
  1430. $select_data = array();
  1431.  
  1432. if (!empty($value['select'])) {
  1433. foreach ($value['select'] as $k => $option) {
  1434. $is_range = false;
  1435. $option_string_array = explode('^', $option);
  1436. //**** range of integers Ex.:(1^40)
  1437. if (count($option_string_array) == 2) {
  1438. if (isset($option_string_array[0]) AND isset($option_string_array[1])) {
  1439. $option_string_array[0] = (int) $option_string_array[0];
  1440. $option_string_array[1] = (int) $option_string_array[1];
  1441. if (is_integer($option_string_array[0]) AND is_integer($option_string_array[1])) {
  1442. if ($option_string_array[1] > $option_string_array[0]) {
  1443. $is_range = true;
  1444. }
  1445. }
  1446. }
  1447. }
  1448.  
  1449. if ($is_range) {
  1450. for ($i = $option_string_array[0]; $i <= $option_string_array[1]; $i++) {
  1451. $select_data[$i] = $i;
  1452. }
  1453. } else {
  1454. $option_key = TMM_Cardealer_DataConstructor::sanitize_string($option);
  1455.  
  1456. if (!$option_key) {
  1457. $option_key = 'opt_' . $k;
  1458. }
  1459.  
  1460. $select_data[$option_key] = $option;
  1461. }
  1462. }
  1463. }
  1464. $block[$key]['values'] = $select_data;
  1465.  
  1466.  
  1467. break;
  1468.  
  1469. default:
  1470. break;
  1471. }
  1472. }
  1473. }
  1474.  
  1475. return $block;
  1476. }
  1477.  
  1478. //for settings page
  1479. public static function explode_option($option) {
  1480. $data = explode(',', TMM::get_option($option, TMM_APP_CARDEALER_PREFIX));
  1481. $result = array();
  1482. if (!empty($data)) {
  1483. foreach ($data as $value) {
  1484. $result[trim(TMM_Cardealer_DataConstructor::sanitize_string($value))] = trim($value);
  1485. }
  1486. }
  1487. return $result;
  1488. }
  1489.  
  1490. public static function slider_image_size($with_sidebar = true, $crop = true) {
  1491. $width = 0;
  1492. $height = 0;
  1493.  
  1494. if (is_front_page() || TMM_Helper::is_front_lang_page()) {
  1495. $with_sidebar = (int) TMM::get_option('show_slider_as', TMM_APP_CARDEALER_PREFIX);
  1496. $crop = (int) TMM::get_option('crop_image', TMM_APP_CARDEALER_PREFIX);
  1497. }
  1498.  
  1499. if (!$with_sidebar) {
  1500. $width = 1130;
  1501. if (is_front_page() || TMM_Helper::is_front_lang_page()) {
  1502. $height = (int) TMM::get_option('slider_without_sidebar_height', TMM_APP_CARDEALER_PREFIX);
  1503. }
  1504. if (!$height) {
  1505. $height = 640;
  1506. }
  1507. } else {
  1508. $width = 740;
  1509. if (is_front_page() || TMM_Helper::is_front_lang_page()) {
  1510. $height = (int) TMM::get_option('slider_with_sidebar_height', TMM_APP_CARDEALER_PREFIX);
  1511. }
  1512. if (!$height) {
  1513. $height = 420;
  1514. }
  1515. }
  1516.  
  1517. $size = array();
  1518. $size['name'] = $width . '*' . $height;
  1519. $size['width'] = $width;
  1520. $size['height'] = $height;
  1521. $size['crop'] = $crop;
  1522.  
  1523. return $size;
  1524. }
  1525.  
  1526. public static function slider_image_sizes($sizes) {
  1527. $slider_size = self::slider_image_size();
  1528. $sizes[$slider_size['name']] = $slider_size;
  1529. return $sizes;
  1530. }
  1531.  
  1532. //ajax - for watermark preview in settings
  1533. public static function get_sample_watermark() {
  1534. $destination = self::get_image_upload_folder() . '/sample.jpg';
  1535. @unlink($destination);
  1536. copy(TMM_Ext_Car_Dealer::get_application_path() . '/images/sample.jpg', $destination);
  1537. $watermark = new TMM_Cardealer_Watermark();
  1538. //***
  1539. $watermark->place_watermark($destination, (int) $_REQUEST['alpha_level'], $_REQUEST['watermark_position'], $_REQUEST['watermark_size_percent']);
  1540. echo self::get_image_upload_folder_uri() . 'sample.jpg?watermark=' . uniqid();
  1541. exit;
  1542. }
  1543.  
  1544. public static function before_delete_post($post_id) {
  1545. $post_type = get_post_field('post_type', $post_id);
  1546. if ($post_type == self::$slug) {
  1547. $post_user_id = get_post_field('post_author', $post_id);
  1548. $dir = self::get_image_upload_folder() . $post_user_id . '/' . $post_id;
  1549. if (file_exists($dir)) {
  1550. TMM_Helper::delete_dir($dir);
  1551. }
  1552. }
  1553. }
  1554.  
  1555. public static function get_compare_list() {
  1556. if (isset($_COOKIE['car_compare_list'])) {
  1557. $car_compare_list = explode(',', $_COOKIE['car_compare_list']);
  1558. if (isset($car_compare_list[0])) {
  1559. if (empty($car_compare_list[0])) {
  1560. $car_compare_list = array();
  1561. }
  1562. }
  1563.  
  1564. return $car_compare_list;
  1565. }
  1566.  
  1567. return array();
  1568. }
  1569.  
  1570. public static function get_watch_list() {
  1571. if (isset($_COOKIE['car_watch_list'])) {
  1572. $car_compare_list = explode(',', $_COOKIE['car_watch_list']);
  1573. if (isset($car_compare_list[0])) {
  1574. if (empty($car_compare_list[0])) {
  1575. $car_compare_list = array();
  1576. }
  1577. }
  1578.  
  1579. return $car_compare_list;
  1580. }
  1581.  
  1582. return array();
  1583. }
  1584.  
  1585. public static function get_user_max_images_uploads_size($user_id) {
  1586. $size = get_user_meta($user_id, 'cardealer_max_images_size', true);
  1587.  
  1588. if (!$size) {
  1589. $options = TMM_Cardealer_User::get_default_user_role_options($user_id);
  1590. $size = isset($options['max_images_size']) ? $options['max_images_size'] : 0;
  1591. }
  1592.  
  1593. if (!$size) {
  1594. $size = TMM::get_option('cardealer_max_images_size', TMM_APP_CARDEALER_PREFIX);
  1595. }
  1596.  
  1597. if (!$size) {
  1598. $size = 5;
  1599. }
  1600.  
  1601. return $size * 1000000.00;
  1602. }
  1603.  
  1604. //users images weight in megabytes
  1605. public static function get_user_uploads_weight($user_ID) {
  1606. $targetFolder = self::get_image_upload_folder() . $user_ID;
  1607. if (!file_exists($targetFolder)) {
  1608. @mkdir($targetFolder, 0755);
  1609. }
  1610. //***
  1611. return TMM_Helper::get_dir_size($targetFolder);
  1612. }
  1613.  
  1614. public static function get_user_file_space($user_ID) {
  1615. $data = array();
  1616. $data['user_file_space'] = self::get_user_uploads_weight($user_ID);
  1617. $data['user_file_max_space'] = self::get_user_max_images_uploads_size($user_ID);
  1618. $data['size_left'] = $data['user_file_max_space'] - $data['user_file_space'];
  1619.  
  1620. return $data;
  1621. }
  1622.  
  1623. public static function update_post_view_count($post_id) {
  1624. $views = (int) get_post_meta($post_id, 'car_views_count', true);
  1625. update_post_meta($post_id, 'car_views_count', ++$views);
  1626. return $views;
  1627. }
  1628.  
  1629. public static function get_cars_count_by_locationid($locationid = 0, $level = 0) {
  1630. global $wpdb;
  1631. $count = 0;
  1632.  
  1633. if ($locationid > 0 && $level > 0) {
  1634. $meta_key = 'car_carlocation_' . (int) $level;
  1635. $meta_value = (int) $locationid;
  1636. $sql = "SELECT count(DISTINCT p.post_name)
  1637. FROM $wpdb->postmeta pm
  1638. JOIN $wpdb->posts p ON (p.ID = pm.post_id)
  1639. WHERE pm.meta_key = '$meta_key'
  1640. AND pm.meta_value = $meta_value
  1641. AND p.post_type = '" . self::$slug . "'
  1642. AND p.post_status = 'publish'
  1643. ";
  1644. $count = $wpdb->get_var($sql);
  1645. }
  1646. return $count;
  1647. }
  1648.  
  1649. /* return array with terms objects of 'carproducer' taxonomy */
  1650. public static function get_carproducers($only_makes = false){
  1651. $args = array(
  1652. 'parent' => '0',
  1653. 'hide_empty' => 0,
  1654. );
  1655. $terms = get_terms('carproducer', $args);
  1656. if(!$only_makes){
  1657. foreach($terms as $term){
  1658. $args['parent'] = $term->term_id;
  1659. $childs = get_terms('carproducer', $args);
  1660. if(is_array($childs) && count($childs)){
  1661. $term->childs = $childs;
  1662. }
  1663. }
  1664. }
  1665. //file_put_contents(TMM_THEME_PATH . '/install/carproducer.dat', serialize($terms));
  1666. return $terms;
  1667. }
  1668.  
  1669. /*
  1670.   * Create car thumbs with right sizes from main image
  1671.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:1: error: class, interface, or enum expected
<?php
^
Main.java:1: error: class, interface, or enum expected
<?php
 ^
Main.java:1: error: class, interface, or enum expected
<?php
  ^
Main.java:8: error: <identifier> expected
    public static $slug = 'car';
                       ^
Main.java:8: error: unclosed character literal
    public static $slug = 'car';
                          ^
Main.java:8: error: unclosed character literal
    public static $slug = 'car';
                              ^
Main.java:9: error: <identifier> expected
    public static $specifications_array = array();
                                       ^
Main.java:10: error: <identifier> expected
    public static $image_sizes = array();
                              ^
Main.java:11: error: <identifier> expected
    public static $max_image_width = 1130;
                                  ^
Main.java:12: error: <identifier> expected
    public static $max_image_height = 732;
                                   ^
Main.java:13: error: <identifier> expected
    public static $car_options = array();
                              ^
Main.java:14: error: <identifier> expected
    public static $allowed_car_data_options = array(); //for security
                                           ^
Main.java:16: error: <identifier> expected
    public static function register($options) {
                                            ^
Main.java:18: error: not a statement
        self::init_options($options);
        ^
Main.java:18: error: ';' expected
        self::init_options($options);
                          ^
Main.java:18: error: not a statement
        self::init_options($options);
                           ^
Main.java:18: error: ';' expected
        self::init_options($options);
                                   ^
Main.java:21: error: unclosed character literal
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                   ^
Main.java:21: error: ';' expected
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                     ^
Main.java:21: error: unclosed character literal
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                      ^
Main.java:21: error: ';' expected
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                              ^
Main.java:21: error: not a statement
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                               ^
Main.java:21: error: ';' expected
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                                        ^
Main.java:21: error: unclosed character literal
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                                          ^
Main.java:21: error: unclosed character literal
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                                                             ^
Main.java:21: error: not a statement
        add_filter('before_delete_post', array(__CLASS__, 'before_delete_post'), 1, 1);
                                                            ^
Main.java:22: error: unclosed character literal
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                   ^
Main.java:22: error: ';' expected
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                     ^
Main.java:22: error: unclosed character literal
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                               ^
Main.java:22: error: ';' expected
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                       ^
Main.java:22: error: not a statement
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                        ^
Main.java:22: error: ';' expected
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                                 ^
Main.java:22: error: unclosed character literal
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                                   ^
Main.java:22: error: unclosed character literal
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                                                      ^
Main.java:22: error: not a statement
        add_filter('parse_query', array(__CLASS__, 'admin_posts_filter'));
                                                     ^
Main.java:23: error: unclosed character literal
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                   ^
Main.java:23: error: ';' expected
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                     ^
Main.java:23: error: unclosed character literal
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                         ^
Main.java:23: error: ';' expected
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                 ^
Main.java:23: error: not a statement
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                  ^
Main.java:23: error: ';' expected
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                           ^
Main.java:23: error: unclosed character literal
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                             ^
Main.java:23: error: unclosed character literal
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                                                          ^
Main.java:23: error: not a statement
        add_action('restrict_manage_posts', array(__CLASS__, 'filter_restrict_manage_posts'));
                                                               ^
Main.java:25: error: <identifier> expected
        add_filter("manage_" . self::$slug . "_posts_columns", array(__CLASS__, "show_edit_columns"));
                                            ^
Main.java:25: error: ';' expected
        add_filter("manage_" . self::$slug . "_posts_columns", array(__CLASS__, "show_edit_columns"));
                                                             ^
Main.java:25: error: ';' expected
        add_filter("manage_" . self::$slug . "_posts_columns", array(__CLASS__, "show_edit_columns"));
                                                                                                    ^
Main.java:26: error: <identifier> expected
        add_action("manage_" . self::$slug . "_posts_custom_column", array(__CLASS__, "show_edit_columns_content"));
                                            ^
Main.java:26: error: ';' expected
        add_action("manage_" . self::$slug . "_posts_custom_column", array(__CLASS__, "show_edit_columns_content"));
                                                                   ^
Main.java:26: error: ';' expected
        add_action("manage_" . self::$slug . "_posts_custom_column", array(__CLASS__, "show_edit_columns_content"));
                                                                                                                  ^
Main.java:27: error: <identifier> expected
        add_filter("manage_edit-" . self::$slug . "_sortable_columns", array(__CLASS__, "show_edit_sortable_columns"));
                                                 ^
Main.java:27: error: ';' expected
        add_filter("manage_edit-" . self::$slug . "_sortable_columns", array(__CLASS__, "show_edit_sortable_columns"));
                                                                     ^
Main.java:27: error: ';' expected
        add_filter("manage_edit-" . self::$slug . "_sortable_columns", array(__CLASS__, "show_edit_sortable_columns"));
                                                                                                                     ^
Main.java:28: error: unclosed character literal
        add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
                   ^
Main.java:28: error: ';' expected
        add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
                     ^
Main.java:28: error: unclosed character literal
        add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
                                 ^
Main.java:28: error: not a statement
        add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
                        ^
Main.java:28: error: ';' expected
        add_action('load-edit.php', array(__CLASS__, "show_edit_sortable_columns_act"));
                                                                                      ^
Main.java:29: error: unclosed character literal
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                   ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                     ^
Main.java:29: error: unclosed character literal
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                              ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                ^
Main.java:29: error: not a statement
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                  ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                             ^
Main.java:29: error: unclosed character literal
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                  ^
Main.java:29: error: unclosed character literal
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                     ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                       ^
Main.java:29: error: not a statement
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                         ^
Main.java:29: error: ';' expected
        add_action('save_post_' . self::$slug, array(__CLASS__, 'save'), 10, 3);
                                                                           ^
Main.java:32: error: unclosed character literal
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                   ^
Main.java:32: error: ';' expected
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                     ^
Main.java:32: error: unclosed character literal
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                   ^
Main.java:32: error: ';' expected
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                           ^
Main.java:32: error: not a statement
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                            ^
Main.java:32: error: ';' expected
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                                     ^
Main.java:32: error: unclosed character literal
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                                       ^
Main.java:32: error: unclosed character literal
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                                                       ^
Main.java:32: error: not a statement
        add_action('wp_ajax_app_cardealer_admin_set_car_as_featured', array(__CLASS__, 'set_as_featured'));
                                                                                         ^
Main.java:35: error: <identifier> expected
    public static function init_options($cars_options) {
                                                     ^
Main.java:40: error: ';' expected
        $slider_size = self::slider_image_size();
                                              ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
            ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
              ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                      ^
Main.java:42: error: illegal start of expression
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                         ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                 ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                   ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                       ^
Main.java:42: error: illegal start of expression
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                          ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                         ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                           ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                               ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                 ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                   ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                          ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                                            ^
Main.java:42: error: not a statement
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                                           ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                                              ^
Main.java:42: error: unclosed character literal
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                                                   ^
Main.java:42: error: ';' expected
            'homeslide' => array('width' => $slider_size['width'], 'height' => $slider_size['height'], 'description' => __('Image of home slider', 'cardealer')),
                                                                                                     ^
100 errors
stdout
Standard output is empty