lightspeeddevelopment /
lsx-health-plan
| 1 | <?php |
||
| 2 | namespace lsx_health_plan\functions; |
||
| 3 | |||
| 4 | /** |
||
| 5 | * LSX Health Plan functions. |
||
| 6 | * |
||
| 7 | * @package lsx-health-plan |
||
| 8 | */ |
||
| 9 | |||
| 10 | |||
| 11 | /** |
||
| 12 | * Checks to see if the current item has connected values. |
||
| 13 | * |
||
| 14 | * @param string $post_id |
||
| 15 | * @param string $meta_key |
||
| 16 | * @param boolean $single |
||
| 17 | * @return boolean |
||
| 18 | */ |
||
| 19 | function has_attached_post( $post_id = '', $meta_key = '', $single = true ) { |
||
| 20 | $has_post = false; |
||
| 21 | if ( '' === $post_id ) { |
||
| 22 | $post_id = get_the_ID(); |
||
| 23 | } |
||
| 24 | $items = get_post_meta( $post_id, $meta_key, $single ); |
||
| 25 | if ( '' !== $items && false !== $items && 0 !== $items ) { |
||
| 26 | if ( ! is_array( $items ) ) { |
||
| 27 | $items = array( $items ); |
||
| 28 | } |
||
| 29 | $items = check_posts_exist( $items ); |
||
| 30 | if ( ! empty( $items ) ) { |
||
| 31 | $has_post = true; |
||
| 32 | } |
||
| 33 | } else { |
||
| 34 | // Check for defaults. |
||
| 35 | $options = get_option( 'all' ); |
||
| 36 | if ( isset( $options[ $meta_key ] ) && '' !== $options[ $meta_key ] && ! empty( $options[ $meta_key ] ) ) { |
||
| 37 | $has_post = true; |
||
| 38 | } |
||
| 39 | } |
||
| 40 | return $has_post; |
||
| 41 | } |
||
| 42 | |||
| 43 | /** |
||
| 44 | * Wrapper function around cmb2_get_option |
||
| 45 | * @since 0.1.0 |
||
| 46 | * @param string $key Options array key |
||
| 47 | * @param mixed $default Optional default value |
||
| 48 | * @return mixed Option value |
||
| 49 | */ |
||
| 50 | function get_option( $key = '', $default = false ) { |
||
| 51 | if ( function_exists( 'cmb2_get_option' ) ) { |
||
| 52 | return cmb2_get_option( 'lsx_health_plan_options', $key, $default ); |
||
| 53 | } |
||
| 54 | // Fallback to get_option if CMB2 is not loaded yet. |
||
| 55 | $opts = \get_option( 'lsx_health_plan_options', $default ); |
||
| 56 | $val = $default; |
||
| 57 | if ( 'all' === $key ) { |
||
| 58 | $val = $opts; |
||
| 59 | } elseif ( is_array( $opts ) && array_key_exists( $key, $opts ) && false !== $opts[ $key ] ) { |
||
| 60 | $val = $opts[ $key ]; |
||
| 61 | } |
||
| 62 | return $val; |
||
| 63 | } |
||
| 64 | |||
| 65 | /** |
||
| 66 | * Returns the downloads attached to the items |
||
| 67 | * @since 0.1.0 |
||
| 68 | * @param string $key Options array key |
||
| 69 | * @param mixed $default Optional default value |
||
| 70 | * @return mixed Option value |
||
| 71 | */ |
||
| 72 | function get_downloads( $type = 'all', $post_id = '' ) { |
||
| 73 | $lsx_health_plan = \lsx_health_plan(); |
||
| 74 | $post_types = $lsx_health_plan->get_post_types(); |
||
| 75 | if ( '' === $post_id ) { |
||
| 76 | $post_id = get_the_ID(); |
||
| 77 | } |
||
| 78 | $downloads = array(); |
||
| 79 | $options = get_option( 'all' ); |
||
| 80 | |||
| 81 | foreach ( $post_types as $post_type ) { |
||
| 82 | if ( 'all' === $type || in_array( $type, $post_types, true ) ) { |
||
| 83 | |||
| 84 | // Get the default downloads for this post type. |
||
| 85 | $default_downloads = array(); |
||
| 86 | $new_downloads = array(); |
||
| 87 | if ( isset( $options[ 'download_' . $post_type ] ) ) { |
||
| 88 | if ( is_array( $options[ 'download_' . $post_type ] ) ) { |
||
| 89 | $default_downloads = $options[ 'download_' . $post_type ]; |
||
| 90 | } else { |
||
| 91 | $default_downloads[] = $options[ 'download_' . $post_type ]; |
||
| 92 | } |
||
| 93 | } |
||
| 94 | |||
| 95 | if ( 'page' === $post_type ) { |
||
| 96 | $key = 'plan_warmup'; |
||
| 97 | } else { |
||
| 98 | $key = 'connected_' . $post_type . 's'; |
||
| 99 | } |
||
| 100 | |||
| 101 | $connected_items = get_post_meta( $post_id, $key, true ); |
||
| 102 | if ( ! empty( $connected_items ) ) { |
||
| 103 | foreach ( $connected_items as $connected_item ) { |
||
| 104 | $current_downloads = get_post_meta( $connected_item, 'connected_downloads', true ); |
||
| 105 | if ( false !== $current_downloads && ! empty( $current_downloads ) ) { |
||
| 106 | $new_downloads = array_merge( $new_downloads, $current_downloads ); |
||
| 107 | } |
||
| 108 | } |
||
| 109 | } |
||
| 110 | |||
| 111 | if ( ! empty( $new_downloads ) ) { |
||
| 112 | $downloads = array_merge( $downloads, $new_downloads ); |
||
| 113 | } elseif ( ! empty( $default_downloads ) ) { |
||
| 114 | $downloads = array_merge( $downloads, $default_downloads ); |
||
| 115 | } |
||
| 116 | $downloads = array_unique( $downloads ); |
||
| 117 | } |
||
| 118 | } |
||
| 119 | $downloads = check_posts_exist( $downloads ); |
||
| 120 | return $downloads; |
||
| 121 | } |
||
| 122 | |||
| 123 | /** |
||
| 124 | * Returns the weekly downloads for the week name |
||
| 125 | * |
||
| 126 | * @param string $week Week name 'week-1'. |
||
| 127 | * @return array an array of the downloads or empty. |
||
| 128 | */ |
||
| 129 | function get_weekly_downloads( $week = '' ) { |
||
| 130 | $downloads = array(); |
||
| 131 | if ( '' !== $week ) { |
||
| 132 | $saved_downloads = get_transient( 'lsx_hp_weekly_downloads_' . $week ); |
||
| 133 | if ( false !== $saved_downloads && ! empty( $saved_downloads ) ) { |
||
| 134 | $downloads = $saved_downloads; |
||
| 135 | } else { |
||
| 136 | $args = array( |
||
| 137 | 'orderby' => 'title', |
||
| 138 | 'order' => 'ASC', |
||
| 139 | 'post_type' => 'dlm_download', |
||
| 140 | 'posts_per_page' => -1, |
||
| 141 | 'nopagin' => true, |
||
| 142 | 'fields' => 'ids', |
||
| 143 | 'tax_query' => array( |
||
| 144 | array( |
||
| 145 | 'taxonomy' => 'dlm_download_category', |
||
| 146 | 'field' => 'slug', |
||
| 147 | 'terms' => array( $week ), |
||
| 148 | ), |
||
| 149 | ), |
||
| 150 | ); |
||
| 151 | $download_query = new \WP_Query( $args ); |
||
| 152 | if ( $download_query->have_posts() ) { |
||
| 153 | $downloads = $download_query->posts; |
||
| 154 | } |
||
| 155 | } |
||
| 156 | } |
||
| 157 | $downloads = check_posts_exist( $downloads ); |
||
| 158 | return $downloads; |
||
| 159 | } |
||
| 160 | |||
| 161 | /** |
||
| 162 | * Checks to see if the downloads exist before adding them |
||
| 163 | * |
||
| 164 | * @param array $post_ids |
||
| 165 | * @return void |
||
| 166 | */ |
||
| 167 | function check_posts_exist( $post_ids = array() ) { |
||
| 168 | $new_ids = array(); |
||
| 169 | global $wpdb; |
||
| 170 | if ( is_array( $post_ids ) && ! empty( $post_ids ) ) { |
||
| 171 | $post_ids = "'" . implode( "','", $post_ids ) . "'"; |
||
| 172 | $query = " |
||
| 173 | SELECT `ID` |
||
| 174 | FROM `{$wpdb->posts}` |
||
| 175 | WHERE `ID` IN ({$post_ids}) |
||
| 176 | AND `post_status` != 'trash' |
||
| 177 | "; |
||
| 178 | $results = $wpdb->get_results( $query ); // WPCS: unprepared SQL |
||
| 179 | if ( ! empty( $results ) ) { |
||
| 180 | $new_ids = wp_list_pluck( $results, 'ID' ); |
||
| 181 | } |
||
| 182 | } |
||
| 183 | return $new_ids; |
||
| 184 | } |
||
| 185 | |||
| 186 | /** |
||
| 187 | * Registered the modal to be outputted |
||
| 188 | * |
||
| 189 | * @param string $id |
||
| 190 | * @param string $title |
||
| 191 | * @param string $body |
||
| 192 | * @return void |
||
| 193 | */ |
||
| 194 | function register_modal( $id = '', $title = '', $body = '' ) { |
||
| 195 | lsx_health_plan()->frontend->modals->register_modal( |
||
| 196 | array( |
||
| 197 | 'title' => $title, |
||
| 198 | 'body' => $body, |
||
| 199 | ), |
||
| 200 | $id |
||
| 201 | ); |
||
| 202 | } |
||
| 203 | |||
| 204 | /** |
||
| 205 | * Outputs the modal HTML |
||
| 206 | * |
||
| 207 | * @param array $args |
||
| 208 | * @return void |
||
| 209 | */ |
||
| 210 | function output_modal( $args = array() ) { |
||
| 211 | $defaults = array( |
||
| 212 | 'id' => '', |
||
| 213 | 'title' => '', |
||
| 214 | 'body' => '', |
||
| 215 | ); |
||
| 216 | $args = wp_parse_args( $args, $defaults ); |
||
| 217 | ?> |
||
| 218 | <!-- Modal --> |
||
| 219 | <div class="modal fade lsx-health-plan-modal" id="<?php echo esc_html( $args['id'] ); ?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo esc_html( $args['id'] ); ?>" aria-hidden="true"> |
||
| 220 | <div class="modal-dialog" role="document"> |
||
| 221 | <div class="modal-content"> |
||
| 222 | <button type="button" class="close" data-dismiss="modal">×</button> |
||
| 223 | <div class="modal-header"> |
||
| 224 | <?php |
||
| 225 | if ( '' !== $args['title'] ) { |
||
| 226 | echo wp_kses_post( '<h2>' . $args['title'] . '</h2>' ); |
||
| 227 | } |
||
| 228 | ?> |
||
| 229 | </div> |
||
| 230 | <div class="modal-body"> |
||
| 231 | <?php |
||
| 232 | if ( '' !== $args['body'] ) { |
||
| 233 | $allowed_html = array( |
||
| 234 | 'iframe' => array( |
||
| 235 | 'data-src' => array(), |
||
| 236 | 'src' => array(), |
||
| 237 | 'width' => array(), |
||
| 238 | 'height' => array(), |
||
| 239 | 'frameBorder' => array( '0' ), |
||
| 240 | 'class' => array(), |
||
| 241 | 'allowFullScreen' => array(), |
||
| 242 | 'style' => array(), |
||
| 243 | ), |
||
| 244 | 'h5' => array( |
||
| 245 | 'class' => array(), |
||
| 246 | ), |
||
| 247 | ); |
||
| 248 | if ( false !== \lsx_health_plan\functions\get_option( 'exercise_enabled', false ) ) { |
||
| 249 | echo wp_kses_post( $args['body'] ); |
||
| 250 | } else { |
||
| 251 | echo wp_kses( $args['body'], $allowed_html ); |
||
| 252 | } |
||
| 253 | } |
||
| 254 | ?> |
||
| 255 | </div> |
||
| 256 | </div> |
||
| 257 | </div> |
||
| 258 | </div> |
||
| 259 | <!-- End Modal --> |
||
| 260 | <?php |
||
| 261 | } |
||
| 262 | |||
| 263 | /** |
||
| 264 | * Gets the src attribute from an iframe embed. |
||
| 265 | * |
||
| 266 | * @param [type] $embed |
||
| 267 | * @return void |
||
| 268 | */ |
||
| 269 | function get_video_url( $embed ) { |
||
| 270 | $url = ''; |
||
| 271 | if ( false !== stripos( $embed, '<iframe' ) ) { |
||
| 272 | preg_match( '/src="([^"]+)"/', $embed, $match ); |
||
| 273 | if ( is_array( $match ) && isset( $match[1] ) ) { |
||
| 274 | $url = '<iframe data-src="' . $match[1] . '" style="border: 0;" frameBorder="0" class="giphy-embed" allowFullScreen height="300" width="100%"></iframe>'; |
||
| 275 | } else { |
||
| 276 | $url = $embed; |
||
| 277 | } |
||
| 278 | } else { |
||
| 279 | $url = $embed; |
||
| 280 | } |
||
| 281 | return $url; |
||
| 282 | } |
||
| 283 | |||
| 284 | /** |
||
| 285 | * Takes the Week ID and sees if it is complete |
||
| 286 | * |
||
| 287 | * @param boolean $term_id |
||
| 288 | * @param array $post_ids |
||
| 289 | * @return boolean |
||
| 290 | */ |
||
| 291 | function is_week_complete( $term_id = false, $section_keys = array(), $group_title = '' ) { |
||
| 292 | $return = false; |
||
| 293 | if ( ! empty( $section_keys ) ) { |
||
| 294 | $group_count = count( $section_keys ); |
||
| 295 | foreach ( $section_keys as &$pid ) { |
||
| 296 | $pid = 'day_' . \lsx_health_plan\functions\plan\generate_section_id( $pid ) . '_complete'; |
||
| 297 | } |
||
| 298 | $days_complete = get_meta_amounts( $section_keys ); |
||
| 299 | if ( (int) $group_count === (int) $days_complete ) { |
||
| 300 | $return = true; |
||
| 301 | } |
||
| 302 | } |
||
| 303 | return $return; |
||
| 304 | } |
||
| 305 | |||
| 306 | /** |
||
| 307 | * Gets the values straight from the DB |
||
| 308 | * |
||
| 309 | * @param integer $week |
||
| 310 | * @param string $key |
||
| 311 | * @return void |
||
| 312 | */ |
||
| 313 | function get_meta_amounts( $post_ids = array() ) { |
||
| 314 | global $wpdb; |
||
| 315 | $amount = 0; |
||
| 316 | $current_user = wp_get_current_user(); |
||
| 317 | if ( false !== $current_user && ! empty( $post_ids ) ) { |
||
| 318 | $post_ids = "'" . implode( "','", $post_ids ) . "'"; |
||
| 319 | $query = " |
||
| 320 | SELECT COUNT(`meta_value`) |
||
| 321 | FROM `{$wpdb->usermeta}` |
||
| 322 | WHERE `meta_key` IN ({$post_ids}) |
||
| 323 | AND `user_id` = '{$current_user->ID}' |
||
| 324 | "; |
||
| 325 | $results = $wpdb->get_var( $query ); // WPCS: unprepared SQL |
||
| 326 | if ( ! empty( $results ) ) { |
||
| 327 | $amount = $results; |
||
| 328 | } |
||
| 329 | } |
||
| 330 | return $amount; |
||
| 331 | } |
||
| 332 | |||
| 333 | /** |
||
| 334 | * Get the taxonomy plans type meta. |
||
| 335 | * |
||
| 336 | * @param [type] $post |
||
| 337 | * @return void |
||
| 338 | */ |
||
| 339 | function hp_get_plan_type_meta( $post ) { |
||
| 340 | $plan_meta = ''; |
||
| 341 | |||
| 342 | $term_obj_list = get_the_terms( $post->ID, 'plan-type' ); |
||
| 343 | if ( false !== $term_obj_list ) { |
||
| 344 | $terms_string = ''; |
||
| 345 | $terms_ids = wp_list_pluck( $term_obj_list, 'term_id' ); |
||
| 346 | |||
| 347 | foreach ( $term_obj_list as $term ) { |
||
| 348 | $term_link = get_term_link( $term ); |
||
| 349 | $term_name = '<a href="' . $term_link . '">' .$term->name . '<span>, </span></a>'; |
||
| 350 | |||
| 351 | $terms_string .= $term_name; |
||
| 352 | } |
||
| 353 | |||
| 354 | foreach ( $terms_ids as $terms_id ) { |
||
| 355 | $term_thumbnail_id = get_term_meta( $terms_id, 'thumbnail', true ); |
||
| 356 | $img = wp_get_attachment_image_src( $term_thumbnail_id, 'thumbnail' ); |
||
| 357 | if ( ! empty( $img ) ) { |
||
| 358 | $image_url = $img[0]; |
||
| 359 | $img = '<img loading="lazy" alt="thumbnail" style="width:24px; height: auto;" class="attachment-responsive wp-post-image lsx-responsive" src="' . esc_url( $image_url ) . '" />'; |
||
| 360 | } |
||
| 361 | |||
| 362 | $plan_meta .= $img; |
||
| 363 | } |
||
| 364 | |||
| 365 | $plan_meta = '<div class="plan-meta">' . $plan_meta . '<span>' . $terms_string . '</span></div>'; |
||
| 366 | } |
||
| 367 | |||
| 368 | return $plan_meta; |
||
| 369 | } |
||
| 370 | |||
| 371 | /** |
||
| 372 | * Limit media library access |
||
| 373 | */ |
||
| 374 | function set_only_author( $wp_query ) { |
||
| 375 | global $current_user; |
||
| 376 | if ( is_admin() && ! current_user_can( 'edit_others_posts' ) ) { |
||
| 377 | $wp_query->set( 'administrator', $current_user->ID ); |
||
| 378 | add_filter( 'views_upload', 'fix_media_counts' ); |
||
| 379 | } |
||
| 380 | } |
||
| 381 | add_action( 'pre_get_posts', '\lsx_health_plan\functions\set_only_author' ); |
||
| 382 | |||
| 383 | /** |
||
| 384 | * Outputs an excerpt even if there is not excerpt. |
||
| 385 | * |
||
| 386 | * @param [type] $post_id |
||
| 387 | * @return void |
||
| 388 | */ |
||
| 389 | function hp_excerpt( $post_id ) { |
||
| 390 | if ( ! has_excerpt( $post_id ) ) { |
||
| 391 | $content = wp_trim_words( get_post_field( 'post_content', $post_id ), 10 ); |
||
| 392 | } else { |
||
| 393 | $content = get_the_excerpt( $post_id ); |
||
| 394 | } |
||
| 395 | return $content; |
||
| 396 | } |
||
| 397 | |||
| 398 | /** |
||
| 399 | * Get the columns class for bootstrap. |
||
| 400 | * |
||
| 401 | * @param string $columns |
||
| 402 | * @return void |
||
| 403 | */ |
||
| 404 | function column_class( $columns = '3' ) { |
||
| 405 | $cols = ''; |
||
| 406 | $cols .= '5' === $columns ? '15' : 12 / $columns; |
||
| 407 | return $cols; |
||
| 408 | } |
||
| 409 | |||
| 410 | /** |
||
| 411 | * Gets the exercises by the workout ID. |
||
| 412 | * |
||
| 413 | * @param string $workout |
||
| 414 | * @return void |
||
| 415 | */ |
||
| 416 | function get_exercises_by_workout( $workout = '' ) { |
||
| 417 | $exercises = array(); |
||
| 418 | $i = 1; |
||
| 419 | $section_counter = 6; |
||
| 420 | while ( $i <= $section_counter ) { |
||
| 421 | $group_name = 'workout_section_' . $i; |
||
| 422 | $groups = get_post_meta( $workout, $group_name, true ); |
||
| 423 | if ( ! empty( $groups ) ) { |
||
| 424 | foreach ( $groups as $group ) { |
||
| 425 | if ( isset( $group['connected_exercises'] ) ) { |
||
| 426 | $exercises[] = $group['connected_exercises']; |
||
| 427 | } |
||
| 428 | } |
||
| 429 | } |
||
| 430 | $i++; |
||
| 431 | } |
||
| 432 | return $exercises; |
||
| 433 | } |
||
| 434 | |||
| 435 | |||
| 436 | /** |
||
| 437 | * Gets the current users progress on a plan. |
||
| 438 | * |
||
| 439 | * @param int $plan_id |
||
| 440 | * @return int |
||
| 441 | */ |
||
| 442 | function get_progress( $plan_id = false ) { |
||
| 443 | $progress = 0; |
||
| 444 | $complete = array(); |
||
| 445 | $count = 0; |
||
| 446 | if ( false !== $plan_id && \lsx_health_plan\functions\plan\has_sections( $plan_id ) ) { |
||
| 447 | $sections = \lsx_health_plan\functions\plan\get_sections(); |
||
| 448 | $all_count = count( $sections ); |
||
| 449 | $rest_days = 0; |
||
| 450 | foreach ( $sections as $section_key => $section_values ) { |
||
| 451 | if ( false !== $section_values['rest_day_enabled'] && ! $section_values['connected_meals'] ) { |
||
| 452 | $rest_days++; |
||
| 453 | } else if ( lsx_health_plan_is_day_complete( $plan_id, $section_values['title'] ) ) { |
||
| 454 | $complete[] = true; |
||
| 455 | } |
||
| 456 | } |
||
| 457 | $all_count = $all_count - $rest_days; |
||
| 458 | $progress = (int) count( $complete ) / (int) $all_count * 100; |
||
| 459 | } |
||
| 460 | return $progress; |
||
| 461 | } |
||
| 462 | |||
| 463 | |||
| 464 | |||
| 465 | /** |
||
| 466 | * Link to back to archive for taxonomy pages |
||
| 467 | * |
||
| 468 | * @return void |
||
| 469 | */ |
||
| 470 | function hp_back_archive_link() { |
||
| 471 | global $wp_taxonomies; |
||
| 472 | $post_type = get_queried_object()->taxonomy; |
||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||
| 473 | |||
| 474 | if ( is_tax() && isset( $wp_taxonomies[ $post_type ] ) ) { |
||
| 475 | $post_type = $wp_taxonomies[ $post_type ]->object_type; |
||
| 476 | ?> |
||
| 477 | <div class="archive-category-title hp-archive-category-title"> |
||
| 478 | <a class="back-to-blog" href="<?php echo ( esc_url( get_post_type_archive_link( $post_type[0] ) ) ); ?>"><?php echo esc_html__( 'Back To ', 'lsx' ) . esc_html( $post_type[0] ) . 's'; ?></a> |
||
| 479 | </div> |
||
| 480 | <?php |
||
| 481 | } |
||
| 482 | } |
||
| 483 | add_action( 'lsx_content_wrap_before', '\lsx_health_plan\functions\hp_back_archive_link', 20 ); |
||
| 484 | |||
| 485 | /** |
||
| 486 | * Returns an array. |
||
| 487 | * |
||
| 488 | * @param mixed $item |
||
| 489 | * @return array |
||
| 490 | */ |
||
| 491 | function prep_array( $item ) { |
||
| 492 | if ( ! is_array( $item ) ) { |
||
| 493 | $item = explode( ',', $item ); |
||
| 494 | if ( ! is_array( $item ) ) { |
||
| 495 | $item = array( $item ); |
||
| 496 | } |
||
| 497 | } |
||
| 498 | return $item; |
||
| 499 | } |
||
| 500 |