Passed
Pull Request — master (#234)
by Kiran
13:23
created

custom_functions.php ➔ geodir_exif()   F

Complexity

Conditions 29
Paths 2383

Size

Total Lines 124
Code Lines 86

Duplication

Lines 20
Ratio 16.13 %

Code Coverage

Tests 0
CRAP Score 870
Metric Value
cc 29
eloc 86
nc 2383
nop 1
dl 20
loc 124
ccs 0
cts 93
cp 0
crap 870
rs 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Custom functions
4
 *
5
 * @since 1.0.0
6
 * @package GeoDirectory
7
 */
8
9
/**
10
 * Front end listing view template selection.
11
 *
12
 * This function adds a drop down in front end listing page for selecting view template. Ex: list view, 2 column grid view, etc.
13
 *
14
 * @since 1.0.0
15
 * @package GeoDirectory
16
 *
17
 * @global object $gd_session GeoDirectory Session object.
18
 */
19
function geodir_list_view_select() {
20 1
    global $gd_session;
21
	?>
22
    <script type="text/javascript">
23
	function geodir_list_view_select(list) {
24
		//alert(listval);
25
		val = list.value;
26
		if (!val) {
27
			return;
28
		}
29
30
		var listSel = jQuery(list).parent().parent().next('.geodir_category_list_view');
31
		if (val != 1) {
32
			jQuery(listSel).children('li').addClass('geodir-gridview');
33
			jQuery(listSel).children('li').removeClass('geodir-listview');
34
		} else {
35
			jQuery(listSel).children('li').addClass('geodir-listview');
36
		}
37
38
		if (val == 1) {
39
			jQuery(listSel).children('li').removeClass('geodir-gridview gridview_onehalf gridview_onethird gridview_onefourth gridview_onefifth');
40
		}
41
		else if (val == 2) {
42
			jQuery(listSel).children('li').switchClass('gridview_onethird gridview_onefourth gridview_onefifth', 'gridview_onehalf', 600);
43
		}
44
		else if (val == 3) {
45
			jQuery(listSel).children('li').switchClass('gridview_onehalf gridview_onefourth gridview_onefifth', 'gridview_onethird', 600);
46
		}
47
		else if (val == 4) {
48
			jQuery(listSel).children('li').switchClass('gridview_onehalf gridview_onethird gridview_onefifth', 'gridview_onefourth', 600);
49
		}
50
		else if (val == 5) {
51
			jQuery(listSel).children('li').switchClass('gridview_onehalf gridview_onethird gridview_onefourth', 'gridview_onefifth', 600);
52
		}
53
54
		jQuery.post("<?php echo geodir_get_ajax_url();?>&gd_listing_view=" + val, function (data) {
55
			//alert(data );
56
		});
57
	}
58
    </script>
59
    <div class="geodir-list-view-select">
60
        <select name="gd_list_view" id="gd_list_view" onchange="geodir_list_view_select(this);">
61
            <?php $listing_view = (int)$gd_session->get('gd_listing_view'); ?>
62
            <option value=""><?php _e('View:', 'geodirectory');?></option>
63
            <option value="1" <?php selected(1, $listing_view);?>><?php _e('View: List', 'geodirectory');?></option>
64
            <option value="2" <?php selected(2, $listing_view);?>><?php _e('View: Grid 2', 'geodirectory');?></option>
65
            <option value="3" <?php selected(3, $listing_view);?>><?php _e('View: Grid 3', 'geodirectory');?></option>
66
            <option value="4" <?php selected(4, $listing_view);?>><?php _e('View: Grid 4', 'geodirectory');?></option>
67
            <option value="5" <?php selected(5, $listing_view);?>><?php _e('View: Grid 5', 'geodirectory');?></option>
68
        </select>
69
    </div>
70
<?php
71 1
}
72
73
//add_action('geodir_before_listing_post_listview', 'geodir_list_view_select');
0 ignored issues
show
Unused Code Comprehensibility introduced by
75% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
74
add_action('geodir_before_listing', 'geodir_list_view_select', 100);
75
76
/**
77
 * Limit the listing excerpt.
78
 *
79
 * This function limits excerpt characters and display "read more" link.
80
 *
81
 * @since 1.0.0
82
 * @package GeoDirectory
83
 * @param string|int $charlength The character length.
84
 * @global object $post The current post object.
85
 * @return string The modified excerpt.
86
 */
87
function geodir_max_excerpt($charlength)
88
{
89 4
    global $post;
90 4
    if ($charlength == '0') {
91
        return;
92
    }
93 4
    $out = '';
94
	
95 4
	$temp_post = $post;
96 4
	$excerpt = get_the_excerpt();
97
98 4
    $charlength++;
99 4
    $excerpt_more = function_exists('geodirf_excerpt_more') ? geodirf_excerpt_more('') : geodir_excerpt_more('');
100 4
    if (mb_strlen($excerpt) > $charlength) {
101 4
        if (mb_strlen($excerpt_more) > 0 && mb_strpos($excerpt, $excerpt_more) !== false) {
102 4
            $excut = -(mb_strlen($excerpt_more));
103 4
            $subex = mb_substr($excerpt, 0, $excut);
104 4
            if ($charlength > 0 && mb_strlen($subex) > $charlength) {
105 4
                $subex = mb_substr($subex, 0, $charlength);
106 4
            }
107 4
            $out .= $subex;
108 4
        } else {
109
            $subex = mb_substr($excerpt, 0, $charlength - 5);
110
            $exwords = explode(' ', $subex);
111
            $excut = -(mb_strlen($exwords[count($exwords) - 1]));
112
            if ($excut < 0) {
113
                $out .= mb_substr($subex, 0, $excut);
114
            } else {
115
                $out .= $subex;
116
            }
117
        }
118 4
        $out .= ' <a class="excerpt-read-more" href="' . get_permalink() . '" title="' . get_the_title() . '">';
119
        /**
120
         * Filter excerpt read more text.
121
         *
122
         * @since 1.0.0
123
         */
124 4
        $out .= apply_filters('geodir_max_excerpt_end', __('Read more [...]', 'geodirectory'));
125 4
        $out .= '</a>';
126
127 4
    } else {
128 1
        if (mb_strlen($excerpt_more) > 0 && mb_strpos($excerpt, $excerpt_more) !== false) {
129
            $excut = -(mb_strlen($excerpt_more));
130
            $out .= mb_substr($excerpt, 0, $excut);
131
            $out .= ' <a class="excerpt-read-more" href="' . get_permalink() . '" title="' . get_the_title() . '">';
132
            /**
133
             * Filter excerpt read more text.
134
             *
135
             * @since 1.0.0
136
             */
137
            $out .= apply_filters('geodir_max_excerpt_end', __('Read more [...]', 'geodirectory'));
138
            $out .= '</a>';
139
        } else {
140 1
            $out .= $excerpt;
141
        }
142
    }
143 4
	$post = $temp_post;
144
145 4
    return $out;
146
}
147
148
/**
149
 * Returns package information as an objects.
150
 *
151
 * @since 1.0.0
152
 * @package GeoDirectory
153
 * @param array $package_info Package info array.
154
 * @param object|string $post The post object.
155
 * @param string $post_type The post type.
156
 * @return object Returns filtered package info as an object.
157
 */
158
function geodir_post_package_info($package_info, $post = '', $post_type = '')
159
{
160 18
    $package_info['pid'] = 0;
161 18
    $package_info['days'] = 0;
162 18
    $package_info['amount'] = 0;
163 18
    $package_info['is_featured'] = 0;
164 18
    $package_info['image_limit'] = '';
165 18
    $package_info['google_analytics'] = 1;
166 18
    $package_info['sendtofriend'] = 1;
167
168
    /**
169
     * Filter listing package info.
170
     *
171
     * @since 1.0.0
172
     * @param array $package_info {
173
     *    Attributes of the package_info.
174
     *
175
     *    @type int $pid Package ID. Default 0.
176
     *    @type int $days Package validity in Days. Default 0.
177
     *    @type int $amount Package amount. Default 0.
178
     *    @type int $is_featured Is this featured package? Default 0.
179
     *    @type string $image_limit Image limit for this package. Default "".
180
     *    @type int $google_analytics Add analytics to this package. Default 1.
181
     *    @type int $sendtofriend Send to friend. Default 1.
182
     *
183
     * }
184
     * @param object|string $post The post object.
185
     * @param string $post_type The post type.
186
     */
187 18
    return (object)apply_filters('geodir_post_package_info', $package_info, $post, $post_type);
188
189
}
190
191
192
/**
193
 * Send enquiry to listing author
194
 *
195
 * This function let the user to send Enquiry to listing author. If listing author email not available, then admin email will be used.
196
 * Email content will be used WP Admin -> Geodirectory -> Notifications -> Other Emails -> Email enquiry
197
 *
198
 * @since 1.0.0
199
 * @package GeoDirectory
200
 * @global object $wpdb WordPress Database object.
201
 * @param array $request {
202
 *    The submitted form fields as an array.
203
 *
204
 *    @type string $sendact Enquiry type. Default "send_inqury".
205
 *    @type string $pid Post ID.
206
 *    @type string $inq_name Sender name.
207
 *    @type string $inq_email Sender mail.
208
 *    @type string $inq_phone Sender phone.
209
 *    @type string $inq_msg Email message.
210
 *
211
 * }
212
 */
213
function geodir_send_inquiry($request)
214
{
215 1
    global $wpdb;
216
217
    // strip slashes from text
218 1
    $request = !empty($request) ? stripslashes_deep($request) : $request;
219
220 1
    $yourname = $request['inq_name'];
221 1
    $youremail = $request['inq_email'];
222 1
    $inq_phone = $request['inq_phone'];
223 1
    $frnd_comments = $request['inq_msg'];
224 1
    $pid = $request['pid'];
225
226 1
    $author_id = '';
227 1
    $post_title = '';
228
229 1
    if ($request['pid']) {
230
231 1
        $productinfosql = $wpdb->prepare(
232 1
            "select ID,post_author,post_title from $wpdb->posts where ID =%d",
233 1
            array($request['pid'])
234 1
        );
235 1
        $productinfo = $wpdb->get_row($productinfosql);
236
237 1
        $author_id = $productinfo->post_author;
238 1
        $post_title = $productinfo->post_title;
239 1
    }
240
241 1
    $post_title = '<a href="' . get_permalink($pid) . '">' . $post_title . '</a>';
0 ignored issues
show
Unused Code introduced by
$post_title is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
242
243 1
    $user_info = get_userdata($author_id);
0 ignored issues
show
Unused Code introduced by
$user_info is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
244 1
    $to_email = geodir_get_post_meta($pid, 'geodir_email', true);
245 1
    $to_name = geodir_get_client_name($author_id);
246
247 1
    if ($to_email == '') {
248
        $to_email = get_option('admin_email');
249
    }
250
251
    /**
252
     * Called after the send enquiry var have been set but before the email has been sent.
253
     *
254
     * @since 1.0.0
255
     * @param array $request {
256
     *    The submitted form fields as an array.
257
     *
258
     *    @type string $sendact Enquiry type. Default "send_inqury".
259
     *    @type string $pid Post ID.
260
     *    @type string $inq_name Sender name.
261
     *    @type string $inq_email Sender mail.
262
     *    @type string $inq_phone Sender phone.
263
     *    @type string $inq_msg Email message.
264
     *
265
     * }
266
     * @param string $type The form type, default: `Enquiry`.
267
     */
268 1
    do_action('geodir_after_send_enquiry', $request, 'Enquiry');
269
270 1
    $client_message = $frnd_comments;
271 1
    $client_message .= '<br>' . __('From :', 'geodirectory') . ' ' . $yourname . '<br>' . __('Phone :', 'geodirectory') . ' ' . $inq_phone . '<br>' . __('Email :', 'geodirectory') . ' ' . $youremail . '<br><br>' . __('Sent from', 'geodirectory') . ' - <b><a href="' . trailingslashit(home_url()) . '">' . get_option('blogname') . '</a></b>.';
272
    /**
273
     * Filter client message text.
274
     *
275
     * @since 1.0.0
276
     * @param string $client_message Client message text.
277
     */
278 1
    $client_message = apply_filters('geodir_inquiry_email_msg', $client_message);
279
280
    /**
281
     * Called before the send enquiry email is sent.
282
     *
283
     * @since 1.0.0
284
     * @param array $request {
285
     *    The submitted form fields as an array.
286
     *
287
     *    @type string $sendact Enquiry type. Default "send_inqury".
288
     *    @type string $pid Post ID.
289
     *    @type string $inq_name Sender name.
290
     *    @type string $inq_email Sender mail.
291
     *    @type string $inq_phone Sender phone.
292
     *    @type string $inq_msg Email message.
293
     *
294
     * }
295
     */
296 1
    do_action('geodir_before_send_enquiry_email', $request);
297 1
    if ($to_email) {
298
        // strip slashes message
299 1
        $client_message = stripslashes_deep($client_message);
300
301 1
        geodir_sendEmail($youremail, $yourname, $to_email, $to_name, '', $client_message, $extra = '', 'send_enquiry', $request['pid']);//To client email
302 1
    }
303
304
    /**
305
     * Called after the send enquiry email is sent.
306
     *
307
     * @since 1.0.0
308
     * @param array $request {
309
     *    The submitted form fields as an array.
310
     *
311
     *    @type string $sendact Enquiry type. Default "send_inqury".
312
     *    @type string $pid Post ID.
313
     *    @type string $inq_name Sender name.
314
     *    @type string $inq_email Sender mail.
315
     *    @type string $inq_phone Sender phone.
316
     *    @type string $inq_msg Email message.
317
     *
318
     * }
319
     */
320 1
    do_action('geodir_after_send_enquiry_email', $request);
321 1
    $url = get_permalink($pid);
322 1 View Code Duplication
    if (strstr($url, '?')) {
323 1
        $url = $url . "&send_inquiry=success";
324 1
    } else {
325
        $url = $url . "?send_inquiry=success";
326
    }
327
    /**
328
     * Filter redirect url after the send enquiry email is sent.
329
     *
330
     * @since 1.0.0
331
     * @param string $url Redirect url.
332
     */
333 1
    $url = apply_filters('geodir_send_enquiry_after_submit_redirect', $url);
334 1
    wp_redirect($url);
335 1
    gd_die();
336
337 1
}
338
339
/**
340
 * Send Email to a friend.
341
 *
342
 * This function let the user to send Email to a friend.
343
 * Email content will be used WP Admin -> Geodirectory -> Notifications -> Other Emails -> Send to friend
344
 *
345
 * @since 1.0.0
346
 * @package GeoDirectory
347
 * @param array $request {
348
 *    The submitted form fields as an array.
349
 *
350
 *    @type string $sendact Enquiry type. Default "email_frnd".
351
 *    @type string $pid Post ID.
352
 *    @type string $to_name Friend name.
353
 *    @type string $to_email Friend email.
354
 *    @type string $yourname Sender name.
355
 *    @type string $youremail Sender email.
356
 *    @type string $frnd_subject Email subject.
357
 *    @type string $frnd_comments Email Message.
358
 *
359
 * }
360
 * @global object $wpdb WordPress Database object.
361
 */
362
function geodir_send_friend($request)
363
{
364 1
    global $wpdb;
365
366
    // strip slashes from text
367 1
    $request = !empty($request) ? stripslashes_deep($request) : $request;
368
369 1
    $yourname = $request['yourname'];
370 1
    $youremail = $request['youremail'];
371 1
    $frnd_subject = $request['frnd_subject'];
372 1
    $frnd_comments = $request['frnd_comments'];
373 1
    $pid = $request['pid'];
374 1
    $to_email = $request['to_email'];
375 1
    $to_name = $request['to_name'];
376 1
    if ($request['pid']) {
377 1
        $productinfosql = $wpdb->prepare(
378 1
            "select ID,post_title from $wpdb->posts where ID =%d",
379 1
            array($request['pid'])
380 1
        );
381 1
        $productinfo = $wpdb->get_results($productinfosql);
382 1
        foreach ($productinfo as $productinfoObj) {
383 1
            $post_title = $productinfoObj->post_title;
0 ignored issues
show
Unused Code introduced by
$post_title is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
384 1
        }
385 1
    }
386
387
    /**
388
     * Called before the send to friend email is sent.
389
     *
390
     * @since 1.0.0
391
     * @param array $request {
392
     *    The submitted form fields as an array.
393
     *
394
     *    @type string $sendact Enquiry type. Default "email_frnd".
395
     *    @type string $pid Post ID.
396
     *    @type string $to_name Friend name.
397
     *    @type string $to_email Friend email.
398
     *    @type string $yourname Sender name.
399
     *    @type string $youremail Sender email.
400
     *    @type string $frnd_subject Email subject.
401
     *    @type string $frnd_comments Email Message.
402
     *
403
     * }
404
     */
405 1
    do_action('geodir_before_send_to_friend_email', $request);
406 1
    geodir_sendEmail($youremail, $yourname, $to_email, $to_name, $frnd_subject, $frnd_comments, $extra = '', 'send_friend', $request['pid']);//To client email
407
408
    /**
409
     * Called after the send to friend email is sent.
410
     *
411
     * @since 1.0.0
412
     * @param array $request {
413
     *    The submitted form fields as an array.
414
     *
415
     *    @type string $sendact Enquiry type. Default "email_frnd".
416
     *    @type string $pid Post ID.
417
     *    @type string $to_name Friend name.
418
     *    @type string $to_email Friend email.
419
     *    @type string $yourname Sender name.
420
     *    @type string $youremail Sender email.
421
     *    @type string $frnd_subject Email subject.
422
     *    @type string $frnd_comments Email Message.
423
     *
424
     * }
425
     */
426 1
    do_action('geodir_after_send_to_friend_email', $request);
427
428 1
    $url = get_permalink($pid);
429 1 View Code Duplication
    if (strstr($url, '?')) {
430 1
        $url = $url . "&sendtofrnd=success";
431 1
    } else {
432
        $url = $url . "?sendtofrnd=success";
433
    }
434
    /**
435
     * Filter redirect url after the send to friend email is sent.
436
     *
437
     * @since 1.0.0
438
     * @param string $url Redirect url.
439
     */
440 1
    $url = apply_filters('geodir_send_to_friend_after_submit_redirect', $url);
441 1
    wp_redirect($url);
442 1
    gd_die();
443 1
}
444
445
/**
446
 * Adds open div before the tab content.
447
 *
448
 * This function adds open div before the tab content like post information, post images, reviews etc.
449
 *
450
 * @since 1.0.0
451
 * @package GeoDirectory
452
 * @param string $hash_key
453
 */
454
function geodir_before_tab_content($hash_key)
455
{
456
    switch ($hash_key) {
457 1
        case 'post_info' :
458
            echo '<div class="geodir-company_info field-group">';
459
            break;
460 1
        case 'post_images' :
461
            /**
462
             * Filter post gallery HTML id.
463
             *
464
             * @since 1.0.0
465
             */
466 1
            echo ' <div id="' . apply_filters('geodir_post_gallery_id', 'geodir-post-gallery') . '" class="clearfix" >';
467 1
            break;
468 1
        case 'reviews' :
469 1
            echo '<div id="reviews-wrap" class="clearfix"> ';
470 1
            break;
471 1
        case 'post_video':
472
            echo ' <div id="post_video-wrap" class="clearfix">';
473
            break;
474 1
        case 'special_offers':
475
            echo '<div id="special_offers-wrap" class="clearfix">';
476
            break;
477
    }
478 1
}
479
480
/**
481
 * Adds closing div after the tab content.
482
 *
483
 * This function adds closing div after the tab content like post information, post images, reviews etc.
484
 *
485
 * @since 1.0.0
486
 * @package GeoDirectory
487
 * @param string $hash_key
488
 */
489
function geodir_after_tab_content($hash_key)
490
{
491
    switch ($hash_key) {
492 1
        case 'post_info' :
493
            echo '</div>';
494
            break;
495 1
        case 'post_images' :
496 1
            echo '</div>';
497 1
            break;
498 1
        case 'reviews' :
499 1
            echo '</div>';
500 1
            break;
501 1
        case 'post_video':
502
            echo '</div>';
503
            break;
504 1
        case 'special_offers':
505
            echo '</div>';
506
            break;
507
    }
508 1
}
509
510
511
/**
512
 * Returns default sorting order of a post type.
513
 *
514
 * @since 1.0.0
515
 * @package GeoDirectory
516
 * @param string $post_type The post type.
517
 * @global object $wpdb WordPress Database object.
518
 * @return bool|null|string Returns default sort results, when the post type is valid. Otherwise returns false.
519
 */
520 View Code Duplication
function geodir_get_posts_default_sort($post_type)
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
521
{
522
523
    global $wpdb;
524
525
    if ($post_type != '') {
526
527
        $all_postypes = geodir_get_posttypes();
528
529
        if (!in_array($post_type, $all_postypes))
530
            return false;
531
532
        $sort_field_info = $wpdb->get_var($wpdb->prepare("select default_order from " . GEODIR_CUSTOM_SORT_FIELDS_TABLE . " where	post_type= %s and is_active=%d and is_default=%d", array($post_type, 1, 1)));
533
534
        if (!empty($sort_field_info))
535
            return $sort_field_info;
536
537
    }
538
539
}
540
541
542
/**
543
 * Returns sort options of a post type.
544
 *
545
 * @since 1.0.0
546
 * @package GeoDirectory
547
 * @param string $post_type The post type.
548
 * @global object $wpdb WordPress Database object.
549
 * @return bool|mixed|void Returns sort results, when the post type is valid. Otherwise returns false.
550
 */
551 View Code Duplication
function geodir_get_sort_options($post_type) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
552 1
    global $wpdb;
553
554 1
    if ($post_type != '') {
555 1
        $all_postypes = geodir_get_posttypes();
556
557 1
        if (!in_array($post_type, $all_postypes))
558 1
            return false;
559
560 1
        $sort_field_info = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . GEODIR_CUSTOM_SORT_FIELDS_TABLE . " WHERE post_type=%s AND is_active=%d AND (sort_asc=1 || sort_desc=1 || field_type='random') AND field_type != 'address' ORDER BY sort_order ASC", array($post_type, 1)));
