/** * Calculate the score of a post * * @access public * @param object $post A WP_Post obejct. * @param array $data The relevant audit data. * @return array $array The score and audit data. */ function msa_calculate_score($post, $data) { $score_data = array(); $score = 0; $weight = 0; $conditions = msa_get_conditions(); foreach ($conditions as $key => $condition) { // Greater Than. if (1 === $condition['comparison'] && isset($condition['min'])) { if (0 !== $condition['min']) { $value = min($data[$key] / $condition['min'], 1); } else { $value = 1; } } // Less Than. if (2 === $condition['comparison'] && isset($condition['max'])) { if (0 !== $condition['max']) { $value = 1 - min($data[$key] / $condition['max'], 1); } else { $value = 0; } } // Range. if (3 === $condition['comparison'] && isset($condition['max']) && isset($condition['min'])) { $range = $condition['max'] - $condition['min'] + 2; $mean = ($condition['max'] + $condition['min']) / 2; $value = 1 - min(floor(abs($data[$key] - $mean)) / floor($range / 2), 1); } // Convert to bool if needed. $value = 1 === $condition['value'] && 0 !== $value ? 1 : $value; $score_data[$key] = $value; $score += $value * $condition['weight']; $weight += $condition['weight']; } // Get the score data for condition categories. $condition_categories = msa_get_condition_categories(); foreach ($condition_categories as $key => $condition_category) { $score_data[$key] = msa_get_condition_catergory_score($key, $score_data); } $score = 0 !== $weight ? round($score / $weight, 2) : 0; return array('score' => $score, 'data' => $score_data); }
/** * Extra controls to be displayed between bulk actions and pagination * * @access protected * * @param mixed $which Which tablenav the top or bottom. */ protected function extra_tablenav($which) { $conditions = msa_get_conditions(); $attributes = msa_get_attributes(); if ('top' === $which) { ?> <div class="alignleft actions bulkactions"><?php foreach ($conditions as $key => $condition) { if (isset($condition['filter'])) { $value = ''; if (isset($_GET[$condition['filter']['name']])) { // Input var okay. $value = sanitize_text_field(wp_unslash($_GET[$condition['filter']['name']])); // Input var okay. } $options = ''; $condition = apply_filters('msa_audit_posts_filter_' . $key, $condition); if (1 === $condition['comparison']) { $options .= '<option value="less-' . $condition['min'] . '" ' . selected('less-' . $condition['min'], $value, false) . '>' . __('Less than ', 'msa') . ' ' . $condition['min'] . ' ' . $condition['units'] . '</option>'; $options .= '<option value="more-' . $condition['min'] . '" ' . selected('more-' . $condition['min'], $value, false) . '>' . __('More than ', 'msa') . ' ' . $condition['min'] . ' ' . $condition['units'] . '</option>'; } else { if (2 === $condition['comparison']) { $options .= '<option value="less-' . $condition['max'] . '" ' . selected('less-' . $condition['max'], $value, false) . '>' . __('Less than ', 'msa') . ' ' . $condition['max'] . ' ' . $condition['units'] . '</option>'; $options .= '<option value="more-' . $condition['max'] . '" ' . selected('more-' . $condition['max'], $value, false) . '>' . __('More than ', 'msa') . ' ' . $condition['max'] . ' ' . $condition['units'] . '</option>'; } else { if (3 === $condition['comparison']) { $options .= '<option value="less-' . $condition['max'] . '" ' . selected('less-' . $condition['max'], $value, false) . '>' . __('Less than ', 'msa') . ' ' . $condition['max'] . ' ' . $condition['units'] . '</option>'; $options .= '<option value="more-' . $condition['max'] . '" ' . selected('more-' . $condition['max'], $value, false) . '>' . __('More than ', 'msa') . ' ' . $condition['max'] . ' ' . $condition['units'] . '</option>'; } } } ?> <div class="msa-filter-container msa-filter-conditions-container filter-<?php esc_attr_e($key); ?> "> <!-- <label class="msa-filter-label"><?php esc_attr_e($condition['filter']['label']); ?> </label> --> <select class="msa-filter" name="<?php esc_attr_e($condition['filter']['name']); ?> "> <option value="" <?php selected('', $value, true); ?> ><?php esc_attr_e('All ' . $condition['filter']['label'], 'msa'); ?> </option> <?php echo $options; // WPCS: XSS ok. ?> </select> </div> <?php } } foreach ($attributes as $key => $attribute) { if (isset($attribute['filter'])) { $value = ''; if (isset($_GET[$attribute['filter']['name']])) { // Input var okay. $value = sanitize_text_field(wp_unslash($_GET[$attribute['filter']['name']])); // Input var okay. } $attribute['filter']['options'] = apply_filters('msa_filter_attribute_' . $key, $attribute['filter']['options'], $key); ?> <div class="msa-filter-container msa-filter-attributes-container filter-<?php esc_attr_e($key); ?> "> <!-- <label class="msa-filter-label"><?php esc_attr_e($attribute['filter']['label']); ?> </label> --> <select class="msa-filter" name="<?php esc_attr_e($attribute['filter']['name']); ?> "> <option value="" <?php selected('', $value, true); ?> ><?php esc_attr_e('All ' . $attribute['filter']['label'], 'msa'); ?> </option> <?php foreach ($attribute['filter']['options'] as $option) { ?> <option value="<?php esc_attr_e($option['value']); ?> " <?php selected($option['value'], $value, true); ?> ><?php esc_attr_e($option['name']); ?> </option> <?php } ?> </select> </div> <?php } } ?> <button class="msa-filter-button button"><?php esc_attr_e('Filter', 'msa'); ?> </button> <button class="msa-clear-filters-button button"><?php esc_attr_e('Clear Filters', 'msa'); ?> </button> </div><?php } // Output stlying for the condition categories. $condition_categories = msa_get_condition_categories(); ?> <style> <?php foreach ($condition_categories as $key => $condition_category) { ?> th#<?php esc_attr_e($key); ?> .manage-column.column-<?php esc_attr_e($key); ?> , .<?php esc_attr_e($key); ?> .column-<?php esc_attr_e($key); ?> { font-weight: bold; border-left: 1px solid #dfdfdf; background: linear-gradient(rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.02)); } <?php } ?> </style><?php }
<?php do_action('msa_single_post_sidebar'); ?> </div> </div> </div> <div class="msa-column msa-left-column metabox-holder"> <div class="msa-column-container"> <?php $condition_categories = msa_get_condition_categories(); foreach ($condition_categories as $key => $condition_category) { ?> <div class="postbox" id="<?php esc_attr_e($key); ?> "> <?php echo apply_filters('msa_condition_category_content', $key, $post, $data, $score); // WPCS: XSS ok. ?> </div> <?php }
/** * Prints the box content. * * @access public * @param object $post A WP_Post obejct. * @return void */ function msa_meta_box_callback($post) { // Get the latest audit. $audit_model = new MSA_Audits_Model(); $audit = $audit_model->get_latest(); // Check to see if we have an audit. if (isset($audit)) { $post_id = -1; if (isset($_GET['post'])) { // Input var okay. $post_id = sanitize_text_field(wp_unslash($_GET['post'])); // Input var okay. } $audit = $audit_model->get_data_from_id($audit['id']); $audit_posts_model = new MSA_Audit_Posts_Model(); $audit_post = $audit_posts_model->get_data_from_id($audit['id'], $post_id); if ($audit_post) { $post = (object) $audit_post['post']; $data = $audit_post['data']['values']; $score = $audit_post['data']['score']; $condition_categories = msa_get_condition_categories(); $user = get_userdata($audit['user']); do_action('msa_before_post_meta_box', $audit['id'], $post_id); ?> <div class="msa-post-meta-container msa-post-meta-audit-meta-attributes"> <p class="msa-post-meta-attribute"><?php esc_attr_e('Score: ', 'msa'); ?> </p> <p class="msa-post-meta-attribute"><?php esc_attr_e('From Audit: ', 'msa'); ?> </p> <p class="msa-post-meta-attribute"><?php esc_attr_e('Created On: ', 'msa'); ?> </p> <p class="msa-post-meta-attribute"><?php esc_attr_e('Created By: ', 'msa'); ?> </p> </div> <div class="msa-post-meta-container msa-post-meta-audit-meta-values"> <p class="msa-post-meta-value msa-post-status-bg msa-post-status-bg-<?php esc_attr_e(msa_get_score_status($score['score'])); ?> "><?php esc_attr_e(round($score['score'] * 100, 2)); ?> %</p> <p class="msa-post-meta-value"><a href="<?php esc_attr_e(msa_get_single_audit_link($audit['id'])); ?> " target="_blank"><?php esc_attr_e($audit['name']); ?> </a></p> <p class="msa-post-meta-value"><?php esc_attr_e(date('M j, Y', strtotime($audit['date']))); ?> </p> <p class="msa-post-meta-value"><?php esc_attr_e($user->display_name); ?> </p> </div><?php foreach ($condition_categories as $key => $condition_category) { ?> <div class="postbox" id="<?php esc_attr_e($key); ?> " style="pointer-events: none;"> <?php echo apply_filters('msa_condition_category_content', $key, $post, $data, $score); // WPCS: XSS ok. ?> </div><?php } do_action('msa_after_post_meta_box', $audit['id'], $post_id); } } wp_enqueue_style('msa-all-audits-css', MY_SITE_AUDIT_PLUGIN_URL . '/css/all-audits.css'); wp_enqueue_style('msa-post-meta-css', MY_SITE_AUDIT_PLUGIN_URL . '/css/post-meta.css'); wp_enqueue_style('msa-common-css', MY_SITE_AUDIT_PLUGIN_URL . '/css/common.css'); }
/** * Add all the screen option columns * * @access public * @param mixed $columns The original columns. * @return array $columns The modified columns. */ function msa_all_audits_add_column($columns) { /** * Conditions */ $condition_categories = msa_get_condition_categories(); foreach ($condition_categories as $key => $condition_category) { $conditions = msa_get_conditions_from_category($key); foreach ($conditions as $key => $condition) { $columns[$key] = $condition['name']; } } /** * Attributes */ $attributes = msa_get_attributes(); foreach ($attributes as $slug => $attribute) { if (isset($attribute['name'])) { $columns[$slug] = $attribute['name']; } } return $columns; }
/** * Register a new condition * * @access public * @param mixed $condition The slug for the new condition. * @param array $args The args for the new condition. * @return array $args The args for the new condition. */ function msa_register_condition($condition, $args = array()) { // Make sure this is not already a condition category. $condition_categories = msa_get_condition_categories(); if (isset($condition_categories[$condition])) { return false; } global $msa_conditions; if (!is_array($msa_conditions)) { $msa_conditions = array(); } // Default condition. $default = array('name' => __('Condition', 'msa'), 'weight' => 1, 'comparison' => 0, 'value' => 0, 'max' => 0, 'min' => 0); $args = array_merge($default, $args); // Add the condition to the global conditions array. $msa_conditions[$condition] = apply_filters('msa_register_condition_args', $args); /** * Fires after a condition is registered. * * @param string $condition Condition. * @param array $args Arguments used to register the condition. */ do_action('msa_registed_condition', $condition, $args); return $args; }
/** * Display the conditions within a category * * @access public * @param mixed $category The condition category. * @param object $post The WP_Post object. * @param mixed $data The audit data. * @param mixed $score The post score. * @return string $output The HTML output of the specifc condition category. */ function msa_display_condition_category_data($category, $post, $data, $score) { $total_weight = msa_get_total_conditions_weight(); $conditions = msa_get_conditions_from_category($category); $condition_categories = msa_get_condition_categories(); $conditions_weight = msa_get_total_weight_for_conditions($conditions); $post_score = $score['data']; $overall_score = 0; $output = '<table class="wp-list-table widefat striped posts msa-audit-table"> <thead> <th class="msa-condition-score-col">' . __('Score', 'msa') . '</th> <th class="msa-condition-weight-col">' . __('Weight', 'msa') . '</th> <th class="msa-condition-attribute-col">' . __('Attribute', 'msa') . '</th> <th class="msa-condition-goal-col">' . __('Goal', 'msa') . '</th> <th class="msa-condition-value-col">' . __('Value', 'msa') . '</th> </thead> <tbody>'; foreach ($conditions as $key => $condition) { // Goal. if (1 === $condition['comparison']) { $goal = __('Greater Than ' . $condition['min'], 'msa'); } else { if (2 === $condition['comparison']) { $goal = __('Less Than ' . $condition['max'], 'msa'); } else { if (3 === $condition['comparison']) { $goal = __('In Between ' . $condition['min'] . ' - ' . $condition['max'], 'msa'); } } } $score = apply_filters('msa_condition_category_content_score', round($post_score[$key] * 100) . '%', $data, $post, $key); $weight = apply_filters('msa_condition_category_content_weight', round($condition['weight'] / $total_weight * 100) . '%', $data, $post, $key); $name = apply_filters('msa_condition_category_content_name', $condition['name'], $data, $post, $key); $goal = apply_filters('msa_condition_category_content_goal', $goal, $data, $post, $key, $condition); $value = apply_filters('msa_condition_category_content_value', $data[$key], $data, $post, $key); $more_info = ''; if (isset($condition['description'])) { $learn_more = ''; if (isset($condition['learn_more_link'])) { $learn_more = '<div class="msa-modal-learn-more-link"> <a href="' . $condition['learn_more_link'] . '" target="_blank">' . __('Learn More', 'msa') . '</a> </div>'; } $more_info = '<span class="msa-condition-more-info" data-condition="' . $key . '"> <i class="fa fa-info-circle"></i> <div class="msa-modal" data-condition="' . $key . '"> <div class="msa-modal-container"> <div class="msa-modal-title"> <h3>' . $condition['name'] . '</h3> <a class="msa-modal-close">' . __('Close', 'msa') . '</a> </div> <div class="msa-modal-content">' . $condition['description'] . '</div>' . $learn_more . '</div> </div> </span>'; } $output .= '<tr class="msa-post-status msa-post-status-' . msa_get_score_status($post_score[$key]) . '"> <td class="msa-condition-score">' . $score . '</td> <td class="msa-condition-weight">' . $weight . '</td> <td class="msa-condition-name">' . $name . '</td> <td class="msa-condition-goal">' . $goal . '</td> <td class="msa-condition-value">' . $value . $more_info . '</td> </tr>'; $overall_score += $post_score[$key] * $condition['weight']; } $output .= '</tbody> </table> </div>'; $output = '<h3 class="msa-condition-category-heading hndle ui-sortable-handle"><span class="msa-condition-category-score msa-post-status-bg msa-post-status-bg-' . msa_get_score_status($overall_score / $conditions_weight) . '">' . round($overall_score / $conditions_weight * 100, 2) . '%</span> <span>' . $condition_categories[$category]['name'] . '</span><span style="float:right;">' . __('Weight: ', 'msa') . ' ' . round($conditions_weight / $total_weight * 100, 2) . '%</span></h3><div class="inside">' . $output; return $output; }