Brak opisu

members.php 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <?php if ( ! defined( 'ABSPATH' ) ) exit;
  2. global $post;
  3. // Get default and real arguments
  4. $def_args = array();
  5. foreach ( UM()->config()->core_directory_meta['members'] as $k => $v ) {
  6. $key = str_replace( '_um_', '', $k );
  7. $def_args[ $key ] = $v;
  8. }
  9. $unique_hash = substr( md5( $args['form_id'] ), 10, 5 );
  10. $args = array_merge( $def_args, $args );
  11. //current user priority role
  12. $priority_user_role = false;
  13. if ( is_user_logged_in() ) {
  14. $priority_user_role = UM()->roles()->get_priority_user_role( um_user( 'ID' ) );
  15. }
  16. $args = apply_filters( 'um_member_directory_agruments_on_load', $args );
  17. // Views
  18. $single_view = false;
  19. $current_view = 'grid';
  20. if ( ! empty( $args['view_types'] ) && is_array( $args['view_types'] ) ) {
  21. $args['view_types'] = array_filter( $args['view_types'], function( $item ) {
  22. return in_array( $item, array_keys( UM()->member_directory()->view_types ) );
  23. });
  24. }
  25. if ( empty( $args['view_types'] ) || ! is_array( $args['view_types'] ) ) {
  26. $args['view_types'] = array(
  27. 'grid',
  28. 'list'
  29. );
  30. }
  31. if ( count( $args['view_types'] ) == 1 ) {
  32. $single_view = true;
  33. $current_view = $args['view_types'][0];
  34. $default_view = $current_view;
  35. } else {
  36. $args['default_view'] = ! empty( $args['default_view'] ) ? $args['default_view'] : $args['view_types'][0];
  37. $default_view = $args['default_view'];
  38. $current_view = ( ! empty( $_GET[ 'view_type_' . $unique_hash ] ) && in_array( $_GET[ 'view_type_' . $unique_hash ], $args['view_types'] ) ) ? $_GET[ 'view_type_' . $unique_hash ] : $args['default_view'];
  39. }
  40. // Sorting
  41. $default_sorting = ! empty( $args['sortby'] ) ? $args['sortby'] : 'user_registered_desc';
  42. if ( $default_sorting == 'other' && ! empty( $args['sortby_custom'] ) ) {
  43. $default_sorting = $args['sortby_custom'];
  44. }
  45. $sort_from_url = '';
  46. $custom_sorting_titles = array();
  47. if ( ! empty( $args['enable_sorting'] ) ) {
  48. $sorting_options = empty( $args['sorting_fields'] ) ? array() : $args['sorting_fields'];
  49. $sorting_options_prepared = array();
  50. if ( ! empty( $sorting_options ) ) {
  51. foreach ( $sorting_options as $option ) {
  52. if ( is_array( $option ) ) {
  53. $option_keys = array_keys( $option );
  54. $sorting_options_prepared[] = $option_keys[0];
  55. $custom_sorting_titles[ $option_keys[0] ] = $option[ $option_keys[0] ];
  56. } else {
  57. $sorting_options_prepared[] = $option;
  58. }
  59. }
  60. }
  61. $all_sorting_options = UM()->member_directory()->sort_fields;
  62. if ( ! in_array( $default_sorting, $sorting_options_prepared ) ) {
  63. $sorting_options_prepared[] = $default_sorting;
  64. $label = $default_sorting;
  65. if ( ! empty( $args['sortby_custom_label'] ) && 'other' == $args['sortby'] ) {
  66. $label = $args['sortby_custom_label'];
  67. } elseif ( ! empty( $all_sorting_options[ $default_sorting ] ) ) {
  68. $label = $all_sorting_options[ $default_sorting ];
  69. }
  70. $label = ( $label == 'random' ) ? __( 'Random', 'ultimate-member' ) : $label;
  71. $custom_sorting_titles[ $default_sorting ] = $label;
  72. }
  73. if ( ! empty( $sorting_options_prepared ) ) {
  74. $sorting_options = array_intersect_key( array_merge( $all_sorting_options, $custom_sorting_titles ), array_flip( $sorting_options_prepared ) );
  75. }
  76. $sorting_options = apply_filters( 'um_member_directory_pre_display_sorting', $sorting_options, $args );
  77. $sort_from_url = ( ! empty( $_GET[ 'sort_' . $unique_hash ] ) && in_array( sanitize_text_field( $_GET[ 'sort_' . $unique_hash ] ), array_keys( $sorting_options ) ) ) ? sanitize_text_field( $_GET[ 'sort_' . $unique_hash ] ) : $default_sorting;
  78. }
  79. $current_page = ( ! empty( $_GET[ 'page_' . $unique_hash ] ) && is_numeric( $_GET[ 'page_' . $unique_hash ] ) ) ? absint( $_GET[ 'page_' . $unique_hash ] ) : 1;
  80. //Search
  81. $search = isset( $args['search'] ) ? $args['search'] : false;
  82. $show_search = empty( $args['roles_can_search'] ) || ( ! empty( $priority_user_role ) && in_array( $priority_user_role, $args['roles_can_search'] ) );
  83. $search_from_url = '';
  84. if ( $search && $show_search ) {
  85. $search_from_url = ! empty( $_GET[ 'search_' . $unique_hash ] ) ? stripslashes( sanitize_text_field( $_GET[ 'search_' . $unique_hash ] ) ) : '';
  86. }
  87. //Filters
  88. $filters = isset( $args['filters'] ) ? $args['filters'] : false;
  89. $show_filters = empty( $args['roles_can_filter'] ) || ( ! empty( $priority_user_role ) && in_array( $priority_user_role, $args['roles_can_filter'] ) );
  90. $search_filters = array();
  91. if ( isset( $args['search_fields'] ) ) {
  92. $search_filters = apply_filters( 'um_frontend_member_search_filters', array_unique( array_filter( $args['search_fields'] ) ) );
  93. }
  94. if ( ! empty( $search_filters ) ) {
  95. $search_filters = array_filter( $search_filters, function( $item ) {
  96. return in_array( $item, array_keys( UM()->member_directory()->filter_fields ) );
  97. });
  98. $search_filters = array_values( $search_filters );
  99. }
  100. // Classes
  101. $classes = '';
  102. if ( $search && $show_search ) {
  103. $classes .= ' um-member-with-search';
  104. }
  105. if ( $filters && $show_filters && count( $search_filters ) ) {
  106. $classes .= ' um-member-with-filters';
  107. }
  108. if ( ! $single_view ) {
  109. $classes .= ' um-member-with-view';
  110. }
  111. if ( ! empty( $args['enable_sorting'] ) && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) {
  112. $classes .= ' um-member-with-sorting';
  113. }
  114. $filters_collapsible = true;
  115. $filters_expanded = ! empty( $args['filters_expanded'] ) ? true : false;
  116. if ( $filters_expanded ) {
  117. $filters_collapsible = ! empty( $args['filters_is_collapsible'] ) ? true : false;
  118. }
  119. //send $args variable to the templates
  120. $args['args'] = $args;
  121. foreach ( $args['view_types'] as $type ) {
  122. $basename = UM()->member_directory()->get_type_basename( $type );
  123. UM()->get_template( 'members-' . $type . '.php', $basename, $args, true );
  124. }
  125. UM()->get_template( 'members-header.php', '', $args, true );
  126. UM()->get_template( 'members-pagination.php', '', $args, true );
  127. $must_search = 0;
  128. $not_searched = false;
  129. if ( ( ( $search && $show_search ) || ( $filters && $show_filters && count( $search_filters ) ) ) && isset( $args['must_search'] ) && $args['must_search'] == 1 ) {
  130. $must_search = 1;
  131. $not_searched = true;
  132. if ( $search && $show_search && ! empty( $search_from_url ) ) {
  133. $not_searched = false;
  134. } elseif ( $filters && $show_filters && count( $search_filters ) ) {
  135. foreach ( $search_filters as $filter ) {
  136. // getting value from GET line
  137. switch ( UM()->member_directory()->filter_types[ $filter ] ) {
  138. default: {
  139. $not_searched = apply_filters( 'um_member_directory_filter_value_from_url', $not_searched, $filter );
  140. break;
  141. }
  142. case 'select': {
  143. // getting value from GET line
  144. $filter_from_url = ! empty( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) ? explode( '||', sanitize_text_field( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) ) : array();
  145. if ( ! empty( $filter_from_url ) ) {
  146. $not_searched = false;
  147. }
  148. break;
  149. }
  150. case 'slider': {
  151. // getting value from GET line
  152. $filter_from_url = ! empty( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) ? sanitize_text_field( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) : '';
  153. if ( ! empty( $filter_from_url ) ) {
  154. $not_searched = false;
  155. }
  156. break;
  157. }
  158. case 'datepicker':
  159. case 'timepicker': {
  160. // getting value from GET line
  161. $filter_from_url = ! empty( $_GET[ 'filter_' . $filter . '_from_' . $unique_hash ] ) ? sanitize_text_field( $_GET[ 'filter_' . $filter . '_from_' . $unique_hash ] ) : '';
  162. if ( ! empty( $filter_from_url ) ) {
  163. $not_searched = false;
  164. }
  165. break;
  166. }
  167. }
  168. }
  169. }
  170. } ?>
  171. <div class="um <?php echo esc_attr( $this->get_class( $mode ) ); ?> um-<?php echo esc_attr( substr( md5( $form_id ), 10, 5 ) ); ?>"
  172. data-hash="<?php echo esc_attr( substr( md5( $form_id ), 10, 5 ) ) ?>" data-base-post="<?php echo esc_attr( $post->ID ) ?>"
  173. data-must-search="<?php echo esc_attr( $must_search ); ?>" data-searched="<?php echo $not_searched ? '0' : '1'; ?>"
  174. data-view_type="<?php echo esc_attr( $current_view ) ?>" data-page="<?php echo esc_attr( $current_page ) ?>"
  175. data-sorting="<?php echo esc_attr( $sort_from_url ) ?>">
  176. <div class="um-members-overlay"><div class="um-ajax-loading"></div></div>
  177. <div class="um-member-directory-header um-form">
  178. <?php do_action( 'um_members_directory_before_head', $args, $form_id, $not_searched ); ?>
  179. <?php if ( $search && $show_search ) { ?>
  180. <div class="um-member-directory-header-row um-member-directory-search-row">
  181. <div class="um-member-directory-search-line">
  182. <label>
  183. <span><?php _e( 'Search:', 'ultimate-member' ); ?></span>
  184. <input type="search" class="um-search-line" placeholder="<?php esc_attr_e( 'Search', 'ultimate-member' ) ?>" value="<?php echo esc_attr( $search_from_url ) ?>" aria-label="<?php esc_attr_e( 'Search', 'ultimate-member' ) ?>" speech />
  185. </label>
  186. <input type="button" class="um-do-search um-button" value="<?php esc_attr_e( 'Search', 'ultimate-member' ); ?>" />
  187. </div>
  188. </div>
  189. <?php }
  190. if ( ( ! empty( $args['enable_sorting'] ) && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) ||
  191. ( $filters && $show_filters && count( $search_filters ) ) ||
  192. ! $single_view ) { ?>
  193. <div class="um-member-directory-header-row">
  194. <div class="um-member-directory-nav-line">
  195. <?php if ( ! $single_view ) {
  196. $view_types = 0;
  197. foreach ( UM()->member_directory()->view_types as $key => $value ) {
  198. if ( in_array( $key, $args['view_types'] ) ) {
  199. if ( empty( $view_types ) ) { ?>
  200. <span class="um-member-directory-view-type<?php if ( $not_searched ) {?> um-disabled<?php } ?>">
  201. <?php }
  202. $view_types++; ?>
  203. <a href="javascript:void(0)"
  204. class="um-member-directory-view-type-a<?php if ( ! $not_searched ) {?> um-tip-n<?php } ?>"
  205. data-type="<?php echo $key; ?>"
  206. data-default="<?php echo ( $default_view == $key ) ? 1 : 0; ?>"
  207. title="<?php printf( esc_attr__( 'Change to %s', 'ultimate-member' ), $value['title'] ) ?>"
  208. default-title="<?php echo esc_attr( $value['title'] ); ?>"
  209. next-item="" ><i class="<?php echo $value['icon']; ?>"></i></a>
  210. <?php }
  211. }
  212. if ( ! empty( $view_types ) ) { ?>
  213. </span>
  214. <?php }
  215. }
  216. if ( ! empty( $args['enable_sorting'] ) && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) { ?>
  217. <div class="um-member-directory-sorting">
  218. <span><?php _e( 'Sort by:', 'ultimate-member' ); ?>&nbsp;</span>
  219. <div class="um-member-directory-sorting-a">
  220. <a href="javascript:void(0);" class="um-member-directory-sorting-a-text"><?php echo $sorting_options[ $sort_from_url ] ?></a>
  221. &nbsp;<i class="um-faicon-caret-down"></i><i class="um-faicon-caret-up"></i>
  222. </div>
  223. </div>
  224. <?php $items = array();
  225. foreach ( $sorting_options as $value => $title ) {
  226. $items[] = '<a href="javascript:void(0);" data-directory-hash="' . esc_attr( substr( md5( $form_id ), 10, 5 ) ) . '" class="um-sortyng-by-' . esc_attr( $value ) . '" data-value="' . esc_attr( $value ) . '" data-selected="' . ( ( $sort_from_url == $value ) ? '1' : '0' ) . '" data-default="' . ( ( $default_sorting == $value ) ? '1' : '0' ) . '">' . $title . '</a>'; ?>
  227. <?php }
  228. UM()->member_directory()->dropdown_menu( '.um-member-directory-sorting-a', 'click', $items ); ?>
  229. <?php }
  230. if ( $filters && $show_filters && count( $search_filters ) && $filters_collapsible ) { ?>
  231. <span class="um-member-directory-filters">
  232. <span class="um-member-directory-filters-a<?php if ( $filters_expanded ) { ?> um-member-directory-filters-visible<?php } ?>">
  233. <a href="javascript:void(0);">
  234. <?php _e( 'More filters', 'ultimate-member' ); ?>
  235. </a>
  236. &nbsp;<i class="um-faicon-caret-down"></i><i class="um-faicon-caret-up"></i>
  237. </span>
  238. </span>
  239. <?php } ?>
  240. </div>
  241. </div>
  242. <?php } ?>
  243. <?php if ( $filters && $show_filters && count( $search_filters ) ) {
  244. if ( is_array( $search_filters ) ) { ?>
  245. <script type="text/template" id="tmpl-um-members-filtered-line">
  246. <# if ( data.filters.length > 0 ) { #>
  247. <# _.each( data.filters, function( filter, key, list ) { #>
  248. <div class="um-members-filter-tag">
  249. <# if ( filter.type == 'slider' ) { #>
  250. {{{filter.value_label}}}
  251. <# } else { #>
  252. <strong>{{{filter.label}}}</strong>: {{{filter.value_label}}}
  253. <# } #>
  254. <div class="um-members-filter-remove um-tip-n" data-name="{{{filter.name}}}"
  255. data-value="{{{filter.value}}}" data-range="{{{filter.range}}}"
  256. data-type="{{{filter.type}}}" title="<?php esc_attr_e( 'Remove filter', 'ultimate-member' ) ?>">&times;</div>
  257. </div>
  258. <# }); #>
  259. <# } #>
  260. </script>
  261. <div class="um-member-directory-header-row um-member-directory-filters-bar<?php if ( ! $filters_expanded ) { ?> um-header-row-invisible<?php } ?>">
  262. <div class="um-search um-search-<?php echo count( $search_filters ) ?><?php if ( ! $filters_expanded ) { ?> um-search-invisible<?php } ?>">
  263. <?php $i = 0;
  264. foreach ( $search_filters as $filter ) {
  265. $filter_content = UM()->member_directory()->show_filter( $filter, $args );
  266. if ( empty( $filter_content ) ) {
  267. continue;
  268. }
  269. $type = UM()->member_directory()->filter_types[ $filter ]; ?>
  270. <div class="um-search-filter um-<?php echo esc_attr( $type ) ?>-filter-type <?php echo ( $i != 0 && $i%2 !== 0 ) ? 'um-search-filter-2' : '' ?>">
  271. <?php echo $filter_content; ?>
  272. </div>
  273. <?php $i++;
  274. } ?>
  275. </div>
  276. </div>
  277. <div class="um-member-directory-header-row">
  278. <div class="um-filtered-line">
  279. <div class="um-clear-filters"><a href="javascript:void(0);" class="um-clear-filters-a" title="<?php esc_attr_e( 'Remove all filters', 'ultimate-member' ) ?>"><?php _e( 'Clear all', 'ultimate-member' ); ?></a></div>
  280. </div>
  281. </div>
  282. <?php
  283. }
  284. }
  285. do_action( 'um_members_directory_head', $args ); ?>
  286. </div>
  287. <div class="um-members-wrapper"></div>
  288. <div class="um-members-pagination-box"></div>
  289. <?php
  290. /**
  291. * UM hook
  292. *
  293. * @type action
  294. * @title um_members_directory_footer
  295. * @description Member directory display footer
  296. * @input_vars
  297. * [{"var":"$args","type":"array","desc":"Member directory shortcode arguments"}]
  298. * @change_log
  299. * ["Since: 2.0"]
  300. * @usage add_action( 'um_members_directory_footer', 'function_name', 10, 1 );
  301. * @example
  302. * <?php
  303. * add_action( 'um_members_directory_footer', 'my_members_directory_footer', 10, 1 );
  304. * function my_members_directory_footer( $args ) {
  305. * // your code here
  306. * }
  307. * ?>
  308. */
  309. do_action( 'um_members_directory_footer', $args, $form_id, $not_searched ); ?>
  310. </div>