561
        /**
562
         * Filter post sort options.
563
         *
564
         * @since 1.0.0
565
         * @param array $sort_field_info Unfiltered sort field array.
566
         * @param string $post_type Post type.
567
         */
568 1
        return apply_filters('geodir_get_sort_options', $sort_field_info, $post_type);
569
    }
570
571
}
572
573
574
/**
575
 * Display list of sort options available in front end using dropdown.
576
 *
577
 * @since 1.0.0
578
 * @package GeoDirectory
579
 * @global object $wp_query WordPress Query object.
580
 */
581
function geodir_display_sort_options()
582
{
583 1
    global $wp_query;
584
	
585
	/**
586
	 * On search pages there should be no sort options, sorting is done by search criteria.
587
	 *
588
	 * @since 1.4.4
589
	 */
590 1
	if ( is_search() ) {
591
		return;
592
	}
593
594 1
    $sort_by = '';
595
596 1
    if (isset($_REQUEST['sort_by'])) $sort_by = $_REQUEST['sort_by'];
597
598 1
    $gd_post_type = geodir_get_current_posttype();
599
600 1
    $sort_options = geodir_get_sort_options($gd_post_type);
601
602
603 1
    $sort_field_options = '';
604
605 1
    if (!empty($sort_options)) {
606
        foreach ($sort_options as $sort) {
607
			$sort = stripslashes_deep($sort); // strip slashes
608
609
            $label = __($sort->site_title, 'geodirectory');
610
611
            if ($sort->field_type == 'random') {
612
                $key = $sort->field_type;
613
                ($sort_by == $key || ($sort->is_default == '1' && !isset($_REQUEST['sort_by']))) ? $selected = 'selected="selected"' : $selected = '';
614
                $sort_field_options .= '<option ' . $selected . ' value="' . esc_url( add_query_arg('sort_by', $key) ) . '">' . __($label, 'geodirectory') . '</option>';
615
            }
616
617
            if ($sort->htmlvar_name == 'comment_count') {
618
                $sort->htmlvar_name = 'rating_count';
619
            }
620
621 View Code Duplication
            if ($sort->sort_asc) {
622
                $key = $sort->htmlvar_name . '_asc';
623
                $label = $sort->site_title;
624
                if ($sort->asc_title)
625
                    $label = $sort->asc_title;
626
                ($sort_by == $key || ($sort->is_default == '1' && $sort->default_order == $key && !isset($_REQUEST['sort_by']))) ? $selected = 'selected="selected"' : $selected = '';
627
                $sort_field_options .= '<option ' . $selected . ' value="' . esc_url( add_query_arg('sort_by', $key) ) . '">' . __($label, 'geodirectory') . '</option>';
628
            }
629
630 View Code Duplication
            if ($sort->sort_desc) {
631
                $key = $sort->htmlvar_name . '_desc';
632
                $label = $sort->site_title;
633
                if ($sort->desc_title)
634
                    $label = $sort->desc_title;
635
                ($sort_by == $key || ($sort->is_default == '1' && $sort->default_order == $key && !isset($_REQUEST['sort_by']))) ? $selected = 'selected="selected"' : $selected = '';
636
                $sort_field_options .= '<option ' . $selected . ' value="' . esc_url( add_query_arg('sort_by', $key) ) . '">' . __($label, 'geodirectory') . '</option>';
637
            }
638
639
        }
640
    }
641
642 1
    if ($sort_field_options != '') {
643
644
        ?>
645
646
        <div class="geodir-tax-sort">
647
648
            <select name="sort_by" id="sort_by" onchange="javascript:window.location=this.value;">
649
650
                <option
651
                    value="<?php echo esc_url( add_query_arg('sort_by', '') );?>" <?php if ($sort_by == '') echo 'selected="selected"';?>><?php _e('Sort By', 'geodirectory');?></option><?php
652
653
                echo $sort_field_options;?>
654
655
            </select>
656
657
        </div>
658
    <?php
659
660
    }
661
662 1
}
663
664
665
/**
666
 * Removes the section title
667
 *
668
 * Removes the section title "Posts sort options", if the custom field type is multiselect or textarea or taxonomy.
669
 * Can be found here. WP Admin -> Geodirectory -> Place settings -> Custom fields
670
 *
671
 * @since 1.0.0
672
 * @package GeoDirectory
673
 * @param string $title The section title.
674
 * @param string $field_type The field type.
675
 * @return string Returns the section title.
676
 */
