PluginProbe
Name Directory / trunk
Name Directory vtrunk
1.34.1 1.34.0 trunk 1.10 1.11 1.11.1 1.11.2 1.11.3 1.11.4 1.11.5 1.11.6 1.12 1.13 1.13.1 1.13.2 1.13.3 1.13.4 1.13.5 1.13.6 1.13.7 1.14 1.14.1 1.14.2 1.15 1.15.1 All 91 releases
name-directory / shortcode.php

shortcode.php in Name Directory trunk, at shortcode.php

755 lines 29.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) exit;
4
5 add_action('wp_enqueue_scripts', 'name_directory_add_frontend_assets');
6
7 /**
8 * Add the CSS file to output
9 */
10 function name_directory_add_frontend_assets()
11 {
12 wp_register_style('name-directory-style', plugins_url('name_directory.css', __FILE__));
13 wp_enqueue_style('name-directory-style');
14
15 /* If Google reCAPTCHA for Name Directory is enabled, load it too */
16 $name_directory_settings = get_option('name_directory_general_option');
17 if(! empty($name_directory_settings) && ! empty($name_directory_settings['enable_recaptcha']))
18 {
19 wp_enqueue_script( 'name-directory-recaptcha', 'https://www.google.com/recaptcha/api.js', false, false );
20
21 /* Make sure it's loaded 'defer async' */
22 add_filter( 'script_loader_tag', function ( $tag, $handle ) {
23 if ( 'name-directory-recaptcha' !== $handle ) {
24 return $tag;
25 }
26 return str_replace( ' src', ' async defer src', $tag );
27 }, 10, 2 );
28 }
29 }
30
31
32 /**
33 * Render function to display a namebox for a Name Directory
34 * @param $entry
35 * @param $directory
36 * @param string $tag
37 */
38 function name_directory_render_namebox($entry, $directory, $tag = 'strong')
39 {
40 echo '<div class="name_directory_name_box">';
41 echo '<a name="namedirectory_' . sanitize_html_class($entry['name']) . '"></a>';
42 echo '<' . $tag . ' role="term">' . esc_html(stripslashes($entry['name'])) . '</' . $tag . '><br>';
43 if(! empty($directory['show_description']) && ! empty($entry['description']))
44 {
45 $print_description = wp_kses_post(stripslashes($entry['description']));
46
47 /* This toggles the read more/less indicators, these need extra html */
48 if(! empty($directory['nr_words_description']))
49 {
50 $num_words = intval($directory['nr_words_description']);
51 $short_desc = name_directory_get_words($print_description, $num_words);
52 $print_description = str_replace($short_desc, "", $print_description);
53 if(! empty($print_description))
54 {
55 echo '<div role="definition">
56 <input type="checkbox" class="name_directory_readmore_state" id="name-' . htmlspecialchars($entry['id']) . '" />
57 <span class="name_directory_readmore_wrap">' . $short_desc . ' <span class="name_directory_readmore_target">' . $print_description .'</span></span>
58 <label for="name-' . htmlspecialchars($entry['id']) . '" class="name_directory_readmore_trigger"></label>
59 </div>';
60 }
61 else
62 {
63 echo '<div role="definition">' . do_shortcode($short_desc) . '</div>';
64 }
65
66 }
67 else {
68 echo '<div role="definition">' . do_shortcode($print_description) . '</div>';
69 }
70 }
71 if(! empty($directory['show_submitter_name']) && ! empty($entry['submitted_by']))
72 {
73 $submitted_by_label = __('Submitted by:', 'name-directory');
74 if(! empty($directory['submitted_by_term']))
75 {
76 $submitted_by_label = trim($directory['submitted_by_term']);
77 }
78 echo "<small>" . esc_html($submitted_by_label) . " " . esc_html($entry['submitted_by']) . "</small>";
79 }
80 echo '</div>';
81 }
82
83
84 /**
85 * Show and handle the submission form
86 * @param $directory
87 * @param $overview_url
88 * @return string
89 */
90 function name_directory_show_submit_form($directory, $overview_url)
91 {
92 global $wpdb;
93 global $name_directory_table_directory_name;
94 $name_directory_settings = get_option('name_directory_general_option');
95
96 /* Prevent a form from rendering if it's not the one to render, when there are multiple directories on a page */
97 if(! empty($_GET['dir']) && ($directory != $_GET['dir']))
98 {
99 return '';
100 }
101
102 $recaptcha_enabled = false;
103 $recaptcha_html = '';
104
105 /* If WordPress Search for Name Directory is disabled, just return */
106 if(! empty($name_directory_settings) && ! empty($name_directory_settings['enable_recaptcha']))
107 {
108 $recaptcha_enabled = true;
109 $recaptcha_html = "<div class='name_directory_forminput'><br><div class='g-recaptcha' data-sitekey='" . $name_directory_settings['recaptcha_sitekey'] . "'></div></div>";
110 }
111
112 /* If submissions are off, just return */
113 $directory_info = name_directory_get_directory_properties($directory);
114 if( empty($directory_info['show_submit_form']) ) {
115 return '';
116 }
117
118 if(empty($directory_info['name_term_singular']))
119 {
120 $name = __('Name', 'name-directory');
121 $back_txt = __('Back to name directory', 'name-directory');
122 $error_empty_txt = __('Please fill in at least a name', 'name-directory');
123 }
124 else
125 {
126 $name = ucfirst($directory_info['name_term_singular']);
127 $back_txt = sprintf(__('Back to %s directory', 'name-directory'), $directory_info['name_term_singular']);
128 $error_empty_txt = sprintf(__('Fill in at least a %s', 'name-directory'), $directory_info['name_term_singular']);
129 }
130
131 $required = __('Required', 'name-directory');
132 $description = __('Description', 'name-directory');
133 $your_name = __('Submitter name', 'name-directory');
134 if(! empty($directory_info['submitted_by_term']))
135 {
136 $your_name = trim($directory_info['submitted_by_term']) . " (" . $your_name . ")";
137 }
138 $submit = __('Submit', 'name-directory');
139
140 $result_class = '';
141 $form_result = null;
142 $alert_role = '';
143
144 /* reCAPTCHA implementation */
145 $proceed_submission = true;
146 if($recaptcha_enabled === true)
147 {
148 /* Check whether user even checked the box */
149 if(empty($_POST['g-recaptcha-response']))
150 {
151 if (! empty($error_empty_txt)) {
152 $error_empty_txt .= "<br>";
153 }
154 $error_empty_txt .= __('Please prove you are not a robot', 'name-directory');
155 $proceed_submission = false;
156 }
157 else
158 {
159 $recaptcha_verify_response = file_get_contents(sprintf('https://www.google.com/recaptcha/api/siteverify?secret=%s&response=%s',
160 $name_directory_settings['recaptcha_secretkey'], $_POST['g-recaptcha-response']));
161 $recaptcha_response = json_decode($recaptcha_verify_response);
162 if(! empty($recaptcha_response->success))
163 {
164 $proceed_submission = true;
165 }
166 else
167 {
168 /* Place error message because it didn't work */
169 if(! empty($error_empty_txt))
170 {
171 $error_empty_txt .= "<br>";
172 }
173 $error_empty_txt .= __('reCAPTCHA failed, please try again', 'name-directory');
174 $proceed_submission = false;
175 }
176 }
177 }
178
179 if($proceed_submission === true && ! empty(name_directory_deep_sanitize_public_user_input(
180 isset($_POST['name_directory_name']) ? $_POST['name_directory_name'] : null, array())))
181 {
182 $wpdb->get_results(
183 sprintf("SELECT `id` FROM `%s` WHERE `name` = '%s' AND `directory` = %d",
184 esc_sql($name_directory_table_directory_name),
185 esc_sql($_POST['name_directory_name']),
186 esc_sql(intval($directory)))
187 );
188
189 if($wpdb->num_rows > 0)
190 {
191 $result_class = 'form-result-error';
192 $form_result = sprintf(__('Sorry, %s was already on the list so your submission was not sent.', 'name-directory'),
193 '<i>' . esc_sql($_POST['name_directory_name']) . '</i>');
194 }
195 else
196 {
197 $published = 0;
198 if(empty($directory_info['check_submitted_names_first']))
199 {
200 $published = 1;
201 }
202
203 $db_success = $wpdb->insert(
204 $name_directory_table_directory_name,
205 [
206 'directory' => intval($directory),
207 'name' => name_directory_deep_sanitize_public_user_input($_POST['name_directory_name'], array()),
208 'letter' => name_directory_get_first_char($_POST['name_directory_name']),
209 'description' => name_directory_deep_sanitize_public_user_input($_POST['name_directory_description']),
210 'published' => $published,
211 'submitted_by' => name_directory_deep_sanitize_public_user_input($_POST['name_directory_submitter'], array()),
212 ],
213 array('%d', '%s', '%s', '%s', '%d', '%s')
214 );
215
216 if(! empty($db_success))
217 {
218 $result_class = 'form-result-success';
219
220 if(! empty($directory_info['check_submitted_names_first']))
221 {
222 $form_result = __('Thank you for your submission! It will be reviewed shortly.', 'name-directory');
223 name_directory_notify_admin_of_new_submission($directory, $_POST);
224 } else {
225 $form_result = __('Thank you for your submission!', 'name-directory');
226 }
227 }
228 else
229 {
230 $result_class = 'form-result-error';
231 $form_result = __('Something must have gone terribly wrong. Would you please try it again?', 'name-directory');
232 }
233 }
234 }
235 else if($_SERVER['REQUEST_METHOD'] == 'POST')
236 {
237 $result_class = 'form-result-error';
238 $form_result = $error_empty_txt;
239 }
240
241 if( strpos( $result_class, 'error' ) !== false ) {
242 $alert_role = "role='alert'";
243 }
244 $form = '<form method="post" name="name_directory_submit">';
245 $form .= '<div class="name_directory_form_result ' . $result_class . '" ' . $alert_role . '>' . $form_result . '</div>';
246 $form .= ' <p><a href="' . $overview_url . '">' . $back_txt . '</a></p>';
247 $form .= ' <div class="name_directory_forminput">';
248 $form .= ' <label for="name_directory_name">' . $name . ' <small>' . $required . '</small></label>';
249 $form .= ' <br />';
250 $form .= ' <input id="name_directory_name" type="text" autocomplete="off" name="name_directory_name" />';
251 $form .= ' </div>';
252 $form .= ' <div class="name_directory_forminput">';
253 $form .= ' <label for="name_directory_description">' . $description . '</label><br />';
254 $form .= ' <textarea id="name_directory_description" name="name_directory_description"></textarea>';
255 $form .= ' </div>';
256 $form .= ' <div class="name_directory_forminput">';
257 $form .= ' <label for="name_directory_submitter">' . $your_name . '</label>';
258 $form .= ' <br />';
259 $form .= ' <input id="name_directory_submitter" type="text" autocomplete="name" name="name_directory_submitter" />';
260 $form .= '</div>';
261 $form.= $recaptcha_html;
262 $form .= '<div class="name_directory_forminput">';
263 $form .= ' <br />';
264 $form .= ' <button type="submit">' . $submit . '</button>';
265 $form .= '</div>';
266 $form .= '</form>';
267
268
269 return $form;
270 }
271
272
273 /**
274 * Function that takes care of displaying.. stuff
275 * @param $attributes
276 * @return mixed
277 */
278 function name_directory_show_directory($attributes)
279 {
280 $dir = null;
281 $show_all_link = '';
282 $show_latest_link = '';
283 $jump_location = '';
284 extract(shortcode_atts(
285 array('dir' => '1'),
286 $attributes
287 ));
288
289 $name_directory_settings = get_option('name_directory_general_option');
290
291 $name_filter = array();
292 if(! empty($_GET['name_directory_startswith']) && $_GET['name_directory_startswith'] == "latest")
293 {
294 $name_filter['character'] = "latest";
295 }
296 else if(isset($_GET['name_directory_startswith']) && isset($_GET['dir']) && ($_GET['dir'] == $dir))
297 {
298 $name_filter['character'] = name_directory_get_first_char($_GET['name_directory_startswith']);
299 }
300 else if(! empty($attributes['start_with']) && empty($_GET['name-directory-search-value']))
301 {
302 $name_filter['character'] = $attributes['start_with'];
303 }
304
305 $str_all = __('All', 'name-directory');
306 $str_latest = __('Latest', 'name-directory');
307 $highlight_search_term = false;
308 $search_value = '';
309
310 $letter_url = name_directory_make_plugin_url('name_directory_startswith', 'name-directory-search-value', $dir);
311 $directory = name_directory_get_directory_properties($dir);
312
313 if($directory === null)
314 {
315 echo sprintf(__('Error: Name Directory #%d does not exist (anymore). If you are the webmaster, please change the shortcode.', 'name-directory'), $dir);
316 return false;
317 }
318
319 if(! empty($_GET['name-directory-search-value']) && ! empty($_GET['dir']) && $_GET['dir'] == $dir)
320 {
321 $raw_search_value = trim($_GET['name-directory-search-value']);
322 $search_value = esc_html($raw_search_value);
323 $search_value_js = esc_js($raw_search_value);
324 $name_filter['containing'] = $raw_search_value;
325 if(! empty($directory['search_highlight']))
326 {
327 $highlight_search_term = true;
328 }
329 }
330
331 $names = name_directory_get_directory_names($directory, $name_filter);
332 $num_names = count($names);
333
334 if(isset($_GET['show_submitform']) && ! empty($directory['show_submit_form']))
335 {
336 return name_directory_show_submit_form($dir, name_directory_make_plugin_url('','show_submitform', $dir));
337 }
338
339 ob_start();
340
341 if(! empty($directory['jump_to_search_results']))
342 {
343 $jump_location = "#name_directory_position" . $dir;
344 }
345
346 echo "<a name='name_directory_position" . $dir . "'></a>";
347
348 if(! empty($directory['show_title']))
349 {
350 echo "<h3 class='name_directory_title'>" . $directory['name'] . "</h3>";
351 }
352
353 if(! empty($directory['show_all_names_on_index']))
354 {
355 $show_all_link = '<a class="name_directory_startswith" href="' . $letter_url . $jump_location . '">' . $str_all . '</a> |';
356 }
357
358 if(! empty($directory['nr_most_recent']))
359 {
360 $show_latest_link = ' <a class="name_directory_startswith" href="' . $letter_url . 'latest' . $jump_location . '">' . $str_latest . '</a> |';
361 }
362
363 /* Prepare and print the index-letters */
364 echo '<div class="name_directory_index">';
365 echo $show_all_link;
366 echo $show_latest_link;
367
368 $index_letters = range('A', 'Z');
369 array_unshift($index_letters, '#');
370 $starting_letters = name_directory_get_directory_start_characters($dir);
371
372 /* User does not want to show all the index characters */
373 if(empty($directory['show_all_index_letters']))
374 {
375 $index_letters = $starting_letters;
376 }
377
378 foreach($index_letters as $index_letter)
379 {
380 $extra_classes = '';
381 if(! empty($name_filter['character']) && $name_filter['character'] == $index_letter)
382 {
383 $extra_classes .= ' name_directory_active';
384 }
385
386 if(! in_array($index_letter, $starting_letters))
387 {
388 $extra_classes .= ' name_directory_empty';
389 }
390
391 echo ' <a class="name_directory_startswith ' . $extra_classes . '" href="' . $letter_url . urlencode($index_letter) . $jump_location . '">' . strtoupper($index_letter) . '</a> ';
392 }
393
394 if(! empty($directory['show_submit_form']))
395 {
396 if(empty($directory['name_term_singular']))
397 {
398 $submit_string = __('Submit a name', 'name-directory');
399 }
400 else
401 {
402 $submit_string = sprintf(__('Submit a %s', 'name-directory'), $directory['name_term_singular']);
403 }
404
405 echo " | <a href='" . name_directory_make_plugin_url('','name_directory_startswith', $dir) . "&show_submitform=true'>" . $submit_string . "</a>";
406 }
407
408 if(! empty($directory['show_search_form']))
409 {
410 $parsed_url = wp_parse_url($_SERVER['REQUEST_URI']);
411 $search_get_url = array();
412 if(! empty($parsed_url['query']))
413 {
414 parse_str($parsed_url['query'], $search_get_url);
415 }
416 unset($search_get_url['name-directory-search-value']);
417
418 echo "<br />";
419 echo "<form role='search' method='get' action='" . $jump_location . "'>";
420 foreach($search_get_url as $key_name => $value)
421 {
422 if(in_array($key_name, ['name_directory_startswith', 'dir']) || is_array($key_name) || is_array($value))
423 {
424 continue;
425 }
426 echo "<input type='hidden' name='" . esc_attr($key_name) . "' value='" . esc_attr($value) . "' />";
427 }
428 echo "<input type='search' autocomplete='off' aria-description='" . __('Directory names below will match your searchcriteria after submit', 'name-directory') . "' name='name-directory-search-value' id='name-directory-search-input-box' placeholder='" . __('Search for...', 'name-directory') . "' />";
429 echo "<input type='hidden' name='dir' value='" . (int)$directory['id'] . "' />";
430 echo "<input type='submit' id='name-directory-search-input-button' value='" . __('Search', 'name-directory') . "' />";
431 echo "</form>";
432 }
433 echo '</div>';
434
435 echo '<div class="name_directory_total">';
436 if(empty($name_filter['character']) && empty($search_value) && $directory['show_current_num_names'])
437 {
438 if(empty($directory['name_term'])) {
439 echo sprintf(__('There are currently %d names in this directory', 'name-directory'), $num_names);
440 } else {
441 if( $num_names == 1 ) {
442 echo sprintf(__('There is currently %d %s in this directory', 'name-directory'), $num_names, $directory['name_term_singular']);
443 } else {
444 echo sprintf(__('There are currently %d %s in this directory', 'name-directory'), $num_names, $directory['name_term']);
445 }
446 }
447 echo '.';
448 }
449 else if(empty($name_filter['character']) && ! empty($search_value))
450 {
451 if(empty($directory['name_term'])) {
452 echo sprintf(__('There are %d names in this directory containing the search term %s.', 'name-directory'), $num_names, "<em>" . $search_value . "</em>");
453 } else {
454 if( $num_names == 1 ) {
455 echo sprintf(__('There is currently %d %s in this directory containing the search term %s.', 'name-directory'), $num_names, $directory['name_term_singular'], "<em>" . $search_value . "</em>");
456 } else {
457 echo sprintf(__('There are currently %d %s in this directory containing the search term %s.', 'name-directory'), $num_names, $directory['name_term'], "<em>" . $search_value . "</em>");
458 }
459 }
460
461 echo " <a href='" . get_permalink() . "'><small>" . __('Clear results', 'name-directory') . "</small></a>.<br />";
462 }
463 else if($directory['show_current_num_names'] && isset($name_filter['character']) && $name_filter['character'] == 'latest')
464 {
465 if(empty($directory['name_term'])) {
466 echo sprintf(__('Showing %d most recent names in this directory', 'name-directory'), $num_names);
467 } else {
468 echo sprintf(__('Showing %d most recent %s in this directory', 'name-directory'), $num_names, $directory['name_term']);
469 }
470 echo '.';
471 }
472 else if($directory['show_current_num_names'])
473 {
474 if(empty($directory['name_term'])) {
475 if( $num_names == 1 ) {
476 echo sprintf(__('There is currently %d %s in this directory beginning with the letter %s.', 'name-directory'), $num_names, strtolower(__('Name', 'name-directory')), $name_filter['character']);
477 } else {
478 echo sprintf(__('There are currently %d %s in this directory beginning with the letter %s.', 'name-directory'), $num_names, __('names', 'name-directory'), $name_filter['character']);
479 }
480 } else {
481 if( $num_names == 1 ) {
482 echo sprintf(__('There is currently %d %s in this directory beginning with the letter %s.', 'name-directory'), $num_names, $directory['name_term_singular'], $name_filter['character']);
483 } else {
484 echo sprintf(__('There are currently %d %s in this directory beginning with the letter %s.', 'name-directory'), $num_names, $directory['name_term'], $name_filter['character']);
485 }
486 }
487 }
488 echo '</div>';
489 echo '<div class="name_directory_names">';
490 if($num_names === 0 && empty($search_value) && $directory['show_current_num_names'] == "0")
491 {
492 echo '<p class="name_directory_entry_message">';
493 if(empty($directory['name_term'])) {
494 echo __('There are no entries in this directory at the moment', 'name-directory');
495 } else {
496 echo sprintf(__('There are no %s in this directory at the moment', 'name-directory'), $directory['name_term']);
497 }
498 echo '.</p>';
499 }
500 else if(isset($directory['show_all_names_on_index']) && $directory['show_all_names_on_index'] == "0" && empty($name_filter))
501 {
502 if($directory['show_index_instructions'])
503 {
504 echo '<p class="name_directory_entry_message">';
505 if(empty($directory['name_term'])) {
506 echo trim(__('Please select a letter from the index (above) to see entries', 'name-directory'));
507 } else {
508 echo trim(sprintf(__('Please select a letter from the index (above) to see %s', 'name-directory'), $directory['name_term']));
509 }
510 echo '.</p>';
511 }
512 }
513 else
514 {
515 $split_at = null;
516 if(! empty($directory['nr_columns']) && $directory['nr_columns'] > 1)
517 {
518 $split_at = round($num_names/$directory['nr_columns'])+1;
519 }
520
521 echo '<div class="name_directory_column name_directory_nr' . (int)$directory['nr_columns'] . '">';
522
523 $i = 1;
524 $split_i = 0;
525 $this_letter = '---';
526 foreach($names as $entry)
527 {
528 /* Show the header of the next starting letter */
529 if(! empty($directory['show_character_header']))
530 {
531 if ($entry['letter'] !== $this_letter) {
532 $this_letter = $entry['letter'];
533
534 echo '<div class="name_directory_character_header">' . $this_letter . '</div>';
535 if(! empty($directory['show_line_between_names']))
536 {
537 echo '<hr />';
538 }
539 }
540 }
541
542 $heading_tag = name_directory_get_safe_heading_tag($name_directory_settings);
543 name_directory_render_namebox($entry, $directory, $heading_tag);
544
545 if(! empty($directory['show_line_between_names']) && $num_names != $i)
546 {
547 echo '<hr />';
548 }
549
550 $split_i++;
551 $i++;
552
553 if($split_at == $split_i)
554 {
555 echo '</div><div class="name_directory_column name_directory_nr' . (int)$directory['nr_columns'] . '">';
556 $split_i = 1;
557 }
558 }
559 echo '</div>';
560 }
561 echo '</div>';
562
563 if(! empty($directory['nr_columns']) && $directory['nr_columns'] > 1)
564 {
565 echo '<div class="name_directory_column_clear"></div>';
566 }
567
568 if(! empty($directory['show_submit_form']))
569 {
570 echo "<br /><br />
571 <a href='" . name_directory_make_plugin_url('','name_directory_startswith', $dir) . "&show_submitform=true'
572 class='name_directory_submit_bottom_link'>" . $submit_string . "</a>";
573 }
574
575 /** Sad to print it like this, but this is needed for translating the show more/less buttons */
576 echo "<style>
577 .name_directory_readmore_state ~ .name_directory_readmore_trigger:before {
578 content: '... " . __('Show more', 'name-directory') . "';
579 }
580
581 .name_directory_readmore_state:checked ~ .name_directory_readmore_trigger:before {
582 content: '" . __('Show less', 'name-directory') . "';
583 }
584 </style>";
585
586 if($highlight_search_term == true)
587 {
588
589 wp_enqueue_script( 'name-directory-highlight', 'https://cdn.jsdelivr.net/mark.js/8.6.0/mark.min.js', array() );
590 wp_add_inline_script( 'name-directory-highlight', 'var markInstance = new Mark(document.querySelector(".name_directory_names"));
591 markInstance.mark("' . $search_value_js . '");');
592 }
593
594 return ob_get_clean();
595 }
596
597 add_shortcode('namedirectory', 'name_directory_show_directory');
598
599
600 /**
601 * Display a random name from a given directory
602 * Thanks to @mastababa
603 * @param $attributes
604 * @return mixed
605 */
606 function name_directory_show_random($attributes)
607 {
608 $dir = null;
609 extract(shortcode_atts(
610 array('dir' => '1'),
611 $attributes
612 ));
613
614 $directory = name_directory_get_directory_properties($dir);
615 if($directory === null)
616 {
617 echo sprintf(__('Error: Name Directory #%d does not exist (anymore). If you are the webmaster, please change the shortcode.', 'name-directory'), $dir);
618 return false;
619 }
620
621 $names = name_directory_get_directory_names($directory);
622
623 if (! count($names))
624 {
625 echo __('There are no entries in this directory at the moment', 'name-directory');
626 }
627
628 $entry = $names[array_rand($names)];
629
630 ob_start();
631
632 echo '<div class="name_directory_random_name">';
633 $heading_tag = name_directory_get_safe_heading_tag();
634 name_directory_render_namebox($entry, $directory, $heading_tag);
635 echo '</div>';
636
637 return ob_get_clean();
638
639 }
640 add_shortcode('namedirectory_random', 'name_directory_show_random');
641
642
643 /**
644 * Display a single name by ID
645 * -> Mind you, the name does have to be published!
646 * @param $attributes
647 * @return mixed
648 */
649 function name_directory_show_single_name($attributes)
650 {
651 $id = null;
652 extract(shortcode_atts(
653 array('id' => '1'),
654 $attributes
655 ));
656
657 $name_entry = name_directory_get_single_name($id);
658 $directory = name_directory_get_directory_properties($name_entry['directory']);
659
660 ob_start();
661
662 echo '<div class="name_directory_random_name">';
663 $heading_tag = name_directory_get_safe_heading_tag();
664 name_directory_render_namebox($name_entry, $directory, $heading_tag);
665 echo '</div>';
666
667 return ob_get_clean();
668 }
669 add_shortcode('namedirectory_single', 'name_directory_show_single_name');
670
671
672 /**
673 * Search the Name Directory entries whenever necessary
674 * Add the search results to the WordPress search results
675 * @param $where (is passed by WordPress)
676 * @return string
677 */
678 function name_directory_insert_sitewide_search_results($where)
679 {
680 /* Only perform actions whenever we are on a search page and within the main query */
681 if (is_search())
682 {
683
684 $name_directory_settings = get_option('name_directory_general_option');
685
686 /* If WordPress search for Name Directory is disabled, just return */
687 if(empty($name_directory_settings) || empty($name_directory_settings['search_on']))
688 {
689 return $where;
690 }
691
692 $directories = name_directory_get_directory_by_search_query(
693 get_search_query(),
694 $name_directory_settings['search_description'],
695 $name_directory_settings['search_wildcard']
696 );
697
698 $page_ids = array();
699 global $wpdb;
700
701 /* If directories were found, get the page they are on */
702 foreach($directories as $found => $dir)
703 {
704 /* Use a plain sql query, WP_Query unfortunately didn't work (infinite loop) */
705 $directory_id = intval($dir['directory']);
706 $host_pages = $wpdb->get_results("
707 SELECT *
708 FROM `{$wpdb->prefix}posts`
709 WHERE
710 `post_type` IN ('page', 'post')
711 AND `post_status` = 'publish'
712 AND (`post_content` LIKE '%[namedirectory dir=\"{$directory_id}%'
713 OR `post_content` LIKE '%[namedirectory dir={$directory_id}%'
714 OR `post_content` LIKE '%[namedirectory dir=''{$directory_id}%')");
715
716 if ($host_pages)
717 {
718 /* Add the pages to the results that WordPress will present to the user */
719 foreach($host_pages as $host_page)
720 {
721 $page_ids[] = $host_page->ID;
722 }
723 }
724 }
725
726 $page_ids = array_unique($page_ids);
727 if(! empty($page_ids))
728 {
729 $where .= " OR {$wpdb->posts}.ID IN (" . implode(",", $page_ids) . ")";
730 }
731
732 }
733
734 return $where;
735 }
736
737 add_filter('posts_where', 'name_directory_insert_sitewide_search_results');
738
739
740 /**
741 * Also add our results to Relevanssi
742 */
743 function name_directory_insert_relevanssi_search_results($where)
744 {
745 $new_where = name_directory_insert_sitewide_search_results($where);
746 if(! empty($new_where)) {
747
748 global $wpdb;
749 $new_where = str_replace("OR {$wpdb->posts}.ID IN", " OR doc IN ", $new_where);
750 }
751
752 return $new_where;
753 }
754 add_filter('relevanssi_where', 'name_directory_insert_relevanssi_search_results');
755