/** * Condition function to evaluate and display given block based on expressions * 'args' => arguments for evaluation fields * * Supported actions and symbols: * * Integer and floating-point numbers * Math operators: +, -, *, / * Comparison operators: <, >, =, <=, >=, != * Boolean operators: AND, OR, NOT * Nested expressions - several levels of brackets * Variables defined as shortcode parameters starting with a dollar sign * empty() function that checks for blank or non-existing fields * * */ function wpv_condition($atts) { extract(shortcode_atts(array('evaluate' => FALSE), $atts)); global $post; // if in admin, get the post from the URL if (is_admin()) { // Get post if (isset($_GET['post'])) { $post_id = (int) $_GET['post']; } else { if (isset($_POST['post_ID'])) { $post_id = (int) $_POST['post_ID']; } else { $post_id = 0; } } if ($post_id) { $post = get_post($post_id); } } global $wplogger; $logging_string = "Original expression: " . $evaluate; // evaluate empty() statements for variables $empties = preg_match_all("/empty\\(\\s*\\\$(\\w+)\\s*\\)/", $evaluate, $matches); if ($empties && $empties > 0) { for ($i = 0; $i < $empties; $i++) { $match_var = get_post_meta($post->ID, $atts[$matches[1][$i]], true); $is_empty = '1=0'; // mark as empty only nulls and "" if (is_null($match_var) || strlen($match_var) == 0) { $is_empty = '1=1'; } $evaluate = str_replace($matches[0][$i], $is_empty, $evaluate); } } // find string variables and evaluate $strings_count = preg_match_all('/((\\$\\w+)|(\'[^\']*\'))\\s*([\\!<>\\=]+)\\s*((\\$\\w+)|(\'[^\']*\'))/', $evaluate, $matches); // get all string comparisons - with variables and/or literals if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { // get both sides and sign $first_string = $matches[1][$i]; $second_string = $matches[5][$i]; $math_sign = $matches[4][$i]; // replace variables with text representation if (strpos($first_string, '$') === 0) { $variable_name = substr($first_string, 1); // omit dollar sign $first_string = get_post_meta($post->ID, $atts[$variable_name], true); } if (strpos($second_string, '$') === 0) { $variable_name = substr($second_string, 1); $second_string = get_post_meta($post->ID, $atts[$variable_name], true); } // remove single quotes from string literals to get value only $first_string = strpos($first_string, '\'') === 0 ? substr($first_string, 1, strlen($first_string) - 2) : $first_string; $second_string = strpos($second_string, '\'') === 0 ? substr($second_string, 1, strlen($second_string) - 2) : $second_string; // don't do string comparison if variables are numbers if (!(is_numeric($first_string) && is_numeric($second_string))) { // compare string and return true or false $compared_str_result = wpv_compare_strings($first_string, $second_string, $math_sign); if ($compared_str_result) { $evaluate = str_replace($matches[0][$i], '1=1', $evaluate); } else { $evaluate = str_replace($matches[0][$i], '1=0', $evaluate); } } } } // find all variable placeholders in expression $count = preg_match_all('/\\$(\\w+)/', $evaluate, $matches); $logging_string .= "; Variable placeholders: " . var_export($matches[1], true); // replace all variables with their values listed as shortcode parameters if ($count && $count > 0) { // sort array by length desc, fix str_replace incorrect replacement wpv_sort_matches_by_length(&$matches[1]); foreach ($matches[1] as $match) { $meta = get_post_meta($post->ID, $atts[$match], true); if (empty($meta)) { $meta = "0"; } $evaluate = str_replace('$' . $match, $meta, $evaluate); } } $logging_string .= "; End evaluated expression: " . $evaluate; $wplogger->log($logging_string, WPLOG_DEBUG); // evaluate the prepared expression using the custom eval script $result = wpv_evaluate_expression($evaluate); // return true, false or error string to the conditional caller return $result; }
/** * Condition function to evaluate and display given block based on expressions * 'args' => arguments for evaluation fields * * Supported actions and symbols: * * Integer and floating-point numbers * Math operators: +, -, *, / * Comparison operators: <, >, =, <=, >=, != * Boolean operators: AND, OR, NOT * Nested expressions - several levels of brackets * Variables defined as shortcode parameters starting with a dollar sign * empty() function that checks for blank or non-existing fields * * * @note As of 1.9, this is not used in Views anymore, seems to be used on the toolset-forms library */ function wpv_condition($atts, $post_to_check = null) { extract(shortcode_atts(array('evaluate' => FALSE), $atts)); // Do not overwrite global post // global $post; // if in admin, get the post from the URL if (is_admin()) { if (empty($post_to_check->ID)) { // Get post if (isset($_GET['post'])) { $post_id = (int) $_GET['post']; } else { if (isset($_POST['post_ID'])) { $post_id = (int) $_POST['post_ID']; } else { $post_id = 0; } } if ($post_id) { $post = get_post($post_id); } } else { $post = $post_to_check; } } if (empty($post->ID)) { global $post; } $has_post = true; if (empty($post->ID)) { // Will not execute any condition that involves custom fields $has_post = false; } global $wplogger; if ($has_post) { do_action('wpv_condition', $post); } $logging_string = "Original expression: " . $evaluate; add_filter('wpv-extra-condition-filters', 'wpv_add_time_functions'); $evaluate = apply_filters('wpv-extra-condition-filters', $evaluate); $logging_string .= "; After extra conditions: " . $evaluate; // evaluate empty() statements for variables if ($has_post) { $empties = preg_match_all("/empty\\(\\s*\\\$(\\w+)\\s*\\)/", $evaluate, $matches); if ($empties && $empties > 0) { for ($i = 0; $i < $empties; $i++) { $match_var = get_post_meta($post->ID, $atts[$matches[1][$i]], true); $is_empty = '1=0'; // mark as empty only nulls and "" // if ( is_null( $match_var ) || strlen( $match_var ) == 0 ) { if (is_null($match_var) || is_string($match_var) && strlen($match_var) == 0 || is_array($match_var) && empty($match_var)) { $is_empty = '1=1'; } $evaluate = str_replace($matches[0][$i], $is_empty, $evaluate); $logging_string .= "; After empty: " . $evaluate; } } } // find variables that are to be used as strings. // eg '$f1' // will replace $f1 with the actual field value if ($has_post) { $strings_count = preg_match_all('/(\'[\\$\\w^\']*\')/', $evaluate, $matches); if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { $string = $matches[1][$i]; // remove single quotes from string literals to get value only $string = strpos($string, '\'') === 0 ? substr($string, 1, strlen($string) - 2) : $string; if (strpos($string, '$') === 0) { $variable_name = substr($string, 1); // omit dollar sign if (isset($atts[$variable_name])) { $string = get_post_meta($post->ID, $atts[$variable_name], true); $evaluate = str_replace($matches[1][$i], "'" . $string . "'", $evaluate); $logging_string .= "; After variables I: " . $evaluate; } } } } } // find string variables and evaluate $strings_count = preg_match_all('/((\\$\\w+)|(\'[^\']*\'))\\s*([\\!<>\\=]+)\\s*((\\$\\w+)|(\'[^\']*\'))/', $evaluate, $matches); // get all string comparisons - with variables and/or literals if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { // get both sides and sign $first_string = $matches[1][$i]; $second_string = $matches[5][$i]; $math_sign = $matches[4][$i]; // remove single quotes from string literals to get value only $first_string = strpos($first_string, '\'') === 0 ? substr($first_string, 1, strlen($first_string) - 2) : $first_string; $second_string = strpos($second_string, '\'') === 0 ? substr($second_string, 1, strlen($second_string) - 2) : $second_string; // replace variables with text representation if (strpos($first_string, '$') === 0 && $has_post) { $variable_name = substr($first_string, 1); // omit dollar sign if (isset($atts[$variable_name])) { $first_string = get_post_meta($post->ID, $atts[$variable_name], true); } else { $first_string = ''; } } if (strpos($second_string, '$') === 0 && $has_post) { $variable_name = substr($second_string, 1); if (isset($atts[$variable_name])) { $second_string = get_post_meta($post->ID, $atts[$variable_name], true); } else { $second_string = ''; } } // don't do string comparison if variables are numbers if (!(is_numeric($first_string) && is_numeric($second_string))) { // compare string and return true or false $compared_str_result = wpv_compare_strings($first_string, $second_string, $math_sign); if ($compared_str_result) { $evaluate = str_replace($matches[0][$i], '1=1', $evaluate); } else { $evaluate = str_replace($matches[0][$i], '1=0', $evaluate); } } else { $evaluate = str_replace($matches[1][$i], $first_string, $evaluate); $evaluate = str_replace($matches[5][$i], $second_string, $evaluate); } $logging_string .= "; After variables II: " . $evaluate; } } // find remaining strings that maybe numeric values. // This handles 1='1' $strings_count = preg_match_all('/(\'[^\']*\')/', $evaluate, $matches); if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { $string = $matches[1][$i]; // remove single quotes from string literals to get value only $string = strpos($string, '\'') === 0 ? substr($string, 1, strlen($string) - 2) : $string; if (is_numeric($string)) { $evaluate = str_replace($matches[1][$i], $string, $evaluate); $logging_string .= "; After variables III: " . $evaluate; } } } // find all variable placeholders in expression if ($has_post) { $count = preg_match_all('/\\$(\\w+)/', $evaluate, $matches); $logging_string .= "; Variable placeholders: " . var_export($matches[1], true); // replace all variables with their values listed as shortcode parameters if ($count && $count > 0) { // sort array by length desc, fix str_replace incorrect replacement $matches[1] = wpv_sort_matches_by_length($matches[1]); foreach ($matches[1] as $match) { if (isset($atts[$match])) { $meta = get_post_meta($post->ID, $atts[$match], true); if (empty($meta)) { $meta = "0"; } } else { $meta = "0"; } $evaluate = str_replace('$' . $match, $meta, $evaluate); $logging_string .= "; After variables IV: " . $evaluate; } } } $logging_string .= "; End evaluated expression: " . $evaluate; $wplogger->log($logging_string, WPLOG_DEBUG); // evaluate the prepared expression using the custom eval script $result = wpv_evaluate_expression($evaluate); if ($has_post) { do_action('wpv_condition_end', $post); } // return true, false or error string to the conditional caller return $result; }
/** * Condition function to evaluate and display given block based on expressions * * Supported actions and symbols: * * Integer and floating-point numbers * Math operators: +, -, *, / * Comparison operators: <, >, =, <=, >=, != * Boolean operators: AND, OR, NOT * Nested expressions - several levels of brackets * Variables defined as shortcode parameters starting with a dollar sign * empty() function that checks for blank or non-existing fields * * @global type $wplogger * @param type $evaluate * @param type $fields * @return type */ protected function _wpv_condition($evaluate, $fields) { global $wplogger; $logging_string = "Original expression: " . $evaluate; add_filter('wpv-extra-condition-filters', 'wpv_add_time_functions'); $evaluate = apply_filters('wpv-extra-condition-filters', $evaluate); // evaluate empty() statements for variables // $empties = preg_match_all( "/empty\(\s*\\$(\w+)\s*\)/", $evaluate, // $matches ); $empties = preg_match_all("/empty\\(\\s*\\\$([\\w_-]+)\\s*\\)/", $evaluate, $matches); if ($empties && $empties > 0) { for ($i = 0; $i < $empties; $i++) { $match_var = $this->_getValue($fields[$matches[1][$i]]); $is_empty = '1=0'; // mark as empty only nulls and "" // if ( is_null( $match_var ) || strlen( $match_var ) == 0 ) { if (is_null($match_var) || is_string($match_var) && strlen($match_var) == 0 || is_array($match_var) && empty($match_var)) { $is_empty = '1=1'; } $evaluate = str_replace($matches[0][$i], $is_empty, $evaluate); } } // find variables that are to be used as strings. // eg '$f1' // will replace $f1 with the actual field value $strings_count = preg_match_all('/(\'[\\$\\w^\']*\')/', $evaluate, $matches); if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { $string = $matches[1][$i]; // remove single quotes from string literals to get value only $string = strpos($string, '\'') === 0 ? substr($string, 1, strlen($string) - 2) : $string; if (strpos($string, '$') === 0) { $variable_name = substr($string, 1); // omit dollar sign if (isset($fields[$variable_name])) { $string = $this->_getValue($fields[$variable_name]); $evaluate = str_replace($matches[1][$i], "'" . $string . "'", $evaluate); } } } } // find string variables and evaluate // $strings_count = preg_match_all( '/((\$\w+)|(\'[^\']*\'))\s*([\!<>\=]+)\s*((\$\w+)|(\'[^\']*\'))/', // $evaluate, $matches ); $strings_count = preg_match_all('/((\\$[\\w_-]+)|([\'\\d][^\']*[\'\\d]))\\s*([\\!<>\\=]+)\\s*((\\$[\\w_-]+)|([\'\\d][^\']*[\'\\d]))/', $evaluate, $matches); // get all string comparisons - with variables and/or literals if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { // get both sides and sign $first_string = $matches[1][$i]; $second_string = $matches[5][$i]; $math_sign = $matches[4][$i]; // remove single quotes from string literals to get value only $first_string = strpos($first_string, '\'') === 0 ? substr($first_string, 1, strlen($first_string) - 2) : $first_string; $second_string = strpos($second_string, '\'') === 0 ? substr($second_string, 1, strlen($second_string) - 2) : $second_string; // replace variables with text representation if (strpos($first_string, '$') === 0) { $variable_name = substr($first_string, 1); // omit dollar sign if (isset($fields[$variable_name])) { $first_string = $this->_getValue($fields[$variable_name]); } else { $first_string = ''; } } if (strpos($second_string, '$') === 0) { $variable_name = substr($second_string, 1); if (isset($fields[$variable_name])) { $second_string = $this->_getValue($fields[$variable_name]); } else { $second_string = ''; } } // don't do string comparison if variables are numbers if (is_numeric($first_string) && !is_numeric($second_string) || !is_numeric($first_string) && is_numeric($second_string)) { $evaluate = str_replace($matches[0][$i], '1=0', $evaluate); } else { if (!(is_numeric($first_string) && is_numeric($second_string))) { // compare string and return true or false $compared_str_result = wpv_compare_strings($first_string, $second_string, $math_sign); if ($compared_str_result) { $evaluate = str_replace($matches[0][$i], '1=1', $evaluate); } else { $evaluate = str_replace($matches[0][$i], '1=0', $evaluate); } } else { $evaluate = str_replace($matches[1][$i], $first_string, $evaluate); $evaluate = str_replace($matches[5][$i], $second_string, $evaluate); } } } } // find remaining strings that maybe numeric values. // This handles 1='1' $strings_count = preg_match_all('/(\'[^\']*\')/', $evaluate, $matches); if ($strings_count && $strings_count > 0) { for ($i = 0; $i < $strings_count; $i++) { $string = $matches[1][$i]; // remove single quotes from string literals to get value only $string = strpos($string, '\'') === 0 ? substr($string, 1, strlen($string) - 2) : $string; if (is_numeric($string)) { $evaluate = str_replace($matches[1][$i], $string, $evaluate); } } } // find all variable placeholders in expression // $count = preg_match_all( '/\$(\w+)/', $evaluate, $matches ); $count = preg_match_all('/\\$([\\w-_]+)/', $evaluate, $matches); $logging_string .= "; Variable placeholders: " . var_export($matches[1], true); // replace all variables with their values listed as shortcode parameters if ($count && $count > 0) { // sort array by length desc, fix str_replace incorrect replacement $matches[1] = wpv_sort_matches_by_length($matches[1]); foreach ($matches[1] as $match) { if (isset($fields[$match])) { $meta = $this->_getValue($fields[$match]); if (empty($meta)) { $meta = "0"; } } else { $meta = "0"; } $evaluate = str_replace('$' . $match, $meta, $evaluate); } } $logging_string .= "; End evaluated expression: " . $evaluate; $wplogger->log($logging_string, WPLOG_DEBUG); // evaluate the prepared expression using the custom eval script $result = wpv_evaluate_expression($evaluate); // return true, false or error string to the conditional caller return $result; }