677
function geodir_advance_customfields_heading($title, $field_type)
678
{
679
680 2
    if (in_array($field_type, array('multiselect', 'textarea', 'taxonomy'))) {
681 1
        $title = '';
682 1
    }
683 2
    return $title;
684
}
685
686
687
/**
688
 * Returns related listings of a listing.
689
 *
690
 * @since 1.0.0
691
 * @package GeoDirectory
692
 * @param array $request Related posts request array.
693
 * @global object $wpdb WordPress Database object.
694
 * @global object $post The current post object.
695
 * @global string $gridview_columns The girdview style of the listings.
696
 * @global object $gd_session GeoDirectory Session object.
697
 * @return string Returns related posts html.
698
 */
699
function geodir_related_posts_display($request) {
700 3
    if (!empty($request)) {
701 3
        $before_title = (isset($request['before_title']) && !empty($request['before_title'])) ? $request['before_title'] : '';
702 3
        $after_title = (isset($request['after_title']) && !empty($request['after_title'])) ? $request['after_title'] : '';
703
704 3
        $title = (isset($request['title']) && !empty($request['title'])) ? $request['title'] : __('Related Listings', 'geodirectory');
705 3
        $post_number = (isset($request['post_number']) && !empty($request['post_number'])) ? $request['post_number'] : '5';
706 3
        $relate_to = (isset($request['relate_to']) && !empty($request['relate_to'])) ? $request['relate_to'] : 'category';
707 3
        $layout = (isset($request['layout']) && !empty($request['layout'])) ? $request['layout'] : 'gridview_onehalf';
708 3
        $add_location_filter = (isset($request['add_location_filter']) && !empty($request['add_location_filter'])) ? $request['add_location_filter'] : '0';
709 3
        $listing_width = (isset($request['listing_width']) && !empty($request['listing_width'])) ? $request['listing_width'] : '';
710 3
        $list_sort = (isset($request['list_sort']) && !empty($request['list_sort'])) ? $request['list_sort'] : 'latest';
711 3
        $character_count = (isset($request['character_count']) && !empty($request['character_count'])) ? $request['character_count'] : '';
712
713 3
        global $wpdb, $post, $gd_session;
714 3
        $origi_post = $post;
715 3
        $post_type = '';
716 3
        $post_id = '';
717 3
        $category_taxonomy = '';
718 3
        $tax_field = 'id';
719 3
        $category = array();
720
721 3
        if (isset($_REQUEST['backandedit'])) {
722
            $post = (object)$gd_session->get('listing');
723
            $post_type = $post->listing_type;
724
            if (isset($_REQUEST['pid']) && $_REQUEST['pid'] != '')
725
                $post_id = $_REQUEST['pid'];
726 3 View Code Duplication
        } elseif (isset($_REQUEST['pid']) && $_REQUEST['pid'] != '') {
727
            $post = geodir_get_post_info($_REQUEST['pid']);
728
            $post_type = $post->post_type;
729
            $post_id = $_REQUEST['pid'];
730 3
        } elseif (isset($post->post_type) && $post->post_type != '') {
731 3
            $post_type = $post->post_type;
732 3
            $post_id = $post->ID;
733 3
        }
734
735 3
        if ($relate_to == 'category') {
736
737 3
            $category_taxonomy = $post_type . $relate_to;
738 3
            if (isset($post->{$category_taxonomy}) && $post->{$category_taxonomy} != '')
739 3
                $category = explode(',', trim($post->{$category_taxonomy}, ','));
740
741 3
        } elseif ($relate_to == 'tags') {
742
743
            $category_taxonomy = $post_type . '_' . $relate_to;
744
            if ($post->post_tags != '')
745
                $category = explode(',', trim($post->post_tags, ','));
746
            $tax_field = 'name';
747
        }
748
749
        /* --- return false in invalid request --- */
750 3
        if (empty($category))
751 3
            return false;
752
753 2
        $all_postypes = geodir_get_posttypes();
754
755 2
        if (!in_array($post_type, $all_postypes))
756 2
            return false;
757
758
        /* --- return false in invalid request --- */
759
760 2
       $location_url = '';
761 2
        if ($add_location_filter != '0') {
762
            $location_url = array();
763
			$geodir_show_location_url = get_option('geodir_show_location_url');
764
			
765
			$gd_city = get_query_var('gd_city');
766
			
767
			if ($gd_city) {
768
				$gd_country = get_query_var('gd_country');
769
				$gd_region = get_query_var('gd_region');
770
            } else {
771
                $location = geodir_get_default_location();
772
				
773
				$gd_country = isset($location->country_slug) ? $location->country_slug : '';
774
				$gd_region = isset($location->region_slug) ? $location->region_slug : '';
775
				$gd_city = isset($location->city_slug) ? $location->city_slug : '';
776
            }
777
			
778
			if ($geodir_show_location_url == 'all') {
779
				$location_url[] = $gd_country;
780
				$location_url[] = $gd_region;
781
			} else if ($geodir_show_location_url == 'country_city') {
782
				$location_url[] = $gd_country;
783
			} else if ($geodir_show_location_url == 'region_city') {
784
				$location_url[] = $gd_region;
785
			}
786
			
787
			$location_url[] = $gd_city;
788
789
            $location_url = implode('/', $location_url);
790
        }
791
792
793 2
        if (!empty($category)) {
794 2
            global $geodir_add_location_url;
795 2
            $geodir_add_location_url = '0';
796 2
            if ($add_location_filter != '0') {
797
                $geodir_add_location_url = '1';
798
            }
799 2
            $viewall_url = get_term_link((int)$category[0], $post_type . $category_taxonomy);
800 2
            $geodir_add_location_url = NULL;
801 2
        }
802 2
        ob_start();
803
        ?>
804
805
806
        <div class="geodir_locations geodir_location_listing">
807
808
            <?php
809 2
            if (isset($request['is_widget']) && $request['is_widget'] == '1') {
810
                /** geodir_before_title filter Documented in geodirectory_widgets.php */
811 2
                $before_title = isset($before_title) ? $before_title : apply_filters('geodir_before_title', '<h3 class="widget-title">');
812
                /** geodir_after_title filter Documented in geodirectory_widgets.php */
813 2
                $after_title = isset($after_title) ? $after_title : apply_filters('geodir_after_title', '</h3>');
814
                ?>
815
                <div class="location_list_heading clearfix">
816
                    <?php echo $before_title . $title . $after_title; ?>
817
                </div>
818
            <?php
819 2
            }
820
            $query_args = array(
821 2
                'posts_per_page' => $post_number,
822 2
                'is_geodir_loop' => true,
823 2
                'gd_location' => ($add_location_filter) ? true : false,
824 2
                'post_type' => $post_type,
825 2
                'order_by' => $list_sort,
826 2
                'post__not_in' => array($post_id),
827 2
                'excerpt_length' => $character_count,
828 2
            );
829
830 2
            $tax_query = array('taxonomy' => $category_taxonomy,
831 2
                'field' => $tax_field,
832
                'terms' => $category
833 2
            );
834
835 2
            $query_args['tax_query'] = array($tax_query);
836
837
838 2
            global $gridview_columns, $post;
839
840
841 2
            query_posts($query_args);
842
843 2 View Code Duplication
            if (strstr($layout, 'gridview')) {
844 2
                $listing_view_exp = explode('_', $layout);
845 2
                $gridview_columns = $layout;
846 2
                $layout = $listing_view_exp[0];
847 2
            } else if ($layout == 'list') {
848
                $gridview_columns = '';
849
            }
850 2
            $related_posts = true;
851
852
            /**
853
             * Filters related listing listview template.
854
             *
855
             * @since 1.0.0
856
             */
857 2
            $template = apply_filters("geodir_template_part-related-listing-listview", geodir_locate_template('listing-listview'));
858
859
            /**
860
             * Includes related listing listview template.
861
             *
862
             * @since 1.0.0
863
             */
864 2
            include($template);
865
866 2
            wp_reset_query();
867 2
            $post = $origi_post;
868
            ?>
869
870
        </div>
871
        <?php
872 2
        return $html = ob_get_clean();
0 ignored issues
show
Unused Code introduced by
$html is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
873
874
    }
875
876
}
877
878
879
//add_action('wp_footer', 'geodir_category_count_script', 10);
0 ignored issues
show
Unused Code Comprehensibility introduced by
73% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
880
/**
881
 * Adds the category post count javascript code
882
 *
883
 * @since 1.0.0
884
 * @package GeoDirectory
885
 * @global string $geodir_post_category_str The geodirectory post category.
886
 * @depreciated No longer needed.
887
 */
888
function geodir_category_count_script()
889
{
890
    global $geodir_post_category_str;
891
892
    if (!empty($geodir_post_category_str)) {
893
        $geodir_post_category_str = serialize($geodir_post_category_str);
894
    }
895
896
    $all_var['post_category_array'] = html_entity_decode((string)$geodir_post_category_str, ENT_QUOTES, 'UTF-8');
0 ignored issues
show
Coding Style Comprehensibility introduced by
$all_var was never initialized. Although not strictly required by PHP, it is generally a good practice to add $all_var = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
897
    $script = "var post_category_array = " . json_encode($all_var) . ';';
898
    echo '<script>';
899
    echo $script;
900
    echo '</script>';
901
902
}
903
904
/**
905
 * Returns the default language of the map.
906
 *
907
 * @since 1.0.0
908
 * @package GeoDirectory
909
 * @return string Returns the default language.
910
 */
911
function geodir_get_map_default_language()
912
{
913 2
    $geodir_default_map_language = get_option('geodir_default_map_language');
914 2
    if (empty($geodir_default_map_language))
915 2
        $geodir_default_map_language = 'en';
916
    /**
917
     * Filter default map language.
918
     *
919
     * @since 1.0.0
920
     * @param string $geodir_default_map_language Default map language.
921
     */
922 2
    return apply_filters('geodir_default_map_language', $geodir_default_map_language);
923
}
924
925
926
/**
927
 * Adds meta keywords and description for SEO.
928
 *
929
 * @since 1.0.0
930
 * @since 1.5.4 Modified to replace %location% from meta when Yoast SEO plugin active.
931
 * @package GeoDirectory
932
 * @global object $wpdb WordPress Database object.
933
 * @global object $post The current post object.
934
 * @global object $wp_query WordPress Query object.
935
 * @global array $geodir_addon_list List of active GeoDirectory extensions.
936
 */
937
function geodir_add_meta_keywords()
938
{
939 2
    global $wp, $post, $wp_query, $wpdb, $geodir_addon_list;
940
941 2
    $is_geodir_page = geodir_is_geodir_page();
942 2
    if (!$is_geodir_page) {
943 2
        return;
944
    }// if non GD page, bail
945
946
	$use_gd_meta = true;
947
	if (class_exists('WPSEO_Frontend') || class_exists('All_in_One_SEO_Pack')) {
948
		$use_gd_meta = false;
949
		
950
		if (geodir_is_page('search')) {
951
			$use_gd_meta = true;
952
		}
953
	}
954
	
955
	if (!$use_gd_meta) {
956
		return;
957
	}// bail if Yoast Wordpress SEO or All_in_One_SEO_Pack active.
958
959
    $current_term = $wp_query->get_queried_object();
960
961
    $all_postypes = geodir_get_posttypes();
962
963
    $geodir_taxonomies = geodir_get_taxonomies('', true);
964
965
    $meta_desc = '';
966
    $meta_key = '';
967
    if (isset($current_term->ID) && $current_term->ID == geodir_location_page_id()) {
968
        /**
969
         * Filter SEO meta location description.
970
         *
971
         * @since 1.0.0
972
         */
973
        $meta_desc = apply_filters('geodir_seo_meta_location_description', '');
974
        $meta_desc .= '';
975
    }
976
    if (have_posts() && is_single() OR is_page()) {
977
        while (have_posts()) {
978
            the_post();
979
980
            if (has_excerpt()) {
981
                $out_excerpt = strip_tags(strip_shortcodes(get_the_excerpt()));
982
                if (empty($out_excerpt)) {
983
                    $out_excerpt = strip_tags(do_shortcode(get_the_excerpt()));
984
                }
985
                $out_excerpt = str_replace(array("\r\n", "\r", "\n"), "", $out_excerpt);
986
            } else {
987
                $out_excerpt = str_replace(array("\r\n", "\r", "\n"), "", $post->post_content);
988
                $out_excerpt = strip_tags(strip_shortcodes($out_excerpt));
989
                if (empty($out_excerpt)) {
990
                    $out_excerpt = strip_tags(do_shortcode($out_excerpt)); // parse short code from content
991
                }
992
                $out_excerpt = trim(wp_trim_words($out_excerpt, 35, ''), '.!?,;:-');
993
            }
994
995
            $meta_desc .= $out_excerpt;
996
        }
997
    } elseif ((is_category() || is_tag()) && isset($current_term->taxonomy) && in_array($current_term->taxonomy, $geodir_taxonomies)) {
998
        if (is_category()) {
999
            $meta_desc .= __("Posts related to Category:", 'geodirectory') . " " . ucfirst(single_cat_title("", FALSE));
1000
        } elseif (is_tag()) {
1001
            $meta_desc .= __("Posts related to Tag:", 'geodirectory') . " " . ucfirst(single_tag_title("", FALSE));
1002
        }
1003
    } elseif (isset($current_term->taxonomy) && in_array($current_term->taxonomy, $geodir_taxonomies)) {
1004
        $meta_desc .= isset($current_term->description) ? $current_term->description : '';
1005
    }
1006
1007
1008
    $geodir_post_type = geodir_get_current_posttype();
1009
    $geodir_post_type_info = get_post_type_object($geodir_post_type);
1010
    $geodir_is_page_listing = geodir_is_page('listing') ? true : false;
1011
1012
    $category_taxonomy = geodir_get_taxonomies($geodir_post_type);
1013
    $tag_taxonomy = geodir_get_taxonomies($geodir_post_type, true);
1014
1015
    $geodir_is_category = isset($category_taxonomy[0]) && get_query_var($category_taxonomy[0]) ? get_query_var($category_taxonomy[0]) : false;
1016
    $geodir_is_tag = isset($tag_taxonomy[0]) && get_query_var($tag_taxonomy[0]) ? true : false;
1017
1018
    $geodir_is_search = geodir_is_page('search') ? true : false;
1019
    $geodir_is_location = geodir_is_page('location') ? true : false;
0 ignored issues
show
Unused Code introduced by
$geodir_is_location is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1020
    $geodir_location_manager = isset($geodir_addon_list['geodir_location_manager']) && $geodir_addon_list['geodir_location_manager'] = 'yes' ? true : false;
1021
    $godir_location_terms = geodir_get_current_location_terms('query_vars');
1022
    $gd_city = $geodir_location_manager && isset($godir_location_terms['gd_city']) ? $godir_location_terms['gd_city'] : NULL;
1023
    $gd_region = $geodir_location_manager && isset($godir_location_terms['gd_region']) ? $godir_location_terms['gd_region'] : NULL;
0 ignored issues
show
Unused Code introduced by
$gd_region is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1024
    $gd_country = $geodir_location_manager && isset($godir_location_terms['gd_country']) ? $godir_location_terms['gd_country'] : NULL;
0 ignored issues
show
Unused Code introduced by
$gd_country is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1025
    $replace_location = __('Everywhere', 'geodirectory');
1026
    $location_id = NULL;
1027
    if ($geodir_location_manager) {
1028
        $sql = $wpdb->prepare("SELECT location_id FROM " . POST_LOCATION_TABLE . " WHERE city_slug=%s ORDER BY location_id ASC LIMIT 1", array($gd_city));
1029
        $location_id = (int)$wpdb->get_var($sql);
1030
        $location_type = geodir_what_is_current_location();
1031
        if ($location_type == 'city') {
1032
            $replace_location = geodir_get_current_location(array('what' => 'city', 'echo' => false));
1033
        } elseif ($location_type == 'region') {
1034
            $replace_location = geodir_get_current_location(array('what' => 'region', 'echo' => false));
1035
        } elseif ($location_type == 'country') {
1036
            $replace_location = geodir_get_current_location(array('what' => 'country', 'echo' => false));
1037
            $replace_location = __($replace_location, 'geodirectory');
1038
        }
1039
        $country = get_query_var('gd_country');
1040
        $region = get_query_var('gd_region');
1041
        $city = get_query_var('gd_city');
1042
        $current_location = '';
1043
        if ($country != '') {
1044
            $current_location = get_actual_location_name('country', $country, true);
1045
        }
1046
        if ($region != '') {
1047
            $current_location = get_actual_location_name('region', $region);
1048
        }
1049
        if ($city != '') {
1050
            $current_location = get_actual_location_name('city', $city);
1051
        }
1052
        $replace_location = $current_location != '' ? $current_location : $replace_location;
1053
    }
1054
1055
    $geodir_meta_keys = '';
1056
    $geodir_meta_desc = '';
1057
    if ($is_geodir_page && !empty($geodir_post_type_info)) {
1058
        if ($geodir_is_page_listing || $geodir_is_search || geodir_is_page('add-listing')) {
1059
            $geodir_meta_keys = isset($geodir_post_type_info->seo['meta_keyword']) && $geodir_post_type_info->seo['meta_keyword'] != '' ? $geodir_post_type_info->seo['meta_keyword'] : $geodir_meta_keys;
1060
1061
            $geodir_meta_desc = isset($geodir_post_type_info->description) ? $geodir_post_type_info->description : $geodir_meta_desc;
1062
            $geodir_meta_desc = isset($geodir_post_type_info->seo['meta_description']) && $geodir_post_type_info->seo['meta_description'] != '' ? $geodir_post_type_info->seo['meta_description'] : $geodir_meta_desc;
1063
1064
            if ($geodir_is_category) {
1065
                $category = $geodir_is_category ? get_term_by('slug', $geodir_is_category, $category_taxonomy[0]) : NULL;
1066
                if (isset($category->term_id) && !empty($category->term_id)) {
1067
                    $category_id = $category->term_id;
1068
                    $category_desc = trim($category->description) != '' ? trim($category->description) : get_tax_meta($category_id, 'ct_cat_top_desc', false, $geodir_post_type);
1069
                    if ($location_id) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $location_id of type integer|null is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
1070
                        $option_name = 'geodir_cat_loc_' . $geodir_post_type . '_' . $category_id;
1071
                        $cat_loc_option = get_option($option_name);
1072
1073
                        $gd_cat_loc_default = !empty($cat_loc_option) && isset($cat_loc_option['gd_cat_loc_default']) && $cat_loc_option['gd_cat_loc_default'] > 0 ? true : false;
1074
                        if (!$gd_cat_loc_default) {
1075
                            $option_name = 'geodir_cat_loc_' . $geodir_post_type . '_' . $category_id . '_' . $location_id;
1076
                            $option = get_option($option_name);
1077
                            $category_desc = isset($option['gd_cat_loc_desc']) && trim($option['gd_cat_loc_desc']) != '' ? trim($option['gd_cat_loc_desc']) : $category_desc;
1078
                        }
1079
                    }
1080
                    $geodir_meta_desc = __("Posts related to Category:", 'geodirectory') . " " . ucfirst(single_cat_title("", FALSE)) . '. ' . $category_desc;
0 ignored issues
show
Unused Code introduced by
$geodir_meta_desc is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1081
                }
1082
            } else if ($geodir_is_tag) {
1083
                $geodir_meta_desc = __("Posts related to Tag:", 'geodirectory') . " " . ucfirst(single_tag_title("", FALSE)) . '. ' . $geodir_meta_desc;
0 ignored issues
show
Unused Code introduced by
$geodir_meta_desc is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1084
            }
1085
        }
1086
    }
1087
1088
1089
    $gd_page = '';
1090 View Code Duplication
    if(geodir_is_page('home')){
1091
        $gd_page = 'home';
1092
        $meta_desc = (get_option('geodir_meta_desc_homepage')) ? get_option('geodir_meta_desc_homepage') : $meta_desc;
1093
    }
1094
    elseif(geodir_is_page('detail')){
1095
        $gd_page = 'detail';
1096
        $meta_desc = (get_option('geodir_meta_desc_detail')) ? get_option('geodir_meta_desc_detail') : $meta_desc;
1097
    }
1098
    elseif(geodir_is_page('pt')){
1099
        $gd_page = 'pt';
1100
        $meta_desc = (get_option('geodir_meta_desc_pt')) ? get_option('geodir_meta_desc_pt') : $meta_desc;
1101
    }
1102
    elseif(geodir_is_page('listing')){
1103
        $gd_page = 'listing';
1104
        $meta_desc = (get_option('geodir_meta_desc_listing')) ? get_option('geodir_meta_desc_listing') : $meta_desc;
1105
    }
1106
    elseif(geodir_is_page('location')){
1107
        $gd_page = 'location';
1108
        $meta_desc = (get_option('geodir_meta_desc_location')) ? get_option('geodir_meta_desc_location') : $meta_desc;
1109
        $meta_desc = apply_filters('geodir_seo_meta_location_description', $meta_desc);
1110
1111
    }
1112
    elseif(geodir_is_page('search')){
1113
        $gd_page = 'search';
1114
        $meta_desc = (get_option('geodir_meta_desc_search')) ? get_option('geodir_meta_desc_search') : $meta_desc;
1115
    }
1116
    elseif(geodir_is_page('add-listing')){
1117
        $gd_page = 'add-listing';
1118
        $meta_desc = (get_option('geodir_meta_desc_add-listing')) ? get_option('geodir_meta_desc_add-listing') : $meta_desc;
1119
    }
1120
    elseif(geodir_is_page('author')){
1121
        $gd_page = 'author';
1122
        $meta_desc = (get_option('geodir_meta_desc_author')) ? get_option('geodir_meta_desc_author') : $meta_desc;
1123
    }
1124
    elseif(geodir_is_page('login')){
1125
        $gd_page = 'login';
1126
        $meta_desc = (get_option('geodir_meta_desc_login')) ? get_option('geodir_meta_desc_login') : $meta_desc;
1127
    }
1128
    elseif(geodir_is_page('listing-success')){
1129
        $gd_page = 'listing-success';
1130
        $meta_desc = (get_option('geodir_meta_desc_listing-success')) ? get_option('geodir_meta_desc_listing-success') : $meta_desc;
1131
    }
1132
1133
1134
    /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
52% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1135
    $geodir_meta_desc = $geodir_meta_desc != '' ? $geodir_meta_desc : $meta_desc;
1136
    if ($geodir_meta_desc != '') {
1137
        $geodir_meta_desc = strip_tags($geodir_meta_desc);
1138
        $geodir_meta_desc = esc_html($geodir_meta_desc);
1139
        $geodir_meta_desc = wp_html_excerpt($geodir_meta_desc, 1000, '.');
1140
        $geodir_meta_desc = isset($replace_location) ? str_replace('%location%', $replace_location, $geodir_meta_desc) : $geodir_meta_desc;
1141
1142
        $meta_desc = $geodir_meta_desc != '' ? $geodir_meta_desc : $meta_desc;
1143
    }
1144
    */
1145
1146
1147
    if ($meta_desc) {
1148
        $meta_desc = stripslashes_deep($meta_desc);
1149
        /**
1150
         * Filter page description to replace variables.
1151
         *
1152
         * @since 1.5.4
1153
         * @param string $title The page description including variables.
1154
         * @param string $gd_page The GeoDirectory page type if any.
1155
         */
1156
        $meta_desc = apply_filters('geodir_seo_meta_description_pre', __($meta_desc, 'geodirectory'),$gd_page,'');
1157
1158
        /**
1159
         * Filter SEO meta description.
1160
         *
1161
         * @since 1.0.0
1162
         * @param string $meta_desc Meta description content.
1163
         */
1164
        echo apply_filters('geodir_seo_meta_description', '<meta name="description" content="' . $meta_desc . '" />', $meta_desc);
1165
    }
1166
1167
    // meta keywords
1168
    if (isset($post->post_type) && in_array($post->post_type, $all_postypes)) {
1169
        $place_tags = wp_get_post_terms($post->ID, $post->post_type . '_tags', array("fields" => "names"));
1170
        $place_cats = wp_get_post_terms($post->ID, $post->post_type . 'category', array("fields" => "names"));
1171
1172
        $meta_key .= implode(", ", array_merge((array)$place_cats, (array)$place_tags));
1173
    } else {
1174
        $posttags = get_the_tags();
1175
        if ($posttags) {
1176
            foreach ($posttags as $tag) {
1177
                $meta_key .= $tag->name . ' ';
1178
            }
1179
        } else {
1180
            $tags = get_tags(array('orderby' => 'count', 'order' => 'DESC'));
1181
            $xt = 1;
1182
1183
            foreach ($tags as $tag) {
1184
                if ($xt <= 20) {
1185
                    $meta_key .= $tag->name . ", ";
1186
                }
1187
1188
                $xt++;
1189
            }
1190
        }
1191
    }
1192
1193
    $meta_key = $meta_key != '' ? rtrim(trim($meta_key), ",") : $meta_key;
1194
    $geodir_meta_keys = $geodir_meta_keys != '' ? ($meta_key != '' ? $meta_key . ', ' . $geodir_meta_keys : $geodir_meta_keys) : $meta_key;
1195
    if ($geodir_meta_keys != '') {
1196
        $geodir_meta_keys = strip_tags($geodir_meta_keys);
1197
        $geodir_meta_keys = esc_html($geodir_meta_keys);
1198
        $geodir_meta_keys = geodir_strtolower($geodir_meta_keys);
1199
        $geodir_meta_keys = wp_html_excerpt($geodir_meta_keys, 1000, '');
1200
        $geodir_meta_keys = str_replace('%location%', $replace_location, $geodir_meta_keys);
1201
1202
        $meta_key = rtrim(trim($geodir_meta_keys), ",");
1203
    }
1204
1205
    if ($meta_key) {
1206
        $meta_key = stripslashes_deep($meta_key);
1207
        /**
1208
         * Filter SEO meta keywords.
1209
         *
1210
         * @since 1.0.0
1211
         * @param string $meta_desc Meta keywords.
1212
         */
1213
        echo apply_filters('geodir_seo_meta_keywords', '<meta name="keywords" content="' . $meta_key . '" />', $meta_key);
1214
    }
1215
1216
}
1217
1218
/**
1219
 * Returns list of options available for "Detail page tab settings"
1220
 *
1221
 * Options will be populated here. WP Admin -> Geodirectory -> Design -> Detail -> Detail page tab settings -> Exclude selected tabs from detail page
1222
 *
1223
 * @since 1.0.0
1224
 * @package GeoDirectory
1225
 * @return array eturns list of options available as an array.
1226
 */
1227
function geodir_detail_page_tabs_key_value_array()
1228
{
1229
    $geodir_detail_page_tabs_key_value_array = array();
1230
1231
    $geodir_detail_page_tabs_array = geodir_detail_page_tabs_array();
1232
1233
    foreach ($geodir_detail_page_tabs_array as $key => $tabs_obj) {
1234
        $geodir_detail_page_tabs_key_value_array[$key] = $tabs_obj['heading_text'];
1235
    }
1236
    return $geodir_detail_page_tabs_key_value_array;
1237
}
1238
1239
/**
1240
 * Build and return the list of available tabs as an array.
1241
 *
1242
 * @since 1.0.0
1243
 * @package GeoDirectory
1244
 * @return mixed|array Tabs array.
1245
 */
1246
function geodir_detail_page_tabs_array()
1247
{
1248
1249 1
    $arr_tabs = array();
1250
    /**
1251
     * Filter detail page tab display.
1252
     *
1253
     * @since 1.0.0
1254
     */
1255 1
    $arr_tabs['post_profile'] = array(
1256 1
        'heading_text' => __('Profile', 'geodirectory'),
1257 1
        'is_active_tab' => true,
1258 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'post_profile'),
1259
        'tab_content' => ''
1260 1
    );
1261 1
    $arr_tabs['post_info'] = array(
1262 1
        'heading_text' => __('More Info', 'geodirectory'),
1263 1
        'is_active_tab' => false,
1264 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'post_info'),
1265
        'tab_content' => ''
1266 1
    );
1267
1268 1
    $arr_tabs['post_images'] = array(
1269 1
        'heading_text' => __('Photo', 'geodirectory'),
1270 1
        'is_active_tab' => false,
1271 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'post_images'),
1272
        'tab_content' => ''
1273 1
    );
1274
1275 1
    $arr_tabs['post_video'] = array(
1276 1
        'heading_text' => __('Video', 'geodirectory'),
1277 1
        'is_active_tab' => false,
1278 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'post_video'),
1279
        'tab_content' => ''
1280 1
    );
1281
1282 1
    $arr_tabs['special_offers'] = array(
1283 1
        'heading_text' => __('Special Offers', 'geodirectory'),
1284 1
        'is_active_tab' => false,
1285 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'special_offers'),
1286
        'tab_content' => ''
1287 1
    );
1288
1289 1
    $arr_tabs['post_map'] = array(
1290 1
        'heading_text' => __('Map', 'geodirectory'),
1291 1
        'is_active_tab' => false,
1292 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'post_map'),
1293
        'tab_content' => ''
1294 1
    );
1295
1296 1
    $arr_tabs['reviews'] = array(
1297 1
        'heading_text' => __('Reviews', 'geodirectory'),
1298 1
        'is_active_tab' => false,
1299 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'reviews'),
1300
        'tab_content' => 'review display'
1301 1
    );
1302
1303 1
    $arr_tabs['related_listing'] = array(
1304 1
        'heading_text' => __('Related Listing', 'geodirectory'),
1305 1
        'is_active_tab' => false,
1306 1
        'is_display' => apply_filters('geodir_detail_page_tab_is_display', true, 'related_listing'),
1307
        'tab_content' => ''
1308 1
    );
1309
1310
    /**
1311
     * Filter the tabs array.
1312
     *
1313
     * @since 1.0.0
1314
     */
1315 1
    return apply_filters('geodir_detail_page_tab_list_extend', $arr_tabs);
1316
1317
1318
}
1319
1320
1321
/**
1322
 * Returns the list of tabs available as an array.
1323
 *
1324
 * @since 1.0.0
1325
 * @package GeoDirectory
1326
 * @return mixed|array Tabs array.
1327
 */
1328
function geodir_detail_page_tabs_list()
1329
{
1330 1
    $tabs_excluded = get_option('geodir_detail_page_tabs_excluded');
1331 1
    $tabs_array = geodir_detail_page_tabs_array();
1332 1
    if (!empty($tabs_excluded)) {
1333 1
        foreach ($tabs_excluded as $tab) {
1334 1
            if (array_key_exists($tab, $tabs_array))
1335 1
                unset($tabs_array[$tab]);
1336 1
        }
1337 1
    }
1338 1
    return $tabs_array;
1339
}
1340
1341
1342
/**
1343
 * The main function responsible for displaying tabs in frontend detail page.
1344
 *
1345
 * @since 1.0.0
1346
 * @package GeoDirectory
1347
 * @global object $post The current post object.
1348
 * @global array $post_images List of images attached to the post.
1349
 * @global string $video The video embed content.
1350
 * @global string $special_offers Special offers content.
1351
 * @global string $related_listing Related listing html.
1352
 * @global string $geodir_post_detail_fields Detail field html.
1353
 */
1354
function geodir_show_detail_page_tabs()
1355
{
1356 1
    global $post, $post_images, $video, $special_offers, $related_listing, $geodir_post_detail_fields;
1357
1358 1
    $post_id = !empty($post) && isset($post->ID) ? (int)$post->ID : 0;
1359 1
    $request_post_id = !empty($_REQUEST['p']) ? (int)$_REQUEST['p'] : 0;
1360 1
    $is_backend_preview = (is_single() && !empty($_REQUEST['post_type']) && !empty($_REQUEST['preview']) && !empty($_REQUEST['p'])) && is_super_admin() ? true : false; // skip if preview from backend
1361
1362 1
    if ($is_backend_preview && !$post_id > 0 && $request_post_id > 0) {
1363
        $post = geodir_get_post_info($request_post_id);
1364
        setup_postdata($post);
1365
    }
1366
1367 1
    $geodir_post_detail_fields = geodir_show_listing_info('detail');
1368
1369 1
    if (geodir_is_page('detail')) {
1370 1
        $video = geodir_get_video($post->ID);
1371 1
        $special_offers = geodir_get_special_offers($post->ID);
1372 1
        $related_listing_array = array();
1373 1
        if (get_option('geodir_add_related_listing_posttypes'))
1374 1
            $related_listing_array = get_option('geodir_add_related_listing_posttypes');
1375
1376 1
        $related_listing = '';
1377 1
        if (in_array($post->post_type, $related_listing_array)) {
1378 1
            $request = array('post_number' => get_option('geodir_related_post_count'),
1379 1
                'relate_to' => get_option('geodir_related_post_relate_to'),
1380 1
                'layout' => get_option('geodir_related_post_listing_view'),
1381 1
                'add_location_filter' => get_option('geodir_related_post_location_filter'),
1382 1
                'list_sort' => get_option('geodir_related_post_sortby'),
1383 1
                'character_count' => get_option('geodir_related_post_excerpt'));
1384
1385 1
            $related_listing = geodir_related_posts_display($request);
1386 1
        }
1387
1388 1
        $post_images = geodir_get_images($post->ID, 'thumbnail');
1389 1
        $thumb_image = '';
1390 1
        if (!empty($post_images)) {
1391 1
            foreach ($post_images as $image) {
0 ignored issues
show
Bug introduced by
The expression $post_images of type array|boolean is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
1392 1
                $caption = (!empty($image->caption)) ? $image->caption : '';
1393 1
                $thumb_image .= '<a href="' . $image->src . '" title="'.$caption.'">';
1394 1
                $thumb_image .= geodir_show_image($image, 'thumbnail', true, false);
1395 1
                $thumb_image .= '</a>';
1396 1
            }
1397 1
        }
1398
1399 1
        $map_args = array();
1400 1
        $map_args['map_canvas_name'] = 'detail_page_map_canvas';
1401 1
        $map_args['width'] = '600';
1402 1
        $map_args['height'] = '300';
1403 1
        if ($post->post_mapzoom) {
1404
            $map_args['zoom'] = '' . $post->post_mapzoom . '';
1405
        }
1406 1
        $map_args['autozoom'] = false;
1407 1
        $map_args['child_collapse'] = '0';
1408 1
        $map_args['enable_cat_filters'] = false;
1409 1
        $map_args['enable_text_search'] = false;
1410 1
        $map_args['enable_post_type_filters'] = false;
1411 1
        $map_args['enable_location_filters'] = false;
1412 1
        $map_args['enable_jason_on_load'] = true;
1413 1
        $map_args['enable_map_direction'] = true;
1414 1
        $map_args['map_class_name'] = 'geodir-map-detail-page';
1415 1
        $map_args['maptype'] = (!empty($post->post_mapview)) ? $post->post_mapview : 'ROADMAP';
1416 1
    } else if (geodir_is_page('preview')) {
1417
        $video = isset($post->geodir_video) ? $post->geodir_video : '';
1418
        $special_offers = isset($post->geodir_special_offers) ? $post->geodir_special_offers : '';
1419
1420
        if (isset($post->post_images))
1421
            $post->post_images = trim($post->post_images, ",");
1422
1423
        if (isset($post->post_images) && !empty($post->post_images))
1424
            $post_images = explode(",", $post->post_images);
1425
1426
        $thumb_image = '';
1427
        if (!empty($post_images)) {
1428
            foreach ($post_images as $image) {
1429
                if ($image != '') {
1430
                    $thumb_image .= '<a href="' . $image . '">';
1431
                    $thumb_image .= geodir_show_image(array('src' => $image), 'thumbnail', true, false);
1432
                    $thumb_image .= '</a>';
1433
                }
1434
            }
1435
        }
1436
1437
        global $map_jason;
1438
        $map_jason[] = $post->marker_json;
1439
1440
        $address_latitude = isset($post->post_latitude) ? $post->post_latitude : '';
1441
        $address_longitude = isset($post->post_longitude) ? $post->post_longitude : '';
1442
        $mapview = isset($post->post_mapview) ? $post->post_mapview : '';
1443
        $mapzoom = isset($post->post_mapzoom) ? $post->post_mapzoom : '';
1444
        if (!$mapzoom) {
1445
            $mapzoom = 12;
1446
        }
1447
1448
        $map_args = array();
1449
        $map_args['map_canvas_name'] = 'preview_map_canvas';
1450
        $map_args['width'] = '950';
1451
        $map_args['height'] = '300';
1452
        $map_args['child_collapse'] = '0';
1453
        $map_args['maptype'] = $mapview;
1454
        $map_args['autozoom'] = false;
1455
        $map_args['zoom'] = "$mapzoom";
1456
        $map_args['latitude'] = $address_latitude;
1457
        $map_args['longitude'] = $address_longitude;
1458
        $map_args['enable_cat_filters'] = false;
1459
        $map_args['enable_text_search'] = false;
1460
        $map_args['enable_post_type_filters'] = false;
1461
        $map_args['enable_location_filters'] = false;
1462
        $map_args['enable_jason_on_load'] = true;
1463
        $map_args['enable_map_direction'] = true;
1464
        $map_args['map_class_name'] = 'geodir-map-preview-page';
1465
    }
1466
1467 1
    $arr_detail_page_tabs = geodir_detail_page_tabs_list();// get this sooner so we can get the active tab for the user
1468
1469 1
    $active_tab = '';
1470 1
    $active_tab_name = '';
1471 1
    $default_tab = '';
1472 1
    $default_tab_name = '';
1473 1
    foreach($arr_detail_page_tabs as $tab_index => $tabs){
1474 1
        if (isset($tabs['is_active_tab']) && $tabs['is_active_tab'] && !empty($tabs['is_display']) && isset($tabs['heading_text']) && $tabs['heading_text']) {
1475 1
            $active_tab = $tab_index;
1476 1
            $active_tab_name = __($tabs['heading_text'], 'geodirectory');
1477 1
        }
1478
        
1479 1
        if ($default_tab === '' && !empty($tabs['is_display']) && !empty($tabs['heading_text'])) {
1480 1
            $default_tab = $tab_index;
1481 1
            $default_tab_name = __($tabs['heading_text'], 'geodirectory');
1482 1
        }
1483 1
    }
1484
    
1485 1
    if ($active_tab === '' && $default_tab !== '') { // Make first tab acs a active tab if not any tab is active.
1486
        if (isset($arr_detail_page_tabs[$active_tab]) && isset($arr_detail_page_tabs[$active_tab]['is_active_tab'])) {
1487
            $arr_detail_page_tabs[$active_tab]['is_active_tab'] = false;
1488
        }
1489
        
1490
        $arr_detail_page_tabs[$default_tab]['is_active_tab'] = true;
1491
        $active_tab = $default_tab;
0 ignored issues
show
Unused Code introduced by
$active_tab is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1492
        $active_tab_name = $default_tab_name;
1493
    }
1494
    ?>
1495
    <div class="geodir-tabs" id="gd-tabs" style="position:relative;">
1496
        <div id="geodir-tab-mobile-menu" >
1497
            <i class="fa fa-bars"></i>
1498
            <span class="geodir-mobile-active-tab"><?php echo $active_tab_name;?></span>
1499
            <i class="fa fa-sort-desc"></i>
1500
        </div>
1501
        <dl class="geodir-tab-head">
1502
            <?php
1503
            /**
1504
             * Called before the details page tab list headings, inside the `dl` tag.
1505
             *
1506
             * @since 1.0.0
1507
             * @see 'geodir_after_tab_list'
1508
             */
1509
            do_action('geodir_before_tab_list'); ?>
1510
            <?php
1511 1
            foreach ($arr_detail_page_tabs as $tab_index => $detail_page_tab) {
1512 1
                if ($detail_page_tab['is_display']) {
1513
                    ?>
1514
                    <dt></dt> <!-- added to comply with validation -->
1515
                    <dd <?php if ($detail_page_tab['is_active_tab']){ ?>class="geodir-tab-active"<?php }?> ><a data-tab="#<?php echo $tab_index;?>" data-status="enable"><?php _e($detail_page_tab['heading_text'],'geodirectory');?></a>
1516
                    </dd>
1517
                    <?php
1518 1
                    ob_start() // start tab content buffering
1519
                    ?>
1520
                    <li id="<?php echo $tab_index;?>Tab">
1521
                        <div id="<?php echo $tab_index;?>" class="hash-offset"></div>
1522
                        <?php
1523
                        /**
1524
                         * Called before the details tab content is output per tab.
1525
                         *
1526
                         * @since 1.0.0
1527
                         * @param string $tab_index The tab name ID.
1528
                         */
1529 1
                        do_action('geodir_before_tab_content', $tab_index);
1530
1531
                        /**
1532
                         * Called before the details tab content is output per tab.
1533
                         *
1534
                         * Uses dynamic hook name: geodir_before_$tab_index_tab_content
1535
                         *
1536
                         * @since 1.0.0
1537
                         * @todo do we need this if we have the hook above? 'geodir_before_tab_content'
1538
                         */
1539 1
                        do_action('geodir_before_' . $tab_index . '_tab_content');
1540
                        /// write a code to generate content of each tab
1541
                        switch ($tab_index) {
1542 1
                            case 'post_profile':
1543
                                /**
1544
                                 * Called before the listing description content on the details page tab.
1545
                                 *
1546
                                 * @since 1.0.0
1547
                                 */
1548 1
                                do_action('geodir_before_description_on_listing_detail');
1549 1
                                if (geodir_is_page('detail')) {
1550 1
                                    the_content();
1551 1
                                } else {
1552
                                    /** This action is documented in geodirectory_template_actions.php */
1553
                                    echo apply_filters('the_content', stripslashes($post->post_desc));
1554
                                }
1555
1556
                                /**
1557
                                 * Called after the listing description content on the details page tab.
1558
                                 *
1559
                                 * @since 1.0.0
1560
                                 */
1561 1
                                do_action('geodir_after_description_on_listing_detail');
1562 1
                                break;
1563 1
                            case 'post_info':
1564
                                echo $geodir_post_detail_fields;
1565
                                break;
1566 1
                            case 'post_images':
1567 1
                                echo $thumb_image;
0 ignored issues
show
Bug introduced by
The variable $thumb_image does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1568 1
                                break;
1569 1
                            case 'post_video':
1570
                                /** This action is documented in geodirectory_template_actions.php */
1571
                                echo apply_filters('the_content', stripslashes($video));// we apply the_content filter so oembed works also;
1572
                                break;
1573 1
                            case 'special_offers':
1574
                                echo wpautop(stripslashes($special_offers));
1575
1576
                                break;
1577 1
                            case 'post_map':
1578 1
                                geodir_draw_map($map_args);
0 ignored issues
show
Bug introduced by
The variable $map_args does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1579 1
                                break;
1580 1
                            case 'reviews':
1581 1
                                comments_template();
1582 1
                                break;
1583
                            case 'related_listing':
1584
                                echo $related_listing;
1585
                                break;
1586
                            default: {
1587
                                if ((isset($post->{$tab_index}) || (!isset($post->{$tab_index}) && (strpos($tab_index, 'gd_tab_') !== false || $tab_index == 'link_business'))) && !empty($detail_page_tab['tab_content'])) {
1588
                                    echo $detail_page_tab['tab_content'];
1589
                                }
1590
                            }
1591
                                break;
1592
                        }
1593
1594
                        /**
1595
                         * Called after the details tab content is output per tab.
1596
                         *
1597
                         * @since 1.0.0
1598
                         */
1599 1
                        do_action('geodir_after_tab_content', $tab_index);
1600
1601
                        /**
1602
                         * Called after the details tab content is output per tab.
1603
                         *
1604
                         * Uses dynamic hook name: geodir_after_$tab_index_tab_content
1605
                         *
1606
                         * @since 1.0.0
1607
                         * @todo do we need this if we have the hook above? 'geodir_after_tab_content'
1608
                         */
1609 1
                        do_action('geodir_after_' . $tab_index . '_tab_content');
1610
                        ?> </li>
1611
                    <?php
1612
                    /**
1613
                     * Filter the current tab content.
1614
                     *
1615
                     * @since 1.0.0
1616
                     */
1617 1
                    $arr_detail_page_tabs[$tab_index]['tab_content'] = apply_filters("geodir_modify_" . $detail_page_tab['tab_content'] . "_tab_content", ob_get_clean());
1618 1
                } // end of if for is_display
1619 1
            }// end of foreach
1620
1621
            /**
1622
             * Called after the details page tab list headings, inside the `dl` tag.
1623
             *
1624
             * @since 1.0.0
1625
             * @see 'geodir_before_tab_list'
1626
             */
1627 1
            do_action('geodir_after_tab_list');
1628
            ?>
1629
        </dl>
1630
        <ul class="geodir-tabs-content entry-content" style="position:relative;">
1631
            <?php
1632 1
            foreach ($arr_detail_page_tabs as $detail_page_tab) {
1633 1
                if ($detail_page_tab['is_display'] && !empty($detail_page_tab['tab_content'])) {
1634 1
                    echo $detail_page_tab['tab_content'];
1635 1
                }// end of if
1636 1
            }// end of foreach
1637
1638
            /**
1639
             * Called after all the tab content is output in `li` tags, called before the closing `ul` tag.
1640
             *
1641
             * @since 1.0.0
1642
             */
1643
            do_action('geodir_add_tab_content'); ?>
1644
        </ul>
1645
        <!--gd-tabs-content ul end-->
1646
    </div>
1647
    <script>
1648
        if (window.location.hash && window.location.hash.indexOf('&') === -1 && jQuery(window.location.hash + 'Tab').length) {
1649
            hashVal = window.location.hash;
1650
        } else {
1651
            hashVal = jQuery('dl.geodir-tab-head dd.geodir-tab-active').find('a').attr('data-tab');
1652
        }
1653
        jQuery('dl.geodir-tab-head dd').each(function () {
1654
            //Get all tabs
1655
            var tabs = jQuery(this).children('dd');
1656
            var tab = '';
1657
            tab = jQuery(this).find('a').attr('data-tab');
1658
            if (hashVal != tab) {
1659
                jQuery(tab + 'Tab').hide();
1660
            }
1661
1662
        });
1663
    </script>
1664
1665
<?php
1666
1667 1
}
1668
1669
1670
/**
1671
 * Fixes image orientation.
1672
 *
1673
 * @since 1.0.0
1674
 * @package GeoDirectory
1675
 * @param array $file The image file.
1676
 * @return mixed Image file.
1677
 */
1678
function geodir_exif($file)
1679
{
1680
    if (empty($file) || !is_array($file)) {
1681
        return $file;
1682
    }
1683
    
1684
    $file_path = !empty($file['tmp_name']) ? sanitize_text_field($file['tmp_name']) : '';
1685
    if (!($file_path && file_exists($file_path))) {
1686
        return $file;
1687
    }
1688
    $file['file'] = $file_path;
1689
    
1690
    if (!file_is_valid_image($file_path)) {
1691
        return $file; // Bail if file is not an image.
1692
    }
1693
    
1694
    if (!function_exists('wp_get_image_editor')) {
1695
        return $file;
1696
    }
1697
   
1698
    $mime_type = $file['type'];
1699
    $exif = array();
1700
    if ($mime_type == 'image/jpeg' && function_exists('exif_read_data')) {
1701
        try {
1702
            $exif = exif_read_data($file_path);
1703
        } catch(Exception $e) {
1704
            $exif = array();
1705
        }
1706
    }
1707
    
1708
    $rotate = false;
1709
    $flip = false;
1710
    $modify = false;
1711
    $orientation = 0;
1712
    if (!empty($exif) && isset($exif['Orientation'])) {
1713
        switch ((int)$exif['Orientation']) {
1714
            case 1:
1715
                // do nothing
1716
                break;
1717 View Code Duplication
            case 2:
1718
                $flip = array(false, true);
1719
                $modify = true;
1720
                break;
1721
            case 3:
1722
                $orientation = -180;
1723
                $rotate = true;
1724
                $modify = true;
1725
                break;
1726 View Code Duplication
            case 4:
1727
                $flip = array(true, false);
1728
                $modify = true;
1729
                break;
1730 View Code Duplication
            case 5:
1731
                $orientation = -90;
1732
                $rotate = true;
1733
                $flip = array(false, true);
1734
                $modify = true;
1735
                break;
1736
            case 6:
1737
                $orientation = -90;
1738
                $rotate = true;
1739
                $modify = true;
1740
                break;
1741 View Code Duplication
            case 7:
1742
                $orientation = -270;
1743
                $rotate = true;
1744
                $flip = array(false, true);
1745
                $modify = true;
1746
                break;
1747
            case 8:
1748
            case 9:
1749
                $orientation = -270;
1750
                $rotate = true;
1751
                $modify = true;
1752
                break;
1753
            default:
1754
                $orientation = 0;
1755
                $rotate = true;
1756
                $modify = true;
1757
                break;
1758
        }
1759
    }
1760
    
1761
    $quality = null;
1762
    /**
1763
     * Filter the image quality.
1764
     *
1765
     * @since 1.5.7
1766
     * @param int|null $quality Image Compression quality between 1-100% scale. Default null.
1767
     * @param string $quality Image mime type.
1768
     */
1769
    $quality = apply_filters('geodir_image_upload_set_quality', $quality, $mime_type);
1770
    if ($quality !== null) {
1771
        $modify = true;
1772
    }
1773
1774
    if (!$modify) {
1775
        return $file; // no change
1776
    }
1777
1778
    $image = wp_get_image_editor($file_path);
1779
    if (!is_wp_error($image)) {
1780
        if ($rotate) {
1781
            $image->rotate($orientation);
1782
        }
1783
        
1784
        if (!empty($flip)) {
1785
            $image->flip($flip[0], $flip[1]);
1786
        }
1787
        
1788
        if ($quality !== null) {
1789
            $image->set_quality((int)$quality);
1790
        }
1791
        
1792
       $result = $image->save($file_path);
1793
       if (!is_wp_error($result)) {
1794
           $file['file'] = $result['path'];
1795
           $file['tmp_name'] = $result['path'];
1796
       }
1797
    }
1798
    
1799
    // The image orientation is fixed, pass it back for further processing
1800
    return $file;
1801
}
1802
1803
/**
1804
 * Returns the recent reviews.
1805
 *
1806
 * @since 1.0.0
1807
 * @package GeoDirectory
1808
 *
1809
 * @global object $wpdb WordPress Database object.
1810
 * @global object $gd_session GeoDirectory Session object.
1811
 *
1812
 * @param int $g_size Optional. Avatar size in pixels. Default 60.
1813
 * @param int $no_comments Optional. Number of reviews you want to display. Default: 10.
1814
 * @param int $comment_lenth Optional. Maximum number of characters you want to display. After that read more link will appear.
1815
 * @param bool $show_pass_post Optional. Not yet implemented.
1816
 * @return string Returns the recent reviews html.
1817
 */
1818
function geodir_get_recent_reviews($g_size = 60, $no_comments = 10, $comment_lenth = 60, $show_pass_post = false) {
0 ignored issues
show
Unused Code introduced by
The parameter $show_pass_post is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1819 2
    global $wpdb, $tablecomments, $tableposts, $rating_table_name, $gd_session;
1820 2
    $tablecomments = $wpdb->comments;
1821 2
    $tableposts = $wpdb->posts;
1822
1823 2
    $comments_echo = '';
1824 2
    $city_filter = '';
1825 2
    $region_filter = '';
1826 2
    $country_filter = '';
1827
1828 2
    if ($gd_session->get('gd_multi_location')) {
1829
        if ($gd_ses_country = $gd_session->get('gd_country')) {
1830
            $country_filter = $wpdb->prepare(" AND r.post_country=%s ", str_replace("-", " ", $gd_ses_country));
1831
        }
1832
1833
        if ($gd_ses_region = $gd_session->get('gd_region')) {
1834
            $region_filter = $wpdb->prepare(" AND r.post_region=%s ", str_replace("-", " ", $gd_ses_region));
1835
        }
1836
1837
        if ($gd_ses_city = $gd_session->get('gd_city')) {
1838
            $city_filter = $wpdb->prepare(" AND r.post_city=%s ", str_replace("-", " ", $gd_ses_city));
1839
        }
1840
    }
1841
	
1842 2
    $review_table = GEODIR_REVIEW_TABLE;
1843 2
    $request = "SELECT r.id as ID, r.post_type, r.comment_id as comment_ID, r.post_date as comment_date,r.overall_rating, r.user_id, r.post_id FROM $review_table as r WHERE r.post_status = 1 AND r.status =1 AND r.overall_rating>=1 $country_filter $region_filter $city_filter ORDER BY r.post_date DESC, r.id DESC LIMIT $no_comments";
1844
1845 2
    $comments = $wpdb->get_results($request);
1846
1847 2
    foreach ($comments as $comment) {
1848
        // Set the extra comment info needed.
1849 2
        $comment_extra = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID =$comment->comment_ID");
1850
        //echo "SELECT * FROM $wpdb->comments WHERE comment_ID =$comment->comment_ID";
1851 2
        $comment->comment_content = $comment_extra->comment_content;
1852 2
        $comment->comment_author = $comment_extra->comment_author;
1853 2
        $comment->comment_author_email = $comment_extra->comment_author_email;
1854
1855 2
        $comment_id = '';
0 ignored issues
show
Unused Code introduced by
$comment_id is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1856 2
        $comment_id = $comment->comment_ID;
1857 2
        $comment_content = strip_tags($comment->comment_content);
1858
1859 2
        $comment_content = preg_replace('#(\\[img\\]).+(\\[\\/img\\])#', '', $comment_content);
1860
1861 2
        $permalink = get_permalink($comment->ID) . "#comment-" . $comment->comment_ID;
0 ignored issues
show
Unused Code introduced by
$permalink is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1862 2
        $comment_author_email = $comment->comment_author_email;
0 ignored issues
show
Unused Code introduced by
$comment_author_email is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1863 2
        $comment_post_ID = $comment->post_id;
1864
1865 2
        $na = true;
1866 2
        if (function_exists('icl_object_id') && icl_object_id($comment_post_ID, $comment->post_type, true)) {
1867
            $comment_post_ID2 = icl_object_id($comment_post_ID, $comment->post_type, false);
1868
            if ($comment_post_ID == $comment_post_ID2) {
1869
            } else {
1870
                $na = false;
1871
            }
1872
        }
1873
1874 2
        $post_title = get_the_title($comment_post_ID);
1875 2
        $permalink = get_permalink($comment_post_ID);
1876 2
        $comment_permalink = $permalink . "#comment-" . $comment->comment_ID;
1877 2
        $read_more = '<a class="comment_excerpt" href="' . $comment_permalink . '">' . __('Read more', 'geodirectory') . '</a>';
1878
1879 2
        $comment_content_length = strlen($comment_content);
1880 2
        if ($comment_content_length > $comment_lenth) {
1881
            $comment_excerpt = mb_substr($comment_content, 0, $comment_lenth) . '... ' . $read_more;
1882
        } else {
1883 2
            $comment_excerpt = $comment_content;
1884
        }
1885
1886 2
        if ($comment->user_id) {
1887 2
            $user_profile_url = get_author_posts_url($comment->user_id);
1888 2
        } else {
1889
            $user_profile_url = '';
1890
        }
1891
1892 2
        if ($comment_id && $na) {
1893 2
            $comments_echo .= '<li class="clearfix">';
1894 2
            $comments_echo .= "<span class=\"li" . $comment_id . " geodir_reviewer_image\">";
1895 2
            if (function_exists('get_avatar')) {
1896 2
                if (!isset($comment->comment_type)) {
1897 2
                    if ($user_profile_url) {
1898 2
                        $comments_echo .= '<a href="' . $user_profile_url . '">';
1899 2
                    }
1900 2
                    $comments_echo .= get_avatar($comment->comment_author_email, $g_size, geodir_plugin_url() . '/geodirectory-assets/images/gravatar2.png');
1901 2
                    if ($user_profile_url) {
1902 2
                        $comments_echo .= '</a>';
1903 2
                    }
1904 2
                } elseif ((isset($comment->comment_type) && $comment->comment_type == 'trackback') || (isset($comment->comment_type) && $comment->comment_type == 'pingback')) {
1905
                    if ($user_profile_url) {
1906
                        $comments_echo .= '<a href="' . $user_profile_url . '">';
1907
                    }
1908
                    $comments_echo .= get_avatar($comment->comment_author_url, $g_size, geodir_plugin_url() . '/geodirectory-assets/images/gravatar2.png');
1909
                }
1910 2
            } elseif (function_exists('gravatar')) {
1911
                if ($user_profile_url) {
1912
                    $comments_echo .= '<a href="' . $user_profile_url . '">';
1913
                }
1914
                $comments_echo .= "<img src=\"";
1915
                if ('' == $comment->comment_type) {
1916
                    $comments_echo .= gravatar($comment->comment_author_email, $g_size, geodir_plugin_url() . '/geodirectory-assets/images/gravatar2.png');
1917
                    if ($user_profile_url) {
1918
                        $comments_echo .= '</a>';
1919
                    }
1920
                } elseif (('trackback' == $comment->comment_type) || ('pingback' == $comment->comment_type)) {
1921
                    if ($user_profile_url) {
1922
                        $comments_echo .= '<a href="' . $user_profile_url . '">';
1923
                    }
1924
                    $comments_echo .= gravatar($comment->comment_author_url, $g_size, geodir_plugin_url() . '/geodirectory-assets/images/gravatar2.png');
1925
                    if ($user_profile_url) {
1926
                        $comments_echo .= '</a>';
1927
                    }
1928
                }
1929
                $comments_echo .= "\" alt=\"\" class=\"avatar\" />";
1930
            }
1931
1932 2
            $comments_echo .= "</span>\n";
1933
1934 2
            $comments_echo .= '<span class="geodir_reviewer_content">';
1935 2
            if($comment->user_id){$comments_echo .= '<a href="'.get_author_posts_url( $comment->user_id ).'">';}
1936 2
            $comments_echo .= '<span class="geodir_reviewer_author">' . $comment->comment_author . '</span> ';
1937 2
            if($comment->user_id){$comments_echo .= '</a>';}
1938 2
            $comments_echo .= '<span class="geodir_reviewer_reviewed">' . __('reviewed', 'geodirectory') . '</span> ';
1939 2
            $comments_echo .= '<a href="' . $permalink . '" class="geodir_reviewer_title">' . $post_title . '</a>';
1940 2
            $comments_echo .= geodir_get_rating_stars($comment->overall_rating, $comment_post_ID);
1941 2
            $comments_echo .= '<p class="geodir_reviewer_text">' . $comment_excerpt . '';
1942
            //echo preg_replace('#(\\[img\\]).+(\\[\\/img\\])#', '', $comment_excerpt);
0 ignored issues
show
Unused Code Comprehensibility introduced by
70% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1943 2
            $comments_echo .= '</p>';
1944
1945 2
            $comments_echo .= "</span>\n";
1946 2
            $comments_echo .= '</li>';
1947 2
        }
1948 2
    }
1949
1950 2
    return $comments_echo;
1951
}
1952
1953
/**
1954
 * Returns All post categories from all GD post types.
1955
 *
1956
 * @since 1.0.0
1957
 * @package GeoDirectory
1958
 * @return array Returns post categories as an array.
1959
 */
1960
function geodir_home_map_cats_key_value_array()
1961
{
1962
    $post_types = geodir_get_posttypes('object');
1963
1964
    $return = array();
1965
    if (!empty($post_types)) {
1966
        foreach ($post_types as $key => $post_type) {
0 ignored issues
show
Bug introduced by
The expression $post_types of type array|object|string is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
1967
            $cpt_name = __($post_type->labels->singular_name, 'geodirectory');
1968
            $post_type_name =   sprintf(__('%s Categories', 'geodirectory'),$cpt_name);
1969
            $taxonomies = geodir_get_taxonomies($key);
1970
            $cat_taxonomy = !empty($taxonomies[0]) ? $taxonomies[0] : NULL;
1971
            $cat_terms = $cat_taxonomy ? get_terms($cat_taxonomy) : NULL;
1972
1973
            if (!empty($cat_terms)) {
1974
                $return['optgroup_start-' . $key] = $post_type_name;
1975
1976
                foreach ($cat_terms as $cat_term) {
1977
                    $return[$key . '_' . $cat_term->term_id] = $cat_term->name;
1978
                }
1979
1980
                $return['optgroup_end-' . $key] = $post_type_name;
1981
            }
1982
        }
1983
    }
1984
    return $return;
1985
}
1986
1987
/**
1988
 * "Twitter tweet" button code.
1989
 *
1990
 * To display "Twitter tweet" button, you can call this function.
1991
 * @since 1.0.0
1992
 * @package GeoDirectory
1993
 */
1994
function geodir_twitter_tweet_button()
1995
{
1996
    ?>
1997
    <a href="http://twitter.com/share"
1998
       class="twitter-share-button"><?php _e('Tweet', 'geodirectory'); ?></a>
1999
    <script type="text/javascript" src="//platform.twitter.com/widgets.js"></script>
2000
<?php
2001 1
}
2002
2003
/**
2004
 * "Facebook like" button code.
2005
 *
2006
 * To display "Facebook like" button, you can call this function.
2007
 *
2008
 * @since 1.0.0
2009
 * @package GeoDirectory
2010
 * @global object $post The current post object.
2011
 */
2012
function geodir_fb_like_button()
2013
{
2014 1
    global $post;
2015
    ?>
2016 View Code Duplication
    <iframe <?php if (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)) {
2017
        echo 'allowtransparency="true"';
2018
    } ?> class="facebook"
2019
         src="//www.facebook.com/plugins/like.php?href=<?php echo urlencode(get_permalink($post->ID)); ?>&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light"
2020
         style="border:none; overflow:hidden; width:100px; height:20px"></iframe>
2021
<?php
2022 1
}
2023
2024
/**
2025
 * "Google Plus" share button code.
2026
 *
2027
 * To display "Google Plus" share button, you can call this function.
2028
 *
2029
 * @since 1.0.0
2030
 * @package GeoDirectory
2031
 */
2032
function geodir_google_plus_button()
2033
{
2034
    ?>
2035
    <div id="plusone-div" class="g-plusone" data-size="medium"></div>
2036
    <script type="text/javascript">
2037
        (function () {
2038
            var po = document.createElement('script');
2039
            po.type = 'text/javascript';
2040
            po.async = true;
2041
            po.src = 'https://apis.google.com/js/platform.js';
2042
            var s = document.getElementsByTagName('script')[0];
2043
            s.parentNode.insertBefore(po, s);
2044
        })();
2045
    </script>
2046
<?php
2047 1
}
2048
2049
/**
2050
 * "Share this" button code.
2051
 *
2052
 * To display "share this" button, you can call this function.
2053
 *
2054
 * @since 1.0.0
2055
 * @package GeoDirectory
2056
 * @global object $post The current post object.
2057
 */
2058
function geodir_share_this_button_code()
2059
{
2060 1
    global $post;
2061
    ?>
2062
    <div class="addthis_toolbox addthis_default_style">
2063
        <span id='st_sharethis'></span>
2064
        <script type="text/javascript">var switchTo5x = false;</script>
2065
        <script type="text/javascript" src="//ws.sharethis.com/button/buttons.js"></script>
2066
        <script type="text/javascript">stLight.options({
2067
                publisher: "2bee0c38-7c7d-4ce7-9d9a-05e920d509b4",
2068
                doNotHash: false,
2069
                doNotCopy: false,
2070
                hashAddressBar: false
2071
            });
2072
            stWidget.addEntry({
2073
                "service": "sharethis",
2074
                "element": document.getElementById('st_sharethis'),
2075
                "url": "<?php echo geodir_curPageURL();?>",
2076
                "title": "<?php echo $post->post_title;?>",
2077
                "type": "chicklet",
2078
                "text": "<?php _e( 'Share', 'geodirectory' );?>"
2079
            });</script>
2080
2081
    </div>
2082
<?php
2083 1
}
2084
2085
2086
function geodir_listing_bounce_map_pin_on_hover(){
2087
2088 9
    if(get_option('geodir_listing_hover_bounce_map_pin',true)) {
2089
            ?>
2090
            <script>
2091
                jQuery(function ($) {
2092
                    if (typeof(animate_marker) == 'function') {
2093
                        var groupTab = $("ul.geodir_category_list_view").children("li");
2094
                        groupTab.hover(function () {
2095
                            animate_marker('listing_map_canvas', String($(this).data("post-id")));
2096
                        }, function () {
2097
                            stop_marker_animation('listing_map_canvas', String($(this).data("post-id")));
2098
2099
                        });
2100
                    }
2101
                });
2102
            </script>
2103
2104
        <?php
2105
2106 9
    }
2107 9
}
2108
add_action('geodir_after_listing_listview','geodir_listing_bounce_map_pin_on_hover',10);
2109
2110
add_action('geodir_after_favorite_html','geodir_output_favourite_html_listings',1,1);
2111
2112
function geodir_output_favourite_html_listings( $post_id){
2113 8
    geodir_favourite_html('', $post_id);
2114 8
}
2115
2116
2117
add_action( 'geodir_listing_after_pinpoint', 'geodir_output_pinpoint_html_listings',1,2 );
2118
2119
function geodir_output_pinpoint_html_listings( $post_id, $post){
0 ignored issues
show
Unused Code introduced by
The parameter $post_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
2120 3
    global $wp_query;
2121
2122 3
    $show_pin_point = $wp_query->is_main_query();
2123 3
    if (!empty($show_pin_point) && is_active_widget(false, "", "geodir_map_v3_listing_map")) {
2124
2125
        /*if($json_info = json_decode($post->marker_json))
0 ignored issues
show
Unused Code Comprehensibility introduced by
55% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
2126
            $marker_icon = $json_info->icon;*/
2127
2128 1
        $term_icon_url = get_tax_meta($post->default_category, 'ct_cat_icon', false, $post->post_type);
2129 1
        $marker_icon = isset($term_icon_url['src']) ? $term_icon_url['src'] : get_option('geodir_default_marker_icon');
2130
        ?>
2131
        <span class="geodir-pinpoint"
2132
              style=" background:url('<?php if (isset($marker_icon)) {
2133 1
                  echo $marker_icon;
2134
              } ?>') no-repeat scroll left top transparent; background-size:auto 100%; -webkit-background-size:auto 100%; -moz-background-size:auto 100%; height:9px; width:14px; ">
2135
                                        <?php echo apply_filters('geodir_listing_listview_pinpoint_inner_content', '', 'listing'); ?>
2136
                                    </span>
2137
        <a class="geodir-pinpoint-link" href="javascript:void(0)"
2138
           onclick="openMarker('listing_map_canvas' ,'<?php echo $post->ID; ?>')"
2139
           onmouseover="animate_marker('listing_map_canvas' ,'<?php echo $post->ID; ?>')"
2140
           onmouseout="stop_marker_animation('listing_map_canvas' ,'<?php echo $post->ID; ?>')"><?php _e('Pinpoint', 'geodirectory'); ?></a>
2141
    <?php }
2142
}