- WordPress core y plugins - Tema Twenty Twenty-Four configurado - Plugin allow-unfiltered-html.php simplificado - .gitignore configurado para excluir wp-config.php y uploads 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2869 lines
86 KiB
PHP
Executable File
2869 lines
86 KiB
PHP
Executable File
<?php
|
|
/* Prevent direct access */
|
|
|
|
use WPDRMS\ASP\Frontend\FiltersManager;
|
|
use WPDRMS\ASP\Utils\FrontendFilters;
|
|
use WPDRMS\ASP\Utils\MB;
|
|
use WPDRMS\ASP\Utils\Polylang\StringTranslations as PolylangStringTranslations;
|
|
use WPDRMS\ASP\Utils\Post;
|
|
use WPDRMS\ASP\Utils\PostMeta;
|
|
use WPDRMS\ASP\Utils\Str;
|
|
|
|
defined('ABSPATH') or die("You can't access this file directly.");
|
|
|
|
/**
|
|
* FILE CONTENTS:
|
|
* 1. BASIC FUNCTIONS
|
|
* 2. FILE SYSTEM SPECIFIC WRAPPERS
|
|
* 3. TAXONOMY AND TERM SPECIFIC
|
|
* 4. BACK-END SPECIFIC
|
|
* 5. NON-AJAX RESULTS
|
|
* 6. FRONT-END
|
|
* 7. Polyfill
|
|
*/
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 1. BASIC FUNCTIONS
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
if ( !function_exists('wpd_get_terms') ) {
|
|
function wpd_get_terms( $args = array() ) {
|
|
return get_terms($args);
|
|
}
|
|
}
|
|
|
|
if ( ! function_exists( 'asp_bfi_thumb' ) ) {
|
|
function asp_bfi_thumb( $url, $params = array(), $single = true ) {
|
|
return call_user_func( array( '\\WPDRMS\\ASP\\Cache\\BFI_Thumb_1_3', 'thumb' ), $url, $params, $single );
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('wpd_get_languages_array') ) {
|
|
/* Get WPML or Polylang languages list in array */
|
|
function wpd_get_languages_array() {
|
|
$langs = array();
|
|
if ( function_exists('pll_languages_list') ) {
|
|
$_langs = pll_languages_list(
|
|
array(
|
|
'fields' => 'slug',
|
|
)
|
|
);
|
|
if ( is_array($_langs) ) {
|
|
foreach ( $_langs as $key => $_lang ) {
|
|
$langs[ $_lang ] = $_lang;
|
|
}
|
|
}
|
|
} elseif ( function_exists('icl_get_languages') ) {
|
|
$_langs = icl_get_languages('skip_missing=0&orderby=KEY&order=DIR&link_empty_to=str');
|
|
if ( is_array($_langs) ) {
|
|
foreach ( array_reverse($_langs) as $key => $_lang ) {
|
|
$langs[ $_lang['language_code'] ] = $_lang['translated_name'];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $langs;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_get_inner_substring') ) {
|
|
/**
|
|
* Get the string from inbetween delimiters
|
|
*
|
|
* @param $string
|
|
* @param $delim
|
|
* @return string
|
|
*/
|
|
function asp_get_inner_substring( $string, $delim ) {
|
|
|
|
$s = explode($delim, $string, 3); // also, we only need 2 items at most
|
|
return isset($s[1]) ? $s[1] : '';
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_get_outer_substring') ) {
|
|
/**
|
|
* Get the string from outside the delimiters
|
|
*
|
|
* @param $string
|
|
* @param $delim
|
|
* @return string
|
|
*/
|
|
function asp_get_outer_substring( $string, $delim ) {
|
|
$s = explode($delim, $string, 3); // also, we only need 2 items at most
|
|
return isset($s[0], $s[2]) ? $s[0] . $s[2] : $string;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpd_comma_separated_to_array') ) {
|
|
/**
|
|
* @param $string - Input string to convert to array
|
|
* @param string $separator - Separator to separate by (default: ,)
|
|
*
|
|
* @return array
|
|
*/
|
|
function wpd_comma_separated_to_array( $string, $separator = ',' ) {
|
|
// Explode on comma
|
|
$vals = explode($separator, $string);
|
|
|
|
// Trim whitespace
|
|
foreach ( $vals as $key => $val ) {
|
|
$vals[ $key ] = trim($val);
|
|
}
|
|
// Return empty array if no items found
|
|
// http://php.net/manual/en/function.explode.php#114273
|
|
return array_diff($vals, array( '' ));
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_strip_tags_ws') ) {
|
|
/**
|
|
* Strips tags, but replaces them with whitespace
|
|
*
|
|
* @param string $string
|
|
* @param string $allowable_tags
|
|
* @return string
|
|
* @link https://stackoverflow.com/a/38200395
|
|
*/
|
|
function wd_strip_tags_ws( $string, $allowable_tags = '' ) {
|
|
$string = str_replace('<', ' <', $string);
|
|
// Non breakable spaces to regular spaces
|
|
$string = preg_replace('/\xc2\xa0/', ' ', $string);
|
|
// Duplicated spaces
|
|
$string = preg_replace('/\s+/', ' ', $string);
|
|
$string = strip_tags($string, $allowable_tags);
|
|
$string = trim($string);
|
|
|
|
return $string;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_closetags') ) {
|
|
/**
|
|
* Close unclosed HTML tags
|
|
*
|
|
* @param $html
|
|
* @return string
|
|
*/
|
|
function wd_closetags( $html ) {
|
|
$html = trim($html);
|
|
$unpaired = array( 'hr', 'br', 'img' );
|
|
|
|
// put all opened tags into an array
|
|
preg_match_all( '#<([a-z]+)( .*)?(?!/)>#iU', $html, $result );
|
|
$openedtags = $result[1];
|
|
// remove unpaired tags
|
|
if ( is_array($openedtags) && count($openedtags) >0 ) {
|
|
foreach ( $openedtags as $k =>$tag ) {
|
|
if ( in_array($tag, $unpaired) ) {
|
|
unset($openedtags[ $k ]);
|
|
}
|
|
}
|
|
} else {
|
|
// Replace a possible un-closed tag from the end, 30 characters backwards check
|
|
$html = preg_replace('/(.*)(\<[a-zA-Z]{0,30})$/', '$1', $html);
|
|
return $html;
|
|
}
|
|
// put all closed tags into an array
|
|
preg_match_all( '#</([a-z]+)>#iU', $html, $result );
|
|
$closedtags = $result[1];
|
|
$len_opened = count( $openedtags );
|
|
// all tags are closed
|
|
if ( count( $closedtags ) == $len_opened ) {
|
|
// Replace a possible un-closed tag from the end, 30 characters backwards check
|
|
$html = preg_replace('/(.*)(\<[a-zA-Z]{0,30})$/', '$1', $html);
|
|
return $html;
|
|
}
|
|
$openedtags = array_reverse( $openedtags );
|
|
// close tags
|
|
for ( $i = 0; $i < $len_opened; $i++ ) {
|
|
if ( !in_array( $openedtags[ $i ], $closedtags ) ) {
|
|
$html .= '</' . $openedtags[ $i ] . '>';
|
|
} else {
|
|
unset( $closedtags[ array_search( $openedtags[ $i ], $closedtags) ] );
|
|
}
|
|
}
|
|
|
|
// Replace a possible un-closed tag from the end, 30 characters backwards check
|
|
$html = preg_replace('/(.*)(\<[a-zA-Z]{0,30})$/', '$1', $html);
|
|
return $html;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_mysql_escape_mimic') ) {
|
|
/**
|
|
* Mimics the old mysql_escape function
|
|
*
|
|
* @internal
|
|
* @param $inp
|
|
* @return mixed
|
|
*/
|
|
function wd_mysql_escape_mimic( $inp ) {
|
|
if ( is_array($inp) ) {
|
|
return array_map(__METHOD__, $inp);
|
|
}
|
|
|
|
if ( !empty($inp) && is_string($inp) ) {
|
|
return str_replace(array( '\\', "\0", "\n", "\r", "'", '"', "\x1a" ), array( '\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z' ), $inp);
|
|
}
|
|
|
|
return $inp;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_substr_at_word') ) {
|
|
/**
|
|
* Substring cut off at word endings
|
|
*
|
|
* @param $text
|
|
* @param $length
|
|
* @param $suffix
|
|
* @param $tolerance
|
|
* @return string
|
|
*/
|
|
function wd_substr_at_word( $text, $length, $suffix = ' ...', $tolerance = 8 ) {
|
|
|
|
if ( function_exists('mb_strlen') &&
|
|
function_exists('mb_strrpos') &&
|
|
function_exists('mb_substr')
|
|
) {
|
|
$fn_strlen = 'mb_strlen';
|
|
$fn_strrpos = 'mb_strrpos';
|
|
$fn_substr = 'mb_substr';
|
|
} else {
|
|
$fn_strlen = 'strlen';
|
|
$fn_strrpos = 'strrpos';
|
|
$fn_substr = 'substr';
|
|
}
|
|
|
|
if ( $fn_strlen($text) <= $length ) {
|
|
return $text;
|
|
}
|
|
|
|
$s = $fn_substr($text, 0, $length);
|
|
$s = $fn_substr($s, 0, $fn_strrpos($s, ' '));
|
|
|
|
// In case of a long mash-up, it will not let overflow the length
|
|
if ( $fn_strlen($s) > ( $length + $tolerance ) ) {
|
|
$s = $fn_substr($s, 0, ( $length + $tolerance ));
|
|
}
|
|
|
|
if ( $suffix != '' && $fn_strlen($s) != $fn_strlen($text) ) {
|
|
$s .= $suffix;
|
|
}
|
|
|
|
return $s;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_in_array_r') ) {
|
|
/**
|
|
* Recursive in_array
|
|
*
|
|
* @param $needle
|
|
* @param $haystack
|
|
* @param bool $strict
|
|
* @return bool
|
|
*/
|
|
function wd_in_array_r( $needle, $haystack, $strict = false ) {
|
|
foreach ( $haystack as $item ) {
|
|
if ( ( $strict ? $item === $needle : $item == $needle ) || ( is_array($item) && wd_in_array_r($needle, $item, $strict) ) ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_array_merge_recursive_distinct') ) {
|
|
/**
|
|
* array_merge_recursive does indeed merge arrays, but it converts values with duplicate
|
|
* keys to arrays rather than overwriting the value in the first array with the duplicate
|
|
* value in the second array, as array_merge does. I.e., with array_merge_recursive,
|
|
* this happens (documented behavior):
|
|
*
|
|
* array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
|
|
* => array('key' => array('org value', 'new value'));
|
|
*
|
|
* array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
|
|
* Matching keys' values in the second array overwrite those in the first array, as is the
|
|
* case with array_merge, i.e.:
|
|
*
|
|
* array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
|
|
* => array('key' => array('new value'));
|
|
*
|
|
* Parameters are passed by reference, though only for performance reasons. They're not
|
|
* altered by this function. -> ASP COMMENT: removed to be able to used with CONST constants
|
|
*
|
|
* @param array $array1
|
|
* @param array $array2
|
|
* @return array
|
|
* @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk>
|
|
* @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com>
|
|
*/
|
|
function wd_array_merge_recursive_distinct( array $array1, array $array2 ) {
|
|
$merged = $array1;
|
|
foreach ( $array2 as $key => &$value ) {
|
|
if ( is_array($value) && isset($merged [ $key ]) && is_array($merged [ $key ]) ) {
|
|
$merged [ $key ] = wd_array_merge_recursive_distinct($merged [ $key ], $value);
|
|
} else {
|
|
$merged [ $key ] = $value;
|
|
}
|
|
}
|
|
|
|
return $merged;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_flatten_array') ) {
|
|
/**
|
|
* Flattens array without preserving the keys
|
|
*
|
|
* @param mixed $array
|
|
* @return array<int, mixed>
|
|
*/
|
|
function wd_flatten_array( array $array ): array {
|
|
$recursiveArrayIterator = new RecursiveArrayIterator(
|
|
$array,
|
|
RecursiveArrayIterator::CHILD_ARRAYS_ONLY
|
|
);
|
|
$iterator = new RecursiveIteratorIterator($recursiveArrayIterator);
|
|
|
|
return iterator_to_array($iterator, false);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_array_super_unique') ) {
|
|
function wd_array_super_unique( $array, $key ) {
|
|
$temp_array = array();
|
|
foreach ( $array as &$v ) {
|
|
if ( !isset($temp_array[ $v[ $key ] ]) ) {
|
|
$temp_array[ $v[ $key ] ] =& $v;
|
|
}
|
|
}
|
|
$array = array_values($temp_array);
|
|
return $array;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wd_current_page_url') ) {
|
|
/**
|
|
* Returns the current page url
|
|
*
|
|
* @return string
|
|
*/
|
|
function wd_current_page_url() {
|
|
$pageURL = 'http';
|
|
|
|
$port = !empty($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 80;
|
|
|
|
$server_name = !empty($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
|
|
$server_name = empty($server_name) && !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $server_name;
|
|
|
|
if ( isset($_SERVER['HTTPS']) ) {
|
|
if ( $_SERVER['HTTPS'] == 'on' ) {
|
|
$pageURL .= 's';}
|
|
}
|
|
$pageURL .= '://';
|
|
if ( $port != '80' ) {
|
|
$pageURL .= $server_name . ':' . $port . $_SERVER['REQUEST_URI'];
|
|
} else {
|
|
$pageURL .= $server_name . $_SERVER['REQUEST_URI'];
|
|
}
|
|
return $pageURL;
|
|
}
|
|
}
|
|
if ( !function_exists('wpdreams_hex2rgb') ) {
|
|
/**
|
|
* HEX to RGB string conversion
|
|
*
|
|
* Works both 3-6 lengths, with or without hash tags
|
|
*
|
|
* @param $color
|
|
* @return bool|string
|
|
* @uses wpdreams_rgb2hex()
|
|
*/
|
|
function wpdreams_hex2rgb( $color ) {
|
|
if ( strlen($color) >7 ) {
|
|
$color = wpdreams_rgb2hex($color);
|
|
}
|
|
if ( strlen($color) >7 ) {
|
|
return $color;
|
|
}
|
|
if ( strlen($color) <3 ) {
|
|
return '0, 0, 0';
|
|
}
|
|
if ( $color[0] == '#' ) {
|
|
$color = substr($color, 1);
|
|
}
|
|
if ( strlen($color) == 6 ) {
|
|
list($r, $g, $b) = array(
|
|
$color[0] . $color[1],
|
|
$color[2] . $color[3],
|
|
$color[4] . $color[5],
|
|
);
|
|
} elseif ( strlen($color) == 3 ) {
|
|
list($r, $g, $b) = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
|
|
} else {
|
|
return false;
|
|
}
|
|
$r = hexdec($r);
|
|
$g = hexdec($g);
|
|
$b = hexdec($b);
|
|
return $r . ', ' . $g . ', ' . $b;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_rgb2hex') ) {
|
|
/**
|
|
* RGB to HEX string converter
|
|
*
|
|
* @param $color
|
|
* @return string
|
|
*/
|
|
function wpdreams_rgb2hex( $color ) {
|
|
if ( strlen($color) >7 ) {
|
|
preg_match('/.*?\((\d+), (\d+), (\d+).*?/', $color, $c);
|
|
if ( is_array($c) && count($c) >3 ) {
|
|
$color = '#' . sprintf('%02X', $c[1]);
|
|
$color .= sprintf('%02X', $c[2]);
|
|
$color .= sprintf('%02X', $c[3]);
|
|
}
|
|
}
|
|
return $color;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_get_image_from_content') ) {
|
|
/**
|
|
* Gets an image from the HTML content
|
|
*
|
|
* @param $content
|
|
* @param int $number
|
|
* @param array|string $exclude
|
|
* @return bool|string
|
|
*/
|
|
function asp_get_image_from_content( $content, $number = 0, $exclude = array() ) {
|
|
if ( $content == '' || !class_exists('\\domDocument') ) {
|
|
return false;
|
|
}
|
|
|
|
if ( function_exists('mb_encode_numericentity') ) {
|
|
$encoded_content = mb_encode_numericentity(
|
|
htmlspecialchars_decode(
|
|
htmlentities( $content, ENT_NOQUOTES, 'UTF-8', false ),
|
|
ENT_NOQUOTES
|
|
),
|
|
array( 0x80, 0x10FFFF, 0, ~0 ),
|
|
'UTF-8'
|
|
);
|
|
} else {
|
|
$encoded_content = $content;
|
|
}
|
|
|
|
if ( $encoded_content === '' ) {
|
|
return false;
|
|
}
|
|
|
|
// The arguments expects 1 as the first image, while it is the 0th
|
|
$number = intval($number) - 1;
|
|
$number = $number < 0 ? 0 : $number;
|
|
|
|
if ( !is_array($exclude) ) {
|
|
$exclude = strval($exclude);
|
|
$exclude = explode(',', $exclude);
|
|
}
|
|
foreach ( $exclude as $k => &$v ) {
|
|
$v = trim($v);
|
|
if ( $v == '' ) {
|
|
unset($exclude[ $k ]);
|
|
}
|
|
}
|
|
|
|
$elements = array( 'img', 'div' );
|
|
$attributes = array(
|
|
'src',
|
|
'data-src-fg',
|
|
'data-img',
|
|
'data-image',
|
|
'data-thumbnail',
|
|
'data-thumb',
|
|
'data-imgsrc',
|
|
);
|
|
$im = false;
|
|
|
|
foreach ( $elements as $element ) {
|
|
$dom = new \domDocument();
|
|
@$dom->loadHTML($encoded_content);
|
|
$dom->preserveWhiteSpace = false;
|
|
@$images = $dom->getElementsByTagName($element);
|
|
if ( $images->length > 0 ) {
|
|
$get = $images->length > $number ? $number : 0;
|
|
for ( $i =$get;$i <$images->length;$i++ ) {
|
|
foreach ( $attributes as $att ) {
|
|
$im = $images->item($i)->getAttribute($att);
|
|
if ( !empty($im) ) {
|
|
break;
|
|
}
|
|
}
|
|
foreach ( $exclude as $ex ) {
|
|
if ( strpos($im, $ex) !== false ) {
|
|
$im = '';
|
|
continue 2;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if ( $im != '' ) {
|
|
return $im;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Still no image
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_kses_content') ) {
|
|
function asp_kses_content( string $content ): string {
|
|
$tags = wp_kses_allowed_html('post');
|
|
$tags['input'] = array(
|
|
'value' => true,
|
|
'min' => true,
|
|
'max' => true,
|
|
'name' => true,
|
|
'type' => true,
|
|
'class' => true,
|
|
'size' => true,
|
|
'pattern' => true,
|
|
'inputmode' => true,
|
|
);
|
|
if ( isset($tags['a']) ) {
|
|
$tags['a']['style'] = true;
|
|
} else {
|
|
$tags['a'] = array(
|
|
'class' => true,
|
|
'style' => true,
|
|
);
|
|
}
|
|
return wp_kses($content, $tags);
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('wpdreams_get_image_from_content') ) {
|
|
/* Backwards compatibility */
|
|
function wpdreams_get_image_from_content( $content, $number ) {
|
|
return asp_get_image_from_content($content, $number);
|
|
}
|
|
}
|
|
|
|
/* Extra Functions */
|
|
if ( !function_exists('wd_isEmpty') ) {
|
|
/**
|
|
* @param $v
|
|
* @return bool
|
|
*/
|
|
function wd_isEmpty( $v ) {
|
|
if ( trim($v) != '' ) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_on_backend_post_editor') ) {
|
|
/**
|
|
* Checks if current page is the post editor
|
|
*
|
|
* @return bool
|
|
*/
|
|
function wpdreams_on_backend_post_editor() {
|
|
$current_url = wd_current_page_url();
|
|
return ( strpos($current_url, 'post-new.php') !==false ||
|
|
strpos($current_url, 'post.php') !==false );
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpd_mem_convert') ) {
|
|
/**
|
|
* Converts number to memory value with units
|
|
*
|
|
* @param $size
|
|
* @return string
|
|
*/
|
|
function wpd_mem_convert( $size ) {
|
|
if ( $size <= 0 ) {
|
|
return '0B';
|
|
}
|
|
$unit =array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB' );
|
|
return @round($size /pow(1024, ( $i =floor(log($size, 1024)) )), 2) . ' ' . $unit[ $i ];
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_get_search_query') ) {
|
|
function asp_get_search_query() {
|
|
return isset($_GET['asp_ls']) ? esc_attr(stripslashes($_GET['asp_ls'])) : get_search_query( false );
|
|
}
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 3. TAXONOMY AND TERM SPECIFIC
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
if ( !function_exists('wd_sort_terms_hierarchicaly') ) {
|
|
/**
|
|
* Recursively sort an array of taxonomy terms hierarchically. Child categories will be
|
|
* placed under a 'children' member of their parent term. Handles missing parent categories as well.
|
|
*
|
|
* @param Array $cats taxonomy term objects to sort, use get_terms(..)
|
|
* @param Array $into result array to put them in
|
|
* @param integer $parentId the current parent ID to put them in
|
|
* @param integer $depth the current recursion depth
|
|
*/
|
|
function wd_sort_terms_hierarchicaly( array &$cats, array &$into, $parentId = 0, $depth = 0 ) {
|
|
foreach ( $cats as $i => $cat ) {
|
|
if ( $cat->parent == $parentId ) {
|
|
$into[ $cat->term_id ] = $cat;
|
|
unset($cats[ $i ]);
|
|
}
|
|
}
|
|
|
|
foreach ( $into as $k => $topCat ) {
|
|
$into[ $k ]->children = array();
|
|
wd_sort_terms_hierarchicaly($cats, $into[ $k ]->children, $topCat->term_id, $depth + 1);
|
|
}
|
|
|
|
// Use a copy to go through, as the original is modified
|
|
$copy_cats = $cats;
|
|
|
|
// Try the remaining - the first parent might be excluded
|
|
if ( is_array($copy_cats) && $depth == 0 ) {
|
|
foreach ( $copy_cats as $k => $topCat ) {
|
|
// This item might not exist in the original array, check it first
|
|
if ( isset($cats[ $k ]) ) {
|
|
$cats[ $k ]->children = array();
|
|
wd_sort_terms_hierarchicaly($cats, $cats[ $k ]->children, $topCat->term_id, $depth + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Still any remaining for some satanic reason? Put the rest to the end...
|
|
if ( is_array($cats) && $depth == 0 ) {
|
|
foreach ( $cats as $i => $cat ) {
|
|
$into[ $cat->term_id ] = $cat;
|
|
unset( $cats[ $i ] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('wd_flatten_hierarchical_terms') ) {
|
|
/**
|
|
* Flattens a hierarchical array of terms into a flat array, marking levels.
|
|
* Keeps ordering, sets a $cat->level attribute
|
|
*
|
|
* @param Array $cats Taxonomy term objects to sort, use get_terms(..)
|
|
* @param Array $into Target array
|
|
* @param int $level The current recursion depth
|
|
*/
|
|
function wd_flatten_hierarchical_terms( array &$cats, array &$into, $level = 0 ) {
|
|
foreach ( $cats as $i => $cat ) {
|
|
$cat->level = $level;
|
|
$into[] = $cat;
|
|
if ( isset($cat->children) && count($cat->children) > 0 ) {
|
|
wd_flatten_hierarchical_terms( $cat->children, $into, $level + 1 );
|
|
}
|
|
}
|
|
|
|
// We don't need the children structure
|
|
foreach ( $into as $cat ) {
|
|
unset($cat->children);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 4. BACK-END SPECIFIC
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
if ( !function_exists('w_isset_def') ) {
|
|
function w_isset_def( &$v, $d ) {
|
|
if ( isset($v) ) {
|
|
return $v;
|
|
}
|
|
return $d;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_parse_params') ) {
|
|
/**
|
|
* This method is intended to use on params BEFORE written into the DB
|
|
*
|
|
* @param $params
|
|
* @return mixed
|
|
*/
|
|
function wpdreams_parse_params( $params ) {
|
|
foreach ( $params as $k =>$v ) {
|
|
$_tmp = explode('classname-', $k);
|
|
if ( $_tmp !=null && count($_tmp) >1 ) {
|
|
ob_start();
|
|
$c = new $v('0', '0', $params[ $_tmp[1] ]);
|
|
$out = ob_get_clean();
|
|
$params[ 'selected-' . $_tmp[1] ] = $c->getSelected();
|
|
}
|
|
$_tmp = null;
|
|
$_tmp = explode('wpdfont-', $k);
|
|
if ( $_tmp !=null && count($_tmp) >1 ) {
|
|
ob_start();
|
|
$c = new $v('0', '0', $params[ $_tmp[1] ]);
|
|
$out = ob_get_clean();
|
|
$params[ 'import-' . $_tmp[1] ] = $c->getImport();
|
|
|
|
}
|
|
}
|
|
return $params;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_admin_hex2rgb') ) {
|
|
function wpdreams_admin_hex2rgb( $color ) {
|
|
if ( strlen($color) >7 ) {
|
|
return $color;
|
|
}
|
|
if ( strlen($color) <3 ) {
|
|
return 'rgba(0, 0, 0, 1)';
|
|
}
|
|
if ( $color[0] == '#' ) {
|
|
$color = substr($color, 1);
|
|
}
|
|
if ( strlen($color) == 6 ) {
|
|
list($r, $g, $b) = array(
|
|
$color[0] . $color[1],
|
|
$color[2] . $color[3],
|
|
$color[4] . $color[5],
|
|
);
|
|
} elseif ( strlen($color) == 3 ) {
|
|
list($r, $g, $b) = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
|
|
} else {
|
|
return false;
|
|
}
|
|
$r = hexdec($r);
|
|
$g = hexdec($g);
|
|
$b = hexdec($b);
|
|
return 'rgba(' . $r . ', ' . $g . ', ' . $b . ', 1)';
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_admin_rgb2hex') ) {
|
|
function wpdreams_admin_rgb2hex( $color ) {
|
|
if ( $color[0] == '#' ) {
|
|
return $color;
|
|
}
|
|
if ( strlen($color) == 6 ) {
|
|
return '#' . $color;
|
|
}
|
|
preg_match('/.*?\((.*?),[\s]*(.*?),[\s]*(.*?)[,\)]/', $color, $matches);
|
|
|
|
return '#' . dechex($matches[1]) . dechex($matches[2]) . dechex($matches[3]);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_four_to_string') ) {
|
|
function wpdreams_four_to_string( $data ) {
|
|
// 1.Top 2.Bottom 3.Right 4.Left
|
|
preg_match('/\|\|(.*?)\|\|(.*?)\|\|(.*?)\|\|(.*?)\|\|/', $data, $matches);
|
|
// 1.Top 3.Right 2.Bottom 4.Left
|
|
return $matches[1] . ' ' . $matches[3] . ' ' . $matches[2] . ' ' . $matches[4];
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_four_to_array') ) {
|
|
function wpdreams_four_to_array( $data ) {
|
|
// 1.Top 2.Bottom 3.Right 4.Left
|
|
preg_match('/\|\|(.*?)\|\|(.*?)\|\|(.*?)\|\|(.*?)\|\|/', $data, $matches);
|
|
// 1.Top 3.Right 2.Bottom 4.Left
|
|
return array(
|
|
'top' => $matches[1],
|
|
'right' => $matches[3],
|
|
'bottom' => $matches[2],
|
|
'left' => $matches[4],
|
|
);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_box_shadow_css') ) {
|
|
function wpdreams_box_shadow_css( $css ) {
|
|
$css = str_replace("\n", '', $css);
|
|
preg_match('/box-shadow:(.*?)px (.*?)px (.*?)px (.*?)px (.*?);/', $css, $matches);
|
|
$ci = $matches[5];
|
|
$hlength = $matches[1];
|
|
$vlength = $matches[2];
|
|
$blurradius = $matches[3];
|
|
$spread = $matches[4];
|
|
$moz_blur = ( $blurradius >2 ) ?$blurradius - 2 :0;
|
|
if ( $hlength ==0 && $vlength ==0 && $blurradius ==0 && $spread ==0 ) {
|
|
echo 'box-shadow: none;';
|
|
} else {
|
|
echo 'box-shadow:' . $hlength . 'px ' . $vlength . 'px ' . $moz_blur . 'px ' . $spread . 'px ' . $ci . ';';
|
|
echo '-webkit-box-shadow:' . $hlength . 'px ' . $vlength . 'px ' . $blurradius . 'px ' . $spread . 'px ' . $ci . ';';
|
|
echo '-ms-box-shadow:' . $hlength . 'px ' . $vlength . 'px ' . $blurradius . 'px ' . $spread . 'px ' . $ci . ';';
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_gradient_css') ) {
|
|
function wpd_gradient_get_color_only( $data ) {
|
|
if ( preg_match('/rgba\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*,\s*0\s*\)/', $data) ) {
|
|
return 'transparent';
|
|
}
|
|
|
|
preg_match('/.*\-(.*?)$/', $data, $matches);
|
|
if ( isset($matches[1]) ) {
|
|
return wpdreams_admin_hex2rgb($matches[1]);
|
|
} else {
|
|
return 'transparent';
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_gradient_css') ) {
|
|
function wpdreams_gradient_css( $data, $print = true ) {
|
|
|
|
$data = str_replace("\n", '', $data);
|
|
if ( $data == '' ) {
|
|
return '';
|
|
}
|
|
|
|
preg_match('/(.*?)-(.*?)-(.*?)-(.*)/', $data, $matches);
|
|
|
|
if ( !isset($matches[1]) || !isset($matches[2]) || !isset($matches[3]) ) {
|
|
// Probably only 1 color..
|
|
if ( $print ) {
|
|
echo 'background: ' . $data . ';';
|
|
}
|
|
return 'background: ' . $data . ';';
|
|
}
|
|
|
|
$type = $matches[1];
|
|
$deg = $matches[2];
|
|
$color1 = wpdreams_admin_hex2rgb($matches[3]);
|
|
$color2 = wpdreams_admin_hex2rgb($matches[4]);
|
|
$color1_hex = wpdreams_admin_rgb2hex($color1);
|
|
$color2_hex = wpdreams_admin_rgb2hex($color2);
|
|
|
|
// Check for full transparency
|
|
preg_match('/rgba\(.*?,.*?,.*?,[\s]*(.*?)\)/', $color1, $opacity1);
|
|
preg_match('/rgba\(.*?,.*?,.*?,[\s]*(.*?)\)/', $color2, $opacity2);
|
|
if ( isset($opacity1[1]) && $opacity1[1] == '0' && isset($opacity2[1]) && $opacity2[1] == '0' ) {
|
|
if ( $print ) {
|
|
echo 'background: transparent;';
|
|
}
|
|
return 'background: transparent;';
|
|
}
|
|
|
|
ob_start();
|
|
|
|
if ( $type !='0' || $type !=0 ) {
|
|
?>
|
|
background-image: -webkit-linear-gradient(<?php echo $deg; ?>deg, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -moz-linear-gradient(<?php echo $deg; ?>deg, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -o-linear-gradient(<?php echo $deg; ?>deg, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -ms-linear-gradient(<?php echo $deg; ?>deg, <?php echo $color1; ?> 0%, <?php echo $color2; ?> 100%);
|
|
background-image: linear-gradient(<?php echo $deg; ?>deg, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
<?php
|
|
} else {
|
|
// radial
|
|
?>
|
|
background-image: -moz-radial-gradient(center, ellipse cover, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -webkit-radial-gradient(center, ellipse cover, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -o-radial-gradient(center, ellipse cover, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: -ms-radial-gradient(center, ellipse cover, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
background-image: radial-gradient(ellipse at center, <?php echo $color1; ?>, <?php echo $color2; ?>);
|
|
<?php
|
|
}
|
|
$out = ob_get_clean();
|
|
if ( $print ) {
|
|
echo $out;
|
|
}
|
|
return $out;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_border_width') ) {
|
|
function wpdreams_border_width( $css ) {
|
|
$css = str_replace("\n", '', $css);
|
|
preg_match('/border:(.*?)px (.*?) (.*?);/', $css, $matches);
|
|
|
|
return intval($matches[1]);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('wpdreams_width_from_px') ) {
|
|
function wpdreams_width_from_px( $css ) {
|
|
$css = str_replace("\n", '', $css);
|
|
preg_match('/(.*?)px/', $css, $matches);
|
|
|
|
return intval($matches[1]);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 5. NON-AJAX RESULTS
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
if ( !class_exists('ASP_Post') ) {
|
|
/**
|
|
* Class ASP_Post
|
|
*
|
|
* A default class to instantiate to generate post like results.
|
|
*/
|
|
class ASP_Post {
|
|
|
|
public $ID = 0; // Don't use negative value, because WPML will break into pieces
|
|
public $post_title = '';
|
|
public $post_author = '';
|
|
public $post_name = '';
|
|
public $post_type = 'post'; // Everything unknown is going to be a post
|
|
public $post_date = '0000-00-00 00:00:00'; // Format: 0000-00-00 00:00:00
|
|
public $post_date_gmt = '0000-00-00 00:00:00'; // Format: 0000-00-00 00:00:00
|
|
public $post_content = ''; // The full content of the post
|
|
public $post_content_filtered = '';
|
|
public $post_excerpt = ''; // User-defined post excerpt
|
|
public $post_status = 'publish'; // See get_post_status for values
|
|
public $comment_status = 'closed'; // Returns: { open, closed }
|
|
public $ping_status = 'closed'; // Returns: { open, closed }
|
|
public $post_password = ''; // Returns empty string if no password
|
|
public $post_parent = 0; // Parent Post ID (default 0)
|
|
public $post_mime_type = '';
|
|
public $to_ping = '';
|
|
public $pinged = '';
|
|
public $post_modified = ''; // Format: 0000-00-00 00:00:00
|
|
public $post_modified_gmt = ''; // Format: 0000-00-00 00:00:00
|
|
public $comment_count = 0; // Number of comments on post (numeric string)
|
|
public $menu_order = 0; // Order value as set through page-attribute when enabled (numeric string. Defaults to 0)
|
|
public $guid = '';
|
|
public $asp_guid;
|
|
public $asp_id;
|
|
public $asp_data; // All the original results data
|
|
public $blogid;
|
|
|
|
public function __construct() {}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_results_to_wp_obj') ) {
|
|
/**
|
|
* Converts ajax results from Ajax Search Pro to post like objects to be displayable
|
|
* on the regular search results page.
|
|
*
|
|
* @param $results
|
|
* @param int $from
|
|
* @param string $count
|
|
* @return array
|
|
*/
|
|
function asp_results_to_wp_obj( $results, $from = 0, $count = 'all' ) {
|
|
if ( empty($results) ) {
|
|
return array();
|
|
}
|
|
|
|
if ( $count == 'all' ) {
|
|
$results_slice = array_slice($results, $from);
|
|
} else {
|
|
$results_slice = array_slice($results, $from, $count);
|
|
}
|
|
|
|
if ( empty($results_slice) ) {
|
|
return array();
|
|
}
|
|
|
|
$wp_res_arr = array();
|
|
|
|
$date_format = get_option('date_format');
|
|
$time_format = get_option('time_format');
|
|
|
|
$current_date = date($date_format . ' ' . $time_format, time());
|
|
|
|
foreach ( $results_slice as $r ) {
|
|
|
|
$switched_blog = false;
|
|
if ( is_multisite() ) {
|
|
if ( get_current_blog_id() != $r->blogid ) {
|
|
switch_to_blog($r->blogid);
|
|
$switched_blog = true;
|
|
}
|
|
}
|
|
|
|
if ( !isset($r->content_type) ) {
|
|
continue;
|
|
}
|
|
|
|
switch ( $r->content_type ) {
|
|
case 'attachment':
|
|
case 'pagepost':
|
|
$res = get_post($r->id);
|
|
$res->asp_guid = get_permalink($r->id);
|
|
$r->asp_guid = $res->asp_guid;
|
|
$res->asp_id = $r->id; // Save the ID in case needed for some reason
|
|
$res->blogid = $r->blogid;
|
|
if ( isset($r->link) ) {
|
|
$res->guid = $r->link;
|
|
}
|
|
|
|
/**
|
|
* On multisite the page and other post type links are filtered in such a way
|
|
* that the post type object is reset with get_post(), deleting the ->asp_guid
|
|
* attribute. Therefor the post type post must be enforced.
|
|
*/
|
|
if ( is_multisite() && $res->post_type != 'post' ) {
|
|
// Is this a WooCommerce search?
|
|
if (
|
|
!(
|
|
in_array($res->post_type, array( 'product', 'product_variation' )) &&
|
|
isset($_GET['post_type']) &&
|
|
$_GET['post_type'] == 'product'
|
|
)
|
|
) {
|
|
$res->post_type = 'post'; // Enforce
|
|
if ( $switched_blog ) {
|
|
$res->ID = -10;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Attachments
|
|
if ( $r->content_type == 'attachment' ) {
|
|
// Force post post type, so the post_type_link hook activates
|
|
$res->post_type = 'post';
|
|
}
|
|
|
|
break;
|
|
case 'blog':
|
|
$res = new ASP_Post();
|
|
$res->post_title = $r->title;
|
|
$res->asp_guid = $r->link;
|
|
$res->guid = $r->link;
|
|
$res->post_content = $r->content;
|
|
$res->post_excerpt = $r->content;
|
|
$res->post_date = $current_date;
|
|
$res->asp_id = $r->id;
|
|
$res->ID = -10;
|
|
break;
|
|
case 'bp_group':
|
|
$res = new ASP_Post();
|
|
$res->post_title = $r->title;
|
|
$res->asp_guid = $r->link;
|
|
$res->guid = $r->link;
|
|
$res->post_content = $r->content;
|
|
$res->post_excerpt = $r->content;
|
|
$res->post_date = $r->date;
|
|
$res->asp_id = $r->id;
|
|
$res->ID = -10;
|
|
break;
|
|
case 'bp_activity':
|
|
$res = new ASP_Post();
|
|
$res->post_title = $r->title;
|
|
$res->asp_guid = $r->link;
|
|
$res->guid = $r->link;
|
|
$res->post_content = $r->content;
|
|
$res->post_excerpt = $r->content;
|
|
$res->post_date = $r->date;
|
|
$res->asp_id = $r->id;
|
|
$res->ID = -10;
|
|
break;
|
|
case 'comment':
|
|
$res = get_post($r->post_id);
|
|
if ( isset($res->post_title) ) {
|
|
$res->post_title = $r->title;
|
|
$res->guid = $r->link;
|
|
$res->asp_guid = $r->link;
|
|
$res->asp_id = $r->id;
|
|
$res->post_content = $r->content;
|
|
$res->post_excerpt = $r->content;
|
|
}
|
|
break;
|
|
case 'term':
|
|
$res = new ASP_Post();
|
|
$res->post_title = $r->title;
|
|
$res->asp_guid = $r->link;
|
|
$res->guid = $r->link;
|
|
$res->post_date = $current_date;
|
|
$res->asp_id = $r->id;
|
|
$res->ID = -10;
|
|
break;
|
|
case 'user':
|
|
$res = new ASP_Post();
|
|
$res->post_title = $r->title;
|
|
$res->asp_guid = $r->link;
|
|
$res->guid = $r->link;
|
|
$res->post_date = $current_date;
|
|
$res->asp_id = $r->id;
|
|
$res->ID = -10;
|
|
break;
|
|
case 'peepso_group':
|
|
if ( class_exists('PeepSoGroup') ) {
|
|
$pg = new PeepSoGroup($r->id);
|
|
$res = get_post($r->id);
|
|
$res->asp_guid = $pg->get_url();
|
|
$res->asp_id = $r->id; // Save the ID in case needed for some reason
|
|
}
|
|
break;
|
|
case 'peepso_activity':
|
|
$res = get_post($r->id);
|
|
$res->asp_guid = get_permalink($r->id);
|
|
$res->asp_id = $r->id; // Save the ID in case needed for some reason
|
|
break;
|
|
}
|
|
|
|
if ( !empty($res) ) {
|
|
$res->asp_data = $r;
|
|
$res = apply_filters('asp_regular_search_result', $res, $r);
|
|
$wp_res_arr[] = $res;
|
|
}
|
|
|
|
if ( is_multisite() ) {
|
|
restore_current_blog();
|
|
}
|
|
}
|
|
|
|
return $wp_res_arr;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('get_asp_result_field') ) {
|
|
function get_asp_result_field( $field = 'all', $post = false ) {
|
|
if ( $post === false ) {
|
|
global $post;
|
|
}
|
|
|
|
if ( !is_string($field) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( $field === 'all' ) {
|
|
if ( isset($post, $post->asp_data) ) {
|
|
return $post->asp_data;
|
|
} else {
|
|
return false;
|
|
}
|
|
} elseif ( isset($post, $post->asp_data) && property_exists($post->asp_data, $field) ) {
|
|
return $post->asp_data->{$field};
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
if ( !function_exists('the_asp_result_field') ) {
|
|
function the_asp_result_field( $field = 'title', $echo = true ) {
|
|
if ( $echo ) {
|
|
if ( !is_string($field) ) {
|
|
return;
|
|
}
|
|
$print = $field == 'all' ? '' : get_asp_result_field($field);
|
|
if ( $print !== false ) {
|
|
echo $print;
|
|
}
|
|
} else {
|
|
return get_asp_result_field($field);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 6. FRONT-END
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
if ( !function_exists('asp_acf_get_post_object_field_values') ) {
|
|
function asp_acf_get_post_object_field_values( $field_object ) {
|
|
$return = array();
|
|
$_return = array();
|
|
foreach ( $field_object['post_type'] as $post_type ) {
|
|
$posts = get_posts(
|
|
array(
|
|
'post_type' => $post_type,
|
|
'posts_per_page' => -1,
|
|
'post_status' => 'publish',
|
|
'suppress_filters' => false,
|
|
)
|
|
);
|
|
if ( !is_wp_error($posts) && count($posts) > 0 ) {
|
|
$_return = array_merge($_return, $posts);
|
|
}
|
|
}
|
|
foreach ( $_return as $r ) {
|
|
$return[ $r->ID ] = $r->post_title;
|
|
}
|
|
return $return;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_acf_get_field_choices') ) {
|
|
function asp_acf_get_field_choices( $field_name, $multi = false ) {
|
|
$results = array();
|
|
if ( trim($field_name) == '' ) {
|
|
return $results;
|
|
}
|
|
|
|
if ( isset($GLOBALS['acf_register_field_group']) ) {
|
|
foreach ( $GLOBALS['acf_register_field_group'] as $acf ) {
|
|
foreach ( $acf['fields'] as $field ) {
|
|
if ( substr($field['key'], 0, 6) == 'field_' ) {
|
|
if ( $field['name'] == $field_name && isset($field['choices']) ) {
|
|
if ( !$multi ) {
|
|
return $field['choices'];
|
|
} else {
|
|
$results [] = $field;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Method 2: This should be tried first, as Method 3 seems to miss some of the fields (reported via support)
|
|
* Reference: https://wp-dreams.com/forums/topic/get_value-filter-not-updating
|
|
*/
|
|
if ( empty($results) ) {
|
|
$fkeys = asp_acf_get_field_keys($field_name);
|
|
if ( !empty($fkeys) ) {
|
|
foreach ( $fkeys as $fkey ) {
|
|
$field = get_field_object($fkey);
|
|
if ( is_array($field) && isset($field['type']) ) {
|
|
if ( $field['type'] == 'post_object' ) {
|
|
$results = asp_acf_get_post_object_field_values($field);
|
|
} elseif ( !empty($field['choices']) ) {
|
|
/**
|
|
* The + operator is needed here instead of array_merge
|
|
* array_merge reindexes numeric array keys, but we need to perserve the array keys
|
|
*/
|
|
$results = $results + $field['choices'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Method 3: Let us try going through the ACF registered post types
|
|
if ( empty($results) ) {
|
|
$acf_posts = get_posts(
|
|
array(
|
|
'post_type' => 'acf',
|
|
'posts_per_page' => -1,
|
|
'post_status' => 'all',
|
|
'suppress_filters' => false,
|
|
)
|
|
);
|
|
if ( !is_wp_error($acf_posts) ) {
|
|
foreach ( $acf_posts as $acf ) {
|
|
$meta = get_post_meta($acf->ID);
|
|
foreach ( $meta as $key => $field ) {
|
|
if ( substr($key, 0, 6) == 'field_' ) {
|
|
$field = unserialize($field[0]);
|
|
if ( $field['name'] == $field_name && isset($field['choices']) ) {
|
|
if ( !$multi ) {
|
|
return $field['choices'];
|
|
} else {
|
|
$results [] = $field;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_acf_get_field_type') ) {
|
|
function asp_acf_get_field_type( $field_name ) {
|
|
$type = false;
|
|
if ( trim($field_name) == '' ) {
|
|
return $type;
|
|
}
|
|
|
|
if ( isset($GLOBALS['acf_register_field_group']) ) {
|
|
foreach ( $GLOBALS['acf_register_field_group'] as $acf ) {
|
|
foreach ( $acf['fields'] as $field ) {
|
|
if ( substr($field['key'], 0, 6) == 'field_' ) {
|
|
if ( $field['name'] == $field_name && isset($field['type']) ) {
|
|
$type = $field['type'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Method 2: This should be tried first, as Method 3 seems to miss some of the fields (reported via support)
|
|
* Reference: https://wp-dreams.com/forums/topic/get_value-filter-not-updating
|
|
*/
|
|
if ( $type === false ) {
|
|
$fkeys = asp_acf_get_field_keys($field_name);
|
|
if ( !empty($fkeys) ) {
|
|
$fkey = end($fkeys);
|
|
$field = get_field_object($fkey);
|
|
if ( !empty($field['type']) ) {
|
|
$type = $field['type'];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Method 3: Let us try going through the ACF registered post types
|
|
if ( $type === false ) {
|
|
$acf_posts = get_posts(
|
|
array(
|
|
'post_type' => 'acf',
|
|
'posts_per_page' => -1,
|
|
'post_status' => 'all',
|
|
'suppress_filters' => false,
|
|
)
|
|
);
|
|
if ( !is_wp_error($acf_posts) ) {
|
|
foreach ( $acf_posts as $acf ) {
|
|
$meta = get_post_meta($acf->ID);
|
|
foreach ( $meta as $key => $field ) {
|
|
if ( substr($key, 0, 6) == 'field_' ) {
|
|
$field = unserialize($field[0]);
|
|
if ( $field['name'] == $field_name && isset($field['type']) ) {
|
|
$type = $field['type'];
|
|
break 2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( isset($field, $field['type'], $field['multiple']) && $type == 'select' && $field['multiple'] == 1 ) {
|
|
$type = 'multiselect';
|
|
}
|
|
return $type;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_acf_get_field_keys') ) {
|
|
/**
|
|
* @param string $field_name
|
|
* @return string[]|false
|
|
*/
|
|
function asp_acf_get_field_keys( string $field_name ) {
|
|
global $wpdb;
|
|
$acf_fields = wp_cache_get("asp_acf_get_field_keys_$field_name", 'asp');
|
|
if ( $acf_fields === false ) {
|
|
$acf_fields = $wpdb->get_results(
|
|
$wpdb->prepare(
|
|
"SELECT ID,post_parent,post_name FROM $wpdb->posts WHERE post_excerpt=%s AND post_type=%s",
|
|
$field_name,
|
|
'acf-field'
|
|
)
|
|
);
|
|
wp_cache_set( "asp_acf_get_field_keys_$field_name", $acf_fields, 'asp' );
|
|
}
|
|
// get all fields with that name.
|
|
switch ( count( $acf_fields ) ) {
|
|
case 0: // no such field
|
|
return false;
|
|
case 1: // just one result.
|
|
return array( $acf_fields[0]->post_name );
|
|
default:
|
|
return array_map(
|
|
function ( $field_post ) {
|
|
return $field_post->post_name;
|
|
},
|
|
$acf_fields
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_filters') ) {
|
|
function asp_parse_filters( $id, $o, $clear = false, $to_display = true ) {
|
|
if ( !isset(wd_asp()->front_filters) || is_object(wd_asp()->front_filters) ) {
|
|
wd_asp()->front_filters = FiltersManager::getInstance();
|
|
}
|
|
wd_asp()->front_filters->setSearchId($id);
|
|
|
|
$o['_id'] = $id;
|
|
|
|
/**
|
|
* This is very important to cache. In some cases via search override this function gets called
|
|
* many times, and caused memory issues. This cache resolves that.
|
|
*/
|
|
static $called = array();
|
|
static $called_with_display = array();
|
|
|
|
if ( $to_display ) {
|
|
if ( $clear ) {
|
|
wd_asp()->front_filters->clear($id);
|
|
if ( !in_array($id, $called_with_display) ) {
|
|
$called_with_display[] = $id;
|
|
}
|
|
} else {
|
|
if ( in_array($id, $called_with_display) ) {
|
|
return;
|
|
}
|
|
$called_with_display[] = $id;
|
|
}
|
|
} elseif ( $clear ) {
|
|
wd_asp()->front_filters->clear($id);
|
|
if ( !in_array($id, $called) ) {
|
|
$called[] = $id;
|
|
}
|
|
} else {
|
|
if ( in_array($id, $called) ) {
|
|
return;
|
|
}
|
|
$called[] = $id;
|
|
}
|
|
|
|
do_action('asp_pre_parse_filters', $id, $o);
|
|
|
|
asp_parse_tax_term_filters($o);
|
|
asp_parse_content_type_filters($o);
|
|
asp_parse_custom_field_filters($o, $to_display);
|
|
asp_parse_post_type_filters($o);
|
|
asp_parse_date_filters($o);
|
|
asp_parse_generic_filters($o);
|
|
asp_parse_post_tag_filters($o);
|
|
asp_parse_button_filters($o);
|
|
|
|
do_action('asp_post_parse_filters', $id, $o);
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('asp_parse_custom_field_filters') ) {
|
|
function asp_parse_custom_field_filters( $o, $to_display = true ) {
|
|
global $wpdb;
|
|
|
|
if ( w_isset_def($o['custom_field_items'], '') == '' ) {
|
|
return array();
|
|
}
|
|
|
|
// $filters = array();
|
|
$f = explode('|', $o['custom_field_items']);
|
|
$id = $o['_id'];
|
|
|
|
foreach ( $f as $k => $v ) {
|
|
$m = null;
|
|
// $f[$k] = json_decode(base64_decode($v));
|
|
$bfield = json_decode(base64_decode($v));
|
|
|
|
$user_meta = isset($bfield->asp_f_source) && $bfield->asp_f_source == 'usermeta';
|
|
$table_name = $user_meta ? $wpdb->usermeta : $wpdb->postmeta;
|
|
$type = $user_meta ? 'user' : 'post';
|
|
|
|
$logic = '';
|
|
$logic_and_separate_custom_fields = false;
|
|
|
|
if ( !empty($bfield->asp_f_checkboxes_logic) ) {
|
|
$logic = $bfield->asp_f_checkboxes_logic;
|
|
}
|
|
if ( !empty($bfield->asp_f_dropdown_logic) ) {
|
|
$logic = $bfield->asp_f_dropdown_logic;
|
|
}
|
|
$date_store_format = '';
|
|
if ( !empty($bfield->asp_f_datepicker_operator) ) {
|
|
$date_store_format = w_isset_def($bfield->asp_f_datepicker_store_format, 'acf');
|
|
}
|
|
|
|
if ( $bfield->asp_f_type == 'range' || $bfield->asp_f_type == 'number_range' ) {
|
|
$bfield->asp_f_operator = 'BETWEEN';
|
|
}
|
|
|
|
if ( strtolower( $logic ) == 'andse' ) {
|
|
$logic = 'AND';
|
|
$logic_and_separate_custom_fields = true;
|
|
}
|
|
|
|
$data = array(
|
|
'field' => $bfield->asp_f_field,
|
|
'source' => w_isset_def($bfield->asp_f_source, 'postmeta'),
|
|
'required' => w_isset_def($bfield->asp_f_required, 'asp_unchecked') == 'asp_checked',
|
|
'invalid_input_text' => w_isset_def($bfield->asp_f_invalid_input_text, 'This field is required!'),
|
|
'operator' => !empty($bfield->asp_f_datepicker_operator) ? $bfield->asp_f_datepicker_operator : $bfield->asp_f_operator,
|
|
'logic' => $logic,
|
|
'logic_and_separate_custom_fields' => $logic_and_separate_custom_fields,
|
|
'date_store_format' => $date_store_format,
|
|
'is_api' => false,
|
|
);
|
|
|
|
if ( isset($bfield->asp_f_dropdown_search_text) ) {
|
|
$data['placeholder'] = asp_icl_t('[CF Filter Placeholder] (' . $id . ') ' . $bfield->asp_f_dropdown_search_text, $bfield->asp_f_dropdown_search_text);
|
|
}
|
|
|
|
$label = w_isset_def($bfield->asp_f_show_title, 'asp_checked') == 'asp_checked' ? $bfield->asp_f_title : '';
|
|
if ( $label != '' ) {
|
|
$label = asp_icl_t('[CF Filter Label] (' . $id . ') ' . $label, $label);
|
|
}
|
|
|
|
$filter = wd_asp()->front_filters->create(
|
|
'custom_field',
|
|
$label,
|
|
$bfield->asp_f_type,
|
|
$data
|
|
);
|
|
$unique_field_name = $filter->getUniqueFieldName();
|
|
|
|
if ( !$to_display ) {
|
|
wd_asp()->front_filters->add($filter);
|
|
continue;
|
|
}
|
|
|
|
// $f[$k]->asp_f_title = asp_icl_t('[CF Filter Label] ' . $bfield->asp_f_title, $bfield->asp_f_title);
|
|
|
|
if ( isset($bfield->asp_f_text_value) ) {
|
|
$add = array();
|
|
$default = $bfield->asp_f_text_value;
|
|
$default = asp_icl_t('[CF Filter Value] (' . $id . ') ' . $default, $default);
|
|
$label = str_replace('**', '', $bfield->asp_f_title);
|
|
$label = asp_icl_t('[CF Filter] (' . $id . ') ' . $label, $label);
|
|
|
|
if ( isset($o['_fo'], $o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$add['value'] = $o['_fo']['aspf'][ $unique_field_name ];
|
|
} else {
|
|
$add['value'] = $default;
|
|
}
|
|
|
|
$add = array_merge(
|
|
$add,
|
|
array(
|
|
'label' => $label,
|
|
'default' => $default,
|
|
)
|
|
);
|
|
$filter->add($add);
|
|
}
|
|
|
|
if ( isset($bfield->asp_f_hidden_value) ) {
|
|
$add = array();
|
|
$default = $bfield->asp_f_hidden_value;
|
|
$default = asp_icl_t('[CF Filter Value] (' . $id . ') ' . $default, $default);
|
|
|
|
if ( isset($o['_fo'], $o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$add['value'] = $o['_fo']['aspf'][ $unique_field_name ];
|
|
} else {
|
|
$add['value'] = $default;
|
|
}
|
|
|
|
$add = array_merge(
|
|
$add,
|
|
array(
|
|
'label' => '',
|
|
'default' => $default,
|
|
)
|
|
);
|
|
$filter->add($add);
|
|
}
|
|
|
|
if ( isset($bfield->asp_f_radio_value) ) {
|
|
$lines = preg_split("/\\r\\n|\\r|\\n/", $bfield->asp_f_radio_value);
|
|
// $f[$k]->asp_f_radio_value = array();
|
|
foreach ( $lines as $kk => $val ) {
|
|
$add_arr = array();
|
|
if ( strpos(trim($val), '{get_values') === 0 ) {
|
|
foreach ( FrontendFilters::getCFValues($bfield->asp_f_field, $type, $val) as $k => $item ) {
|
|
$add_arr[] = array(
|
|
'label' => $item['label'] . ( strpos(trim($val), 'checked') !== false && $k == 0 ? '**' : '' ),
|
|
'value' => $item['value'],
|
|
);
|
|
}
|
|
} else {
|
|
preg_match('/^(.*?)\|\|(.*)/', $val, $m);
|
|
if ( !isset($m[1], $m[2]) ) {
|
|
$add_arr[] = array(
|
|
'label' => '',
|
|
'value' => '',
|
|
);
|
|
} else {
|
|
$add_arr[] = array(
|
|
'label' => $m[2],
|
|
'value' => $m[1],
|
|
);
|
|
}
|
|
}
|
|
|
|
if ( count($add_arr) > 0 ) {
|
|
foreach ( $add_arr as $add ) {
|
|
$default = strpos($add['label'], '**') > 0;
|
|
$label = str_replace('**', '', $add['label']);
|
|
$label = asp_icl_t('[CF Filter] (' . $id . ') ' . $label, $label);
|
|
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$checked = $o['_fo']['aspf'][ $unique_field_name ] == $add['value'];
|
|
} else {
|
|
$checked = $default;
|
|
}
|
|
|
|
$add['value'] = apply_filters('asp_cf_radio_values', $add['value'], $bfield);
|
|
$add['value'] = asp_icl_t('[CF Filter Value] (' . $id . ') ' . $add['value'], $add['value']);
|
|
$add = array_merge(
|
|
$add,
|
|
array(
|
|
'label' => $label,
|
|
'default' => $default,
|
|
'selected' => $checked,
|
|
)
|
|
);
|
|
if ( $add['label'] != '' ) {
|
|
$filter->add($add);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( isset($bfield->asp_f_dropdown_value) ) {
|
|
if ( w_isset_def($bfield->asp_f_dropdown_search, 'asp_unchecked') == 'asp_checked' ) {
|
|
if ( w_isset_def($bfield->asp_f_dropdown_multi, 'asp_unchecked') == 'asp_checked' ) {
|
|
$filter->display_mode = 'multisearch';
|
|
$filter->data['multiple'] = true;
|
|
} else {
|
|
$filter->display_mode = 'dropdownsearch';
|
|
}
|
|
} else {
|
|
$filter->display_mode = 'dropdown';
|
|
if ( w_isset_def($bfield->asp_f_dropdown_multi, 'asp_unchecked') == 'asp_checked' ) {
|
|
$filter->data['multiple'] = true;
|
|
}
|
|
}
|
|
|
|
$lines = preg_split("/\\r\\n|\\r|\\n/", $bfield->asp_f_dropdown_value);
|
|
foreach ( $lines as $kk => $val ) {
|
|
$add_arr = array();
|
|
|
|
if ( strpos(trim($val), '{get_values') === 0 ) {
|
|
foreach ( FrontendFilters::getCFValues($bfield->asp_f_field, $type, $val) as $k => $item ) {
|
|
if ( $filter->data['multiple'] ) {
|
|
$add_arr[] = array(
|
|
'label' => $item['label'] . ( strpos(trim($val), 'checked') !== false ? '**' : '' ),
|
|
'value' => $item['value'],
|
|
);
|
|
} else {
|
|
$add_arr[] = array(
|
|
'label' => $item['label'] . ( strpos(trim($val), 'checked') !== false && $k == 0 ? '**' : '' ),
|
|
'value' => $item['value'],
|
|
);
|
|
}
|
|
}
|
|
} elseif ( MB::strpos($val, '||') !== false ) { // Individual value
|
|
preg_match('/^(.*?)\|\|(.*)/', $val, $m);
|
|
if ( !isset($m[1], $m[2]) ) {
|
|
$add_arr[] = array(
|
|
'label' => '',
|
|
'value' => '',
|
|
);
|
|
} else {
|
|
$add_arr[] = array(
|
|
'label' => $m[2],
|
|
'value' => $m[1],
|
|
);
|
|
}
|
|
} else { // Option group
|
|
$add_arr[] = array(
|
|
'label' => $val,
|
|
'value' => $val,
|
|
'option_group' => true,
|
|
);
|
|
}
|
|
|
|
foreach ( $add_arr as $add ) {
|
|
$default = strpos($add['label'], '**') > 0;
|
|
$label = str_replace('**', '', $add['label']);
|
|
if ( isset($add['option_group']) ) {
|
|
$label = asp_icl_t('[CF Filter Option Group] (' . $id . ') ' . $label, $label);
|
|
} else {
|
|
$label = asp_icl_t('[CF Filter] (' . $id . ') ' . $label, $label);
|
|
}
|
|
|
|
// Special case because of the multi-select
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$o['_fo']['aspf'][ $unique_field_name ] = is_array($o['_fo']['aspf'][ $unique_field_name ]) ?
|
|
$o['_fo']['aspf'][ $unique_field_name ] : array( $o['_fo']['aspf'][ $unique_field_name ] );
|
|
$checked = in_array($add['value'], $o['_fo']['aspf'][ $unique_field_name ]);
|
|
} else {
|
|
$checked = $default;
|
|
}
|
|
|
|
// Backwards filter compatibility
|
|
$vals = apply_filters('asp_cf_dropdown_values', array( $add['value'], $label ), $bfield);
|
|
$vals[0] = asp_icl_t('[CF Filter Value] (' . $id . ') ' . $vals[0], $vals[0]);
|
|
|
|
$add = array_merge(
|
|
$add,
|
|
array(
|
|
'label' => $vals[1],
|
|
'value' => $vals[0],
|
|
'default' => $default,
|
|
'selected' => $checked,
|
|
)
|
|
);
|
|
if ( $add['label'] != '' ) {
|
|
$filter->add($add);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( isset($bfield->asp_f_checkboxes_value) ) {
|
|
$lines = preg_split("/\\r\\n|\\r|\\n/", $bfield->asp_f_checkboxes_value);
|
|
foreach ( $lines as $kk => $val ) {
|
|
$add_arr = array();
|
|
if ( strpos(trim($val), '{get_values') === 0 ) {
|
|
foreach ( FrontendFilters::getCFValues($bfield->asp_f_field, $type, $val) as $k => $item ) {
|
|
$add_arr[] = array(
|
|
'label' => $item['label'] . ( strpos(trim($val), 'checked') !== false ? '**' : '' ),
|
|
'value' => $item['value'],
|
|
);
|
|
}
|
|
} else {
|
|
preg_match('/^(.*?)\|\|(.*)/', $val, $m);
|
|
// $f[$k]->asp_f_checkboxes_value[] = array($m[1], asp_icl_t('[CF Filter] ' . $m[2], $m[2]));
|
|
if ( !isset($m[1], $m[2]) ) {
|
|
$add_arr[] = array(
|
|
'label' => '',
|
|
'value' => '',
|
|
);
|
|
} else {
|
|
$add_arr[] = array(
|
|
'label' => $m[2],
|
|
'value' => $m[1],
|
|
);
|
|
}
|
|
}
|
|
|
|
foreach ( $add_arr as $add ) {
|
|
$default = strpos($add['label'], '**') > 0;
|
|
$label = str_replace('**', '', $add['label']);
|
|
$label = asp_icl_t('[CF Filter] (' . $id . ') ' . $label, $label);
|
|
|
|
if ( isset($o['_fo'], $o['_fo']['aspf']) ) {
|
|
// Select all variation, keep it on the default value, as it is not possible to check
|
|
if ( $add['value'] == '' && $kk == 0 ) {
|
|
$checked = $default;
|
|
} else {
|
|
$checked = isset($o['_fo']['aspf'][ $unique_field_name ])
|
|
&& is_array($o['_fo']['aspf'][ $unique_field_name ]) && in_array($add['value'], $o['_fo']['aspf'][ $unique_field_name ]);
|
|
}
|
|
} else {
|
|
$checked = $default;
|
|
}
|
|
|
|
$select_all = $kk == 0 & $add['value'] == '';
|
|
|
|
$vals = apply_filters('asp_cf_checkbox_values', array( $add['value'], $label ), $bfield);
|
|
$vals[0] = asp_icl_t('[CF Filter Value] (' . $id . ') ' . $vals[0], $vals[0]);
|
|
|
|
$add = array_merge(
|
|
$add,
|
|
array(
|
|
'label' => $vals[1],
|
|
'value' => $vals[0],
|
|
'default' => $default,
|
|
'selected' => $checked,
|
|
'select_all' => $select_all,
|
|
)
|
|
);
|
|
if ( $add['label'] != '' ) {
|
|
$filter->add($add);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( isset($bfield->asp_f_number_range_from, $bfield->asp_f_number_range_to) ) {
|
|
if ( $bfield->asp_f_number_range_from === '' ) {
|
|
$bfield->asp_f_number_range_from = PostMeta::getNumericFieldMin($bfield->asp_f_field);
|
|
}
|
|
if ( $bfield->asp_f_number_range_to === '' ) {
|
|
$bfield->asp_f_number_range_to = PostMeta::getNumericFieldMax($bfield->asp_f_field);
|
|
}
|
|
|
|
$default = array( $bfield->asp_f_number_range_default1, $bfield->asp_f_number_range_default2 );
|
|
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]['lower']) ) {
|
|
$lower = $o['_fo']['aspf'][ $unique_field_name ]['lower'];
|
|
$upper = $o['_fo']['aspf'][ $unique_field_name ]['upper'];
|
|
$value = array(
|
|
$lower === '' ? $lower : Str::forceNumeric($lower),
|
|
$upper === '' ? $upper : Str::forceNumeric($upper),
|
|
);
|
|
} else {
|
|
$value = $default;
|
|
}
|
|
|
|
$filter->data = array_merge(
|
|
$filter->data,
|
|
array(
|
|
'placeholder1' => $bfield->asp_f_number_range_placeholder1,
|
|
'placeholder2' => $bfield->asp_f_number_range_placeholder2,
|
|
'range_from' => $bfield->asp_f_number_range_from,
|
|
'range_to' => $bfield->asp_f_number_range_to,
|
|
'range_t_separator' => $bfield->asp_f_number_range_t_separator ?? ' ',
|
|
)
|
|
);
|
|
|
|
$filter->add(
|
|
array(
|
|
'label' => '',
|
|
'value' => $value,
|
|
'default' => $default,
|
|
)
|
|
);
|
|
}
|
|
|
|
if ( isset($bfield->asp_f_slider_from, $bfield->asp_f_slider_to) ) {
|
|
if ( $bfield->asp_f_slider_from == '' ) {
|
|
$bfield->asp_f_slider_from = PostMeta::getNumericFieldMin($bfield->asp_f_field);
|
|
}
|
|
if ( $bfield->asp_f_slider_to == '' ) {
|
|
$bfield->asp_f_slider_to = PostMeta::getNumericFieldMax($bfield->asp_f_field);
|
|
}
|
|
|
|
$default = $bfield->asp_f_slider_default == '' ? $bfield->asp_f_slider_from : $bfield->asp_f_slider_default;
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$value = Str::forceNumeric($o['_fo']['aspf'][ $unique_field_name ]);
|
|
} else {
|
|
$value = $default;
|
|
}
|
|
// $bfield->asp_f_slider_default = $bfield->asp_f_slider_default == '' ? $bfield->asp_f_slider_from : $bfield->asp_f_slider_default;
|
|
$filter->add(
|
|
array(
|
|
'label' => '',
|
|
'default' => $default,
|
|
'value' => $value,
|
|
)
|
|
);
|
|
$filter->data = array_merge(
|
|
$filter->data,
|
|
array(
|
|
'slider_prefix' => $bfield->asp_f_slider_prefix,
|
|
'slider_suffix' => $bfield->asp_f_slider_suffix,
|
|
'slider_step' => $bfield->asp_f_slider_step,
|
|
'slider_from' => $bfield->asp_f_slider_from,
|
|
'slider_to' => $bfield->asp_f_slider_to,
|
|
'slider_decimals' => w_isset_def($bfield->asp_f_slider_decimals, 0),
|
|
'slider_t_separator' => isset($bfield->asp_f_slider_t_separator) ? $bfield->asp_f_slider_t_separator : ' ',
|
|
)
|
|
);
|
|
}
|
|
if ( isset($bfield->asp_f_range_from, $bfield->asp_f_range_to) ) {
|
|
if ( $bfield->asp_f_range_from == '' ) {
|
|
$bfield->asp_f_range_from = PostMeta::getNumericFieldMin($bfield->asp_f_field);
|
|
}
|
|
if ( $bfield->asp_f_range_to == '' ) {
|
|
$bfield->asp_f_range_to = PostMeta::getNumericFieldMax($bfield->asp_f_field);
|
|
}
|
|
|
|
$bfield->asp_f_range_default1 = $bfield->asp_f_range_default1 == '' ? $bfield->asp_f_range_from : $bfield->asp_f_range_default1;
|
|
$bfield->asp_f_range_default2 = $bfield->asp_f_range_default2 == '' ? $bfield->asp_f_range_to : $bfield->asp_f_range_default2;
|
|
|
|
$default = array( $bfield->asp_f_range_default1, $bfield->asp_f_range_default2 );
|
|
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]['lower']) ) {
|
|
$value = array(
|
|
Str::forceNumeric($o['_fo']['aspf'][ $unique_field_name ]['lower']),
|
|
Str::forceNumeric($o['_fo']['aspf'][ $unique_field_name ]['upper']),
|
|
);
|
|
} else {
|
|
$value = $default;
|
|
}
|
|
|
|
$filter->data = array_merge(
|
|
$filter->data,
|
|
array(
|
|
'range_prefix' => $bfield->asp_f_range_prefix,
|
|
'range_suffix' => $bfield->asp_f_range_suffix,
|
|
'range_step' => $bfield->asp_f_range_step,
|
|
'range_from' => $bfield->asp_f_range_from,
|
|
'range_to' => $bfield->asp_f_range_to,
|
|
'range_decimals' => w_isset_def($bfield->asp_f_range_decimals, 0),
|
|
'range_t_separator' => isset($bfield->asp_f_range_t_separator) ? $bfield->asp_f_range_t_separator : ' ',
|
|
)
|
|
);
|
|
|
|
$filter->add(
|
|
array(
|
|
'label' => '',
|
|
'slider_from' => $bfield->asp_f_range_from,
|
|
'slider_to' => $bfield->asp_f_range_to,
|
|
'value' => $value,
|
|
'default' => $default,
|
|
)
|
|
);
|
|
}
|
|
|
|
if ( $bfield->asp_f_type == 'datepicker' ) {
|
|
switch ( $bfield->asp_f_datepicker_defval ) {
|
|
case 'none':
|
|
$default = '';
|
|
break;
|
|
case 'current':
|
|
$default = '+0';
|
|
break;
|
|
case 'relative':
|
|
$default = $bfield->asp_f_datepicker_from_months . 'm ' . $bfield->asp_f_datepicker_from_days . 'd';
|
|
break;
|
|
default:
|
|
$default = implode('-', array_reverse(explode('/', $bfield->asp_f_datepicker_value)));
|
|
break;
|
|
}
|
|
|
|
if ( isset($o['_fo']) && isset($o['_fo']['aspf'][ $unique_field_name ]) ) {
|
|
$value = sanitize_text_field($o['_fo']['aspf'][ $unique_field_name ]);
|
|
} else {
|
|
$value = $default;
|
|
}
|
|
|
|
if ( !isset($bfield->asp_f_datepicker_placeholder) ) {
|
|
// $bfield->asp_f_datepicker_placeholder = '';
|
|
$filter->data['placeholder'] = '';
|
|
} else {
|
|
// $bfield->asp_f_datepicker_placeholder = asp_icl_t('[CF Date Filter Placeholder] ' . $bfield->asp_f_datepicker_placeholder, $bfield->asp_f_datepicker_placeholder);
|
|
$filter->data['placeholder'] = asp_icl_t('[CF Date Filter Placeholder] (' . $id . ') ' . $bfield->asp_f_datepicker_placeholder, $bfield->asp_f_datepicker_placeholder);
|
|
}
|
|
$filter->data['date_format'] = $bfield->asp_f_datepicker_format;
|
|
|
|
$filter->add(
|
|
array(
|
|
'label' => '',
|
|
'value' => $value,
|
|
'default' => $default,
|
|
)
|
|
);
|
|
}
|
|
|
|
// $filters[] = $filter;
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
// return $f;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_tax_term_filters') ) {
|
|
/**
|
|
* Parses the taxonomy term filters from the search options
|
|
*
|
|
* @param array $o Search options
|
|
* @return aspTaxFilter[] Filters array
|
|
*/
|
|
function asp_parse_tax_term_filters( $o ) {
|
|
/**
|
|
* Return value
|
|
* array[{
|
|
* ->label
|
|
* ->display_mode
|
|
* ->values => array[{
|
|
* ->label
|
|
* ->selected
|
|
* ->id
|
|
* ->level
|
|
* ->default
|
|
* ->parent
|
|
* ->taxonomy
|
|
* }]
|
|
* }, ...]
|
|
*/
|
|
// $filters = array();
|
|
$term_ordering = w_isset_def($o['selected-frontend_term_order'], array( 'name', 'ASC' ));
|
|
$hide_empty = w_isset_def($o['frontend_terms_hide_empty'], 0);
|
|
|
|
// Re-group by taxonomy
|
|
$tax_terms = array();
|
|
foreach ( $o['show_terms']['terms'] as $t ) {
|
|
if ( !isset($tax_terms[ $t['taxonomy'] ]) ) {
|
|
$tax_terms[ $t['taxonomy'] ] = array();
|
|
}
|
|
$tax_terms[ $t['taxonomy'] ][ $t['id'] ] = $t;
|
|
}
|
|
|
|
if ( isset($o['_fo']) &&
|
|
!isset($o['_fo']['termset']) ) {
|
|
$o['_fo']['termset'] = array();
|
|
}
|
|
|
|
foreach ( $tax_terms as $taxonomy => $terms ) {
|
|
|
|
$term_ids = array();
|
|
foreach ( $terms as $k => $t ) {
|
|
$term_ids[] = $t['id'];
|
|
}
|
|
|
|
if ( !empty($terms) ) {
|
|
|
|
if ( isset($o['_fo']) &&
|
|
!isset($o['_fo']['termset'][ $taxonomy ]) ) {
|
|
$o['_fo']['termset'][ $taxonomy ] = array();
|
|
}
|
|
|
|
// Need all terms
|
|
if ( count($terms) == 1 && isset($terms[-1], $terms[-1]['id']) && $terms[-1]['id'] == -1 ) {
|
|
$_needed_all = true;
|
|
$_needed_terms_full = get_terms(
|
|
$taxonomy,
|
|
array(
|
|
'taxonomy' => $taxonomy,
|
|
'orderby' => $term_ordering[0],
|
|
'order' => $term_ordering[1],
|
|
'hide_empty' => $hide_empty,
|
|
'exclude' => isset($terms[-1]['ex_ids']) ? $terms[-1]['ex_ids'] : array(),
|
|
)
|
|
);
|
|
} else {
|
|
$_needed_all = false;
|
|
$_needed_terms_full = get_terms(
|
|
$taxonomy,
|
|
array(
|
|
'taxonomy' => $taxonomy,
|
|
'orderby' => 'include',
|
|
'order' => 'ASC',
|
|
'include' => $term_ids,
|
|
'hide_empty' => $hide_empty,
|
|
)
|
|
);
|
|
}
|
|
|
|
/*
|
|
* DO NOT CONTINUE HERE
|
|
*
|
|
* The filter should be still considered, as the user either:
|
|
* - use the asp_fontend_get_taxonomy_terms hook
|
|
* - the taxonomy is not yet registered and only the asp_parse_filters() function is trying to
|
|
* fetch the filters for the Asset managers
|
|
*/
|
|
if ( is_wp_error($_needed_terms_full) ) {
|
|
$_needed_terms_full = array();
|
|
}
|
|
|
|
$_needed_terms_full = apply_filters(
|
|
'asp_fontend_get_taxonomy_terms',
|
|
$_needed_terms_full,
|
|
$taxonomy,
|
|
array(
|
|
'orderby' => $term_ordering[0],
|
|
'order' => $term_ordering[1],
|
|
'include' => $terms,
|
|
'include_ids' => $term_ids,
|
|
),
|
|
$_needed_all
|
|
);
|
|
|
|
$_needed_terms_sorted = array();
|
|
$needed_terms_flat = array();
|
|
|
|
// This is passed as the $data argument
|
|
$display_mode = array(
|
|
'type' => 'checkboxes',
|
|
'required' => false,
|
|
'invalid_input_text' => 'This field is required!',
|
|
'default' => 'checked',
|
|
'select_all' => 0,
|
|
'select_all_text' => '',
|
|
'box_header_text' => '',
|
|
'box_placeholder_text' => '',
|
|
);
|
|
|
|
if ( count($o['show_terms']['display_mode']) > 0 ) {
|
|
if ( isset($o['show_terms']['display_mode'][ $taxonomy ]) ) {
|
|
$display_mode = array_merge($display_mode, $o['show_terms']['display_mode'][ $taxonomy ]);
|
|
}
|
|
}
|
|
$display_mode['taxonomy'] = $taxonomy;
|
|
|
|
if ( w_isset_def($o['frontend_term_hierarchy'], 1) == 1 ) {
|
|
wd_sort_terms_hierarchicaly( $_needed_terms_full, $_needed_terms_sorted );
|
|
wd_flatten_hierarchical_terms( $_needed_terms_sorted, $needed_terms_flat );
|
|
} else {
|
|
$needed_terms_flat = $_needed_terms_full;
|
|
}
|
|
|
|
$display_mode['is_api'] = false;
|
|
$display_mode['placeholder'] = $display_mode['box_placeholder_text'];
|
|
|
|
$current_filter = wd_asp()->front_filters->create('taxonomy', $display_mode['box_header_text'], $display_mode['type'], $display_mode);
|
|
|
|
if ( $display_mode['type'] == 'checkboxes' ) {
|
|
|
|
if ( $display_mode['select_all'] == 1 && $current_filter->isEmpty() ) {
|
|
$filter = array(
|
|
'label' => $display_mode['select_all_text'],
|
|
'selected' => $display_mode['select_all'] == 1,
|
|
'default' => $display_mode['select_all'] == 1,
|
|
'taxonomy' => $display_mode['select_all'] == 0 ? 'terms' : $taxonomy,
|
|
'level' => 0,
|
|
);
|
|
$current_filter->add($filter);
|
|
}
|
|
|
|
$chb_default_state = true;
|
|
if ( $display_mode['default'] == 'unchecked' ) {
|
|
$chb_default_state = false;
|
|
}
|
|
|
|
foreach ( $needed_terms_flat as $k => $term ) {
|
|
$filter = array(
|
|
'label' => $term->name,
|
|
'id' => $term->term_id,
|
|
'taxonomy' => $taxonomy,
|
|
'level' => $term->level,
|
|
);
|
|
|
|
/**
|
|
* Explanation: $tax_terms contains the originals sorted by taxonomy.
|
|
* If the current term is in the array, then it was excplicitly selected, not by "Use all from.."
|
|
* In this case it is only unchecked when in the un_checked array. Otherwise the default state applies.
|
|
*/
|
|
if ( isset($tax_terms[ $term->taxonomy ][ $term->term_id ]) ) {
|
|
$filter['default'] = !in_array($term->term_id, $o['show_terms']['un_checked']);
|
|
} else {
|
|
$filter['default'] = $chb_default_state;
|
|
}
|
|
|
|
if ( isset($o['_fo']) ) {
|
|
$filter['selected'] = in_array($term->term_id, $o['_fo']['termset'][ $taxonomy ]);
|
|
} else {
|
|
$filter['selected'] = $filter['default'];
|
|
}
|
|
|
|
$current_filter->add($filter);
|
|
}
|
|
} elseif (
|
|
$display_mode['type'] == 'dropdown' ||
|
|
$display_mode['type'] == 'dropdownsearch' ||
|
|
$display_mode['type'] == 'multisearch'
|
|
) {
|
|
if ( $display_mode['select_all'] == 1 && $current_filter->isEmpty() && $display_mode['type'] != 'multisearch' ) {
|
|
$filter = array(
|
|
'label' => $display_mode['select_all_text'],
|
|
'selected' => $display_mode['default'] == 'all',
|
|
'default' => $display_mode['default'] == 'all',
|
|
'taxonomy' => $display_mode['select_all'] == 0 ? 'terms' : $taxonomy,
|
|
'level' => 0,
|
|
);
|
|
$current_filter->add($filter);
|
|
}
|
|
|
|
$len = count($needed_terms_flat);
|
|
$i = 0;
|
|
$have_selected = false;
|
|
|
|
foreach ( $needed_terms_flat as $k => $term ) {
|
|
$filter = array(
|
|
'label' => $term->name,
|
|
'id' => $term->term_id,
|
|
'taxonomy' => $taxonomy,
|
|
'level' => $term->level,
|
|
);
|
|
|
|
if ( $display_mode['type'] == 'multisearch' ) {
|
|
if ( isset($tax_terms[ $term->taxonomy ][ $term->term_id ]) ) {
|
|
$filter['default'] = !in_array($term->term_id, $o['show_terms']['un_checked']);
|
|
} else {
|
|
$filter['default'] = false;
|
|
}
|
|
} elseif (
|
|
!$have_selected && (
|
|
( $i == 0 && $display_mode['default'] == 'first' ) ||
|
|
( ( $i == $len -1 ) && $display_mode['default'] == 'last' ) ||
|
|
$term->term_id == $display_mode['default']
|
|
)
|
|
) {
|
|
|
|
$filter['default'] = true;
|
|
$have_selected = true;
|
|
} else {
|
|
$filter['default'] = false;
|
|
}
|
|
|
|
if ( isset($o['_fo']) ) {
|
|
if ( !$have_selected ) {
|
|
$filter['selected'] = in_array($term->term_id, $o['_fo']['termset'][ $taxonomy ]);
|
|
if ( $filter['selected'] && $display_mode['type'] != 'multisearch' ) {
|
|
$have_selected = true;
|
|
}
|
|
} else {
|
|
$filter['selected'] = false;
|
|
}
|
|
} else {
|
|
$filter['selected'] = $filter['default'];
|
|
}
|
|
|
|
$current_filter->add($filter);
|
|
++$i;
|
|
}
|
|
} elseif ( $display_mode['type'] == 'radio' ) {
|
|
|
|
if ( $display_mode['select_all'] == 1 && $current_filter->isEmpty() ) {
|
|
$filter = array(
|
|
'label' => $display_mode['select_all_text'],
|
|
'selected' => $display_mode['default'] == 'all',
|
|
'default' => $display_mode['default'] == 'all',
|
|
'taxonomy' => $display_mode['select_all'] == 0 ? 'terms' : $taxonomy,
|
|
'level' => 0,
|
|
);
|
|
$current_filter->add($filter);
|
|
}
|
|
|
|
$len = count($needed_terms_flat);
|
|
$i = 0;
|
|
$have_selected = false;
|
|
|
|
foreach ( $needed_terms_flat as $k => $term ) {
|
|
$filter = array(
|
|
'label' => $term->name,
|
|
'id' => $term->term_id,
|
|
'taxonomy' => $taxonomy,
|
|
'level' => $term->level,
|
|
);
|
|
|
|
if (
|
|
!$have_selected && (
|
|
( $i == 0 && $display_mode['default'] == 'first' ) ||
|
|
( ( $i == $len -1 ) && $display_mode['default'] == 'last' ) ||
|
|
$term->term_id == $display_mode['default']
|
|
)
|
|
) {
|
|
$filter['default'] = true;
|
|
$have_selected = true;
|
|
} else {
|
|
$filter['default'] = false;
|
|
}
|
|
|
|
if ( isset($o['_fo'], $o['_fo']['termset'], $o['_fo']['termset'][ $taxonomy ]) ) {
|
|
$filter['selected'] = in_array($term->term_id, $o['_fo']['termset'][ $taxonomy ]);
|
|
if ( $filter['selected'] ) {
|
|
$have_selected = true;
|
|
}
|
|
} else {
|
|
$filter['selected'] = $filter['default'];
|
|
}
|
|
$current_filter->add($filter);
|
|
++$i;
|
|
}
|
|
}
|
|
|
|
wd_asp()->front_filters->add($current_filter);
|
|
}
|
|
// --- TAX LOOP
|
|
}
|
|
// return apply_filters('asp_taxonomy_filters', $filters, $o);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_post_tag_filters') ) {
|
|
function asp_parse_post_tag_filters( $o ) {
|
|
if (
|
|
empty($o['selected-show_frontend_tags']) ||
|
|
$o['selected-show_frontend_tags']['active'] == 0
|
|
) {
|
|
return;
|
|
}
|
|
|
|
/* Let us make it a bit more accessible */
|
|
$_sfto = $o['selected-show_frontend_tags'];
|
|
|
|
if ( $_sfto['source'] == 'all' ) {
|
|
$_sftags = get_terms('post_tag', array( 'number' =>10000 ));
|
|
} else {
|
|
$_sftags = asp_get_terms_ordered_by_ids('post_tag', $_sfto['tag_ids']);
|
|
}
|
|
|
|
if ( empty($_sftags) ) {
|
|
return;
|
|
}
|
|
|
|
if ( $_sfto['source'] == 'all' ) {
|
|
$_sel_tags = $_sfto['default_tag'] != '' ? array( $_sfto['default_tag'] ) : array();
|
|
} else {
|
|
$_sel_tags = $_sfto['checked_tag_ids'];
|
|
}
|
|
|
|
if ( isset($o['_fo']) && !isset($o['_fo']['post_tag_set']) ) {
|
|
$o['_fo']['post_tag_set'] = array();
|
|
}
|
|
|
|
$display_mode = array(
|
|
'type' => $_sfto['display_mode'],
|
|
'taxonomy' => 'post_tag',
|
|
'custom_name' => 'post_tag_set[]',
|
|
'default' => $_sfto['display_mode'] == 'checkboxes' ? ( $o['all_tags_check_opt_state'] == 'checked' ? 1 : 0 ) : 1,
|
|
'select_all' => $_sfto['display_mode'] == 'checkboxes' ? $o['display_all_tags_check_opt'] : $o['display_all_tags_option'],
|
|
'select_all_text' => $_sfto['display_mode'] == 'checkboxes' ? $o['all_tags_check_opt_text'] : $o['all_tags_opt_text'],
|
|
'box_header_text' => w_isset_def($o['frontend_tags_header'], 'Filter by Tags'),
|
|
'placeholder' => $o['frontend_tags_placeholder'],
|
|
'required' => $o['frontend_tags_required'] == 1,
|
|
'invalid_input_text' => $o['frontend_tags_invalid_input_text'],
|
|
'is_api' => false,
|
|
);
|
|
|
|
$filter = wd_asp()->front_filters->create('post_tags', $display_mode['box_header_text'], $display_mode['type'], $display_mode);
|
|
|
|
if ( $display_mode['select_all'] == 1 ) {
|
|
$filter->add(
|
|
array(
|
|
'label' => $display_mode['select_all_text'],
|
|
'selected' => $display_mode['default'],
|
|
'default' => $display_mode['default'],
|
|
'taxonomy' => 'post_tag',
|
|
'custom_name' => 'post_tag_set[]',
|
|
)
|
|
);
|
|
}
|
|
|
|
foreach ( $_sftags as $_sftag ) {
|
|
if ( $display_mode['type'] == 'checkboxes' && $_sfto['source'] == 'all' ) {
|
|
$default = $_sfto['all_status'] == 'checked';
|
|
} else {
|
|
$default = in_array($_sftag->term_id, $_sel_tags);
|
|
}
|
|
if ( isset($o['_fo']) ) {
|
|
$selected = in_array($_sftag->term_id, $o['_fo']['post_tag_set']);
|
|
} else {
|
|
$selected = $default;
|
|
}
|
|
|
|
$filter->add(
|
|
array(
|
|
'label' => $_sftag->name,
|
|
'id' => $_sftag->term_id,
|
|
'selected' => $selected,
|
|
'default' => $default,
|
|
'taxonomy' => 'post_tag',
|
|
)
|
|
);
|
|
}
|
|
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_button_filters') ) {
|
|
function asp_parse_button_filters( $o ) {
|
|
if ( $o['fe_reset_button'] == 1 || $o['fe_search_button'] == 1 ) {
|
|
$id = $o['_id'];
|
|
$filter = wd_asp()->front_filters->create('button');
|
|
$filter->is_api = false;
|
|
if ( $o['fe_reset_button'] == 1 && $o['fe_rb_position'] == 'before' ) {
|
|
$filter->add(
|
|
array(
|
|
'label' => asp_icl_t('Reset button (' . $id . ') ', $o['fe_rb_text']),
|
|
'type' => 'reset',
|
|
'container_class' => 'asp_r_btn_div',
|
|
'button_class' => 'asp_reset_btn asp_r_btn',
|
|
)
|
|
);
|
|
}
|
|
if ( $o['fe_search_button'] == 1 ) {
|
|
$filter->add(
|
|
array(
|
|
'label' => asp_icl_t('Search button (' . $id . ') ', $o['fe_sb_text']),
|
|
'type' => 'search',
|
|
'container_class' => 'asp_s_btn_div',
|
|
'button_class' => 'asp_search_btn asp_s_btn',
|
|
)
|
|
);
|
|
}
|
|
if ( $o['fe_reset_button'] == 1 && $o['fe_rb_position'] == 'after' ) {
|
|
$filter->add(
|
|
array(
|
|
'label' => asp_icl_t('Reset button (' . $id . ') ', $o['fe_rb_text']),
|
|
'type' => 'reset',
|
|
'container_class' => 'asp_r_btn_div',
|
|
'button_class' => 'asp_reset_btn asp_r_btn',
|
|
)
|
|
);
|
|
}
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_generic_filters') ) {
|
|
function asp_parse_generic_filters( $o ) {
|
|
if ( count($o['frontend_fields']['selected']) > 0 ) {
|
|
$settingsFullyHidden =
|
|
$o['show_frontend_search_settings'] != 1 &&
|
|
$o['frontend_search_settings_visible'] != 1 ? true : false;
|
|
|
|
$id = $o['_id'];
|
|
|
|
if ( $settingsFullyHidden ) {
|
|
$_checked_def = array(
|
|
'exact' => $o['exactonly'] == 1,
|
|
'title' => $o['searchintitle'] == 1,
|
|
'content' => $o['searchincontent'] == 1,
|
|
'excerpt' => $o['searchinexcerpt'] == 1,
|
|
);
|
|
} else {
|
|
$_checked_def = array(
|
|
'exact' => in_array('exact', $o['frontend_fields']['checked']),
|
|
'title' => in_array('title', $o['frontend_fields']['checked']),
|
|
'content' => in_array('content', $o['frontend_fields']['checked']),
|
|
'excerpt' => in_array('excerpt', $o['frontend_fields']['checked']),
|
|
);
|
|
}
|
|
|
|
// Search redirection, memorize options
|
|
if ( isset($o['_fo']) ) {
|
|
$o['_fo']['asp_gen'] = isset($o['_fo']['asp_gen']) ? $o['_fo']['asp_gen'] : array();
|
|
$o['_fo']['asp_gen'] = is_array($o['_fo']['asp_gen']) ? $o['_fo']['asp_gen'] : array( $o['_fo']['asp_gen'] );
|
|
$_checked = array(
|
|
'exact' => in_array('exact', $o['_fo']['asp_gen']),
|
|
'title' => in_array('title', $o['_fo']['asp_gen']),
|
|
'content' => in_array('content', $o['_fo']['asp_gen']),
|
|
'excerpt' => in_array('excerpt', $o['_fo']['asp_gen']),
|
|
);
|
|
} else {
|
|
$_checked = $_checked_def;
|
|
}
|
|
|
|
$filter = wd_asp()->front_filters->create(
|
|
'generic',
|
|
asp_icl_t('Generic filter label (' . $id . ')', $o['generic_filter_label']),
|
|
$o['frontend_fields']['display_mode'],
|
|
$o['frontend_fields']
|
|
);
|
|
$filter->is_api = false;
|
|
|
|
$filter->data['visible'] = count($o['frontend_fields']['selected']) > 0;
|
|
|
|
foreach ( $o['frontend_fields']['selected'] as $item ) {
|
|
$default = $_checked_def[ $item ];
|
|
$selected = $_checked[ $item ];
|
|
$filter->add(
|
|
array(
|
|
'value' => $item,
|
|
'default' => $default,
|
|
'label' => asp_icl_t('Generic field[' . $item . '] (' . $id . ')', $o['frontend_fields']['labels'][ $item ]),
|
|
// "label" => asp_icl_t('Generic field[' . $item . ']', $o['frontend_fields']['labels'][$item]),
|
|
'selected' => $selected,
|
|
'field' => $item,
|
|
)
|
|
);
|
|
}
|
|
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_content_type_filters') ) {
|
|
function asp_parse_content_type_filters( $o ) {
|
|
if ( count($o['content_type_filter']['selected']) > 0 ) {
|
|
$id = $o['_id'];
|
|
// Search redirection, memorize options
|
|
if ( isset($o['_fo']) ) {
|
|
$_carr = isset( $o['_fo']['asp_ctf'] ) && is_array( $o['_fo']['asp_ctf'] ) ? $o['_fo']['asp_ctf'] : array();
|
|
$_carr_def = $o['content_type_filter']['checked'];
|
|
} else {
|
|
$_carr = $o['content_type_filter']['checked'];
|
|
$_carr_def = $o['content_type_filter']['checked'];
|
|
}
|
|
|
|
$_checked = array(
|
|
'any' => in_array('any', $_carr),
|
|
'cpt' => in_array('cpt', $_carr),
|
|
'comments' => in_array('comments', $_carr),
|
|
'taxonomies' => in_array('taxonomies', $_carr),
|
|
'users' => in_array('users', $_carr),
|
|
'blogs' => in_array('blogs', $_carr),
|
|
'buddypress' => in_array('buddypress', $_carr),
|
|
'attachments' => in_array('attachments', $_carr),
|
|
);
|
|
$_checked_def = array(
|
|
'any' => in_array('any', $_carr_def),
|
|
'cpt' => in_array('cpt', $_carr_def),
|
|
'comments' => in_array('comments', $_carr_def),
|
|
'taxonomies' => in_array('taxonomies', $_carr_def),
|
|
'users' => in_array('users', $_carr_def),
|
|
'blogs' => in_array('blogs', $_carr_def),
|
|
'buddypress' => in_array('buddypress', $_carr_def),
|
|
'attachments' => in_array('attachments', $_carr_def),
|
|
);
|
|
|
|
if ( ( $akey = array_search('any', $o['content_type_filter']['selected']) ) !== false ) {
|
|
unset($o['content_type_filter']['selected'][ $akey ]);
|
|
$o['content_type_filter']['selected'] = array_merge(array( 'any' ), $o['content_type_filter']['selected']);
|
|
}
|
|
|
|
$filter = wd_asp()->front_filters->create(
|
|
'content_type',
|
|
asp_icl_t('Content type filter label (' . $id . ')', $o['content_type_filter_label']),
|
|
$o['content_type_filter']['display_mode'],
|
|
$o['content_type_filter']
|
|
);
|
|
$filter->is_api = false;
|
|
|
|
foreach ( $o['content_type_filter']['selected'] as $item ) {
|
|
$value = $item == 'any' ? -1 : $item;
|
|
$default = $_checked_def[ $item ];
|
|
$selected = $_checked[ $item ];
|
|
$filter->add(
|
|
array(
|
|
'value' => $value,
|
|
'default' => $default,
|
|
'label' => asp_icl_t('Content Type field[' . $item . '] (' . $id . ')', $o['content_type_filter']['labels'][ $item ] ),
|
|
'selected' => $selected,
|
|
'field' => $item,
|
|
)
|
|
);
|
|
}
|
|
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_post_type_filters') ) {
|
|
function asp_parse_post_type_filters( $o ) {
|
|
if ( !isset($o['customtypes']) || !is_array($o['customtypes']) ) {
|
|
$o['customtypes'] = array();
|
|
}
|
|
$id = $o['_id'];
|
|
$settingsFullyHidden =
|
|
$o['show_frontend_search_settings'] != 1 &&
|
|
$o['frontend_search_settings_visible'] != 1 ? true : false;
|
|
// When settings are fully hidden, do not show the options
|
|
if (
|
|
$settingsFullyHidden ||
|
|
!isset($o['selected-showcustomtypes']) ||
|
|
!is_array($o['selected-showcustomtypes'])
|
|
) {
|
|
$o['selected-showcustomtypes'] = array();
|
|
}
|
|
|
|
if ( count($o['selected-showcustomtypes']) > 0 ) {
|
|
$filter = wd_asp()->front_filters->create(
|
|
'post_type',
|
|
asp_icl_t('Custom post types label (' . $id . ')', w_isset_def($o['custom_types_label'], 'Filter by Custom Post Type')),
|
|
$o['cpt_display_mode'],
|
|
array(
|
|
'required' => $o['cpt_required'] == 1,
|
|
'invalid_input_text' =>$o['cpt_invalid_input_text'],
|
|
)
|
|
);
|
|
$filter->is_api = false;
|
|
|
|
if ( $o['cpt_cbx_show_select_all'] == 1 ) {
|
|
$filter->add(
|
|
array(
|
|
'value' => -1,
|
|
'default' => true,
|
|
'label' => asp_icl_t('Select all checkbox for post types (' . $id . ')', $o['cpt_cbx_show_select_all_text']),
|
|
'selected' => true,
|
|
'field' => 'select_all',
|
|
)
|
|
);
|
|
}
|
|
|
|
foreach ( $o['selected-showcustomtypes'] as $k => $item ) {
|
|
|
|
if ( $o['cpt_display_mode'] == 'checkboxes' ) {
|
|
$default = in_array($item[0], $o['customtypes']);
|
|
} else {
|
|
$default = $item[0] == $o['cpt_filter_default'];
|
|
}
|
|
if ( isset($o['_fo'], $o['_fo']['customset']) ) {
|
|
$selected = in_array($item[0], $o['_fo']['customset']);
|
|
} else {
|
|
$selected = $default;
|
|
}
|
|
|
|
$filter->add(
|
|
array(
|
|
'value' => $item[0],
|
|
'default' => $default,
|
|
'label' => asp_icl_t($item[0], $item[1]),
|
|
'selected' => $selected,
|
|
'field' => 'cpt',
|
|
)
|
|
);
|
|
}
|
|
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_parse_date_filters') ) {
|
|
function asp_parse_date_filters( $o ) {
|
|
/* Options not set or deactivated, return - if one is set, other is definitely set too */
|
|
if ( empty($o['selected-date_filter_from']) ) {
|
|
return;
|
|
}
|
|
|
|
$_dff = &$o['selected-date_filter_from'];
|
|
$_dft = &$o['selected-date_filter_to'];
|
|
|
|
if ( $_dff['state'] == 'disabled' && $_dft['state'] == 'disabled' ) {
|
|
return;
|
|
}
|
|
|
|
$id = $o['_id'];
|
|
$filter = wd_asp()->front_filters->create(
|
|
'date',
|
|
'Post type date filters',
|
|
'date',
|
|
array(
|
|
'required' => $o['date_filter_required'] == 1,
|
|
'invalid_input_text' => $o['date_filter_invalid_input_text'],
|
|
)
|
|
);
|
|
$filter->is_api = false;
|
|
|
|
$post_types = $o['customtypes'];
|
|
if ( $o['return_attachments'] ) {
|
|
$post_types[] = 'attachment';
|
|
}
|
|
if ( isset($o['selected-showcustomtypes']) && count($o['selected-showcustomtypes']) > 0 ) {
|
|
$selected_post_types = array_map(
|
|
function ( $n ) {
|
|
return $n[0];
|
|
},
|
|
$o['selected-showcustomtypes']
|
|
);
|
|
$post_types = array_unique(array_merge($post_types, $selected_post_types));
|
|
}
|
|
|
|
if ( $_dff['state'] != 'disabled' ) {
|
|
switch ( $_dff['state'] ) {
|
|
case 'rel_date':
|
|
$_def_dff_v = '-' . $_dff['rel_date'][0] . 'y -' . $_dff['rel_date'][1] . 'm -' . $_dff['rel_date'][2] . 'd';
|
|
break;
|
|
case 'earliest_date':
|
|
$_def_dff_v = Post::getEarliestPostDate(
|
|
array(
|
|
'post_type' => $post_types,
|
|
)
|
|
);
|
|
break;
|
|
case 'latest_date':
|
|
$_def_dff_v = Post::getLatestPostDate(
|
|
array(
|
|
'post_type' => $post_types,
|
|
)
|
|
);
|
|
break;
|
|
case 'date':
|
|
default:
|
|
$_def_dff_v = $_dff['date'];
|
|
break;
|
|
}
|
|
|
|
$_dff_v = isset($o['_fo']) && isset($o['_fo']['post_date_from']) ? sanitize_text_field($o['_fo']['post_date_from']) : $_def_dff_v;
|
|
|
|
$filter->add(
|
|
array(
|
|
'value' => $_dff_v,
|
|
'default' => $_def_dff_v,
|
|
'name' => 'post_date_from',
|
|
'label' => asp_icl_t( 'Post date filter: Content from (' . $id . ')', $o['date_filter_from_t'] ),
|
|
'format' => $o['date_filter_from_format'],
|
|
'placeholder' => asp_icl_t( 'Post date filter placeholder (from)', $o['date_filter_from_placeholder'] ),
|
|
)
|
|
);
|
|
}
|
|
if ( $_dft['state'] != 'disabled' ) {
|
|
switch ( $_dft['state'] ) {
|
|
case 'rel_date':
|
|
$_def_dft_v = '-' . $_dft['rel_date'][0] . 'y -' . $_dft['rel_date'][1] . 'm -' . $_dft['rel_date'][2] . 'd';
|
|
break;
|
|
case 'earliest_date':
|
|
$_def_dft_v = Post::getEarliestPostDate(
|
|
array(
|
|
'post_type' => $post_types,
|
|
)
|
|
);
|
|
break;
|
|
case 'latest_date':
|
|
$_def_dft_v = Post::getLatestPostDate(
|
|
array(
|
|
'post_type' => $post_types,
|
|
)
|
|
);
|
|
break;
|
|
case 'date':
|
|
default:
|
|
$_def_dft_v = $_dft['date'];
|
|
break;
|
|
}
|
|
|
|
$_dft_v = isset($o['_fo']) && isset($o['_fo']['post_date_to']) ? sanitize_text_field($o['_fo']['post_date_to']) : $_def_dft_v;
|
|
|
|
$filter->add(
|
|
array(
|
|
'value' => $_dft_v,
|
|
'default' => $_def_dft_v,
|
|
'name' => 'post_date_to',
|
|
'label' => asp_icl_t( 'Post date filter: Content to (' . $id . ')', $o['date_filter_to_t'] ),
|
|
'format' => $o['date_filter_to_format'],
|
|
'placeholder' => asp_icl_t( 'Post date filter placeholder (to) (' . $id . ')', $o['date_filter_to_placeholder'] ),
|
|
)
|
|
);
|
|
}
|
|
|
|
wd_asp()->front_filters->add($filter);
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_icl_t') ) {
|
|
/* Ajax Search pro wrapper for WPML and Polylang print */
|
|
function asp_icl_t( $name, $value, $esc_html = false ) {
|
|
if ( $value == '' ) {
|
|
return $value;
|
|
}
|
|
|
|
$ret = apply_filters('asp_icl_t', $value, $name, $esc_html);
|
|
|
|
if ( function_exists('pll_register_string') && function_exists('pll__') ) {
|
|
PolylangStringTranslations::add($name, $value);
|
|
$ret = pll__($value);
|
|
} elseif ( defined('WPML_PLUGIN_BASENAME') || defined('ICL_SITEPRESS_VERSION') ) {
|
|
do_action( 'wpml_register_single_string', 'ajax-search-pro', $name, $value );
|
|
$ret = apply_filters('wpml_translate_single_string', $value, 'ajax-search-pro', $name);
|
|
} elseif ( function_exists('qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage') ) {
|
|
$ret = qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage( $value );
|
|
}
|
|
if ( $esc_html ) {
|
|
return esc_html( stripslashes( $ret ) );
|
|
} else {
|
|
return stripslashes( $ret );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('asp_gen_rnd_str') ) {
|
|
function asp_gen_rnd_str( $length = 6 ) {
|
|
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
$charactersLength = strlen($characters);
|
|
$randomString = '';
|
|
for ( $i = 0; $i < $length; $i++ ) {
|
|
$randomString .= $characters[ rand(0, $charactersLength - 1) ];
|
|
}
|
|
return $randomString;
|
|
}
|
|
}
|
|
|
|
|
|
if ( !function_exists('asp_get_terms_ordered_by_ids') ) {
|
|
function asp_get_terms_ordered_by_ids( $taxonomy, $ids ) {
|
|
if ( empty($ids) ) {
|
|
return array();
|
|
}
|
|
|
|
$tag_keys_arr = array();
|
|
$final_tags_arr = array();
|
|
|
|
foreach ( $ids as $position => $tag_id ) {
|
|
$tag_keys_arr[ $tag_id ] = $position;
|
|
}
|
|
|
|
$tags = get_terms($taxonomy, array( 'include' => $ids ));
|
|
|
|
foreach ( $tags as $tag ) {
|
|
if ( isset($tag_keys_arr[ $tag->term_id ]) ) {
|
|
$final_tags_arr[ $tag_keys_arr[ $tag->term_id ] ] = $tag;
|
|
}
|
|
}
|
|
|
|
ksort($final_tags_arr);
|
|
|
|
return $final_tags_arr;
|
|
}
|
|
}
|
|
|
|
if ( !function_exists('asp_register_advanced_field_option') ) {
|
|
/**
|
|
* Registers a new Advanced Title and Content field
|
|
*
|
|
* Adds a new advanced title and content field with back-end options and front-end callback handler.
|
|
* See: https://knowledgebase.ajaxsearchpro.com/extend/advanced-field
|
|
*
|
|
* @param array{
|
|
* field_name: string,
|
|
* callback: callable(null|array<string, mixed>, null|stdClass):void,
|
|
* field_type?: 'post_type'|'user',
|
|
* field_label?: string,
|
|
* attributes?: Array<string, array{
|
|
* label: string,
|
|
* placeholder: string,
|
|
* type: 'text'|'textarea'|'number'|'color'|'select'|'multiselect'|'checkbox',
|
|
* name?: string,
|
|
* required?: 0|1,
|
|
* size?: 'xs' | 's' | 'm' | 'l' | 'xl' | '50' | '10',
|
|
* min?: integer,
|
|
* max?: integer,
|
|
* options?: string[] | array{label: string, value: string}[],
|
|
* defaultValue?: string|array{label: string, value: string}|array{label: string, value: string}[]
|
|
* }>
|
|
* } $args of arguments including the field name, label, attributes and callback.
|
|
* @return void
|
|
*/
|
|
function asp_register_advanced_field_option( array $args ) {
|
|
if ( empty($args['field_name']) ) {
|
|
return;
|
|
}
|
|
$args['field_name'] = $args['field_name'] . '_html'; // HTML support
|
|
$args['field_type'] = $args['field_type'] ?? 'post_type';
|
|
add_action(
|
|
'wd_asp_loading_start',
|
|
function () use ( $args ) {
|
|
add_action(
|
|
'asp/utils/advanced-field',
|
|
function ( $manager ) use ( $args ) {
|
|
$manager->add($args);
|
|
}
|
|
);
|
|
if ( isset($args['attributes']) ) {
|
|
add_action(
|
|
'asp/asset/js/wdo-asp-global-backend',
|
|
function () use ( $args ) {
|
|
\WPDRMS\ASP\Utils\Script::objectToInlineScript(
|
|
'wdo-asp-global-backend',
|
|
'AjaxSearchProBackend.Options.AdvancedFieldEditor.' . esc_attr($args['field_type']) . '.' . esc_attr($args['field_name']),
|
|
array(
|
|
'field_name' => $args['field_name'],
|
|
'field_label' => $args['field_label'] ?? $args['field_name'],
|
|
'attributes' => $args['attributes'],
|
|
),
|
|
'after',
|
|
true
|
|
);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
// 7. Polyfill
|
|
// Well, not exactly classic polyfill, but with asp_ prefixes
|
|
// ----------------------------------------------------------------------------------------------------------------------
|
|
if ( !function_exists('asp_wp_get_wp_version') ) {
|
|
/**
|
|
* wp_get_wp_version function only exists in wp 6.7+
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function asp_wp_get_wp_version() {
|
|
static $wp_version;
|
|
|
|
if ( !isset($wp_version) ) {
|
|
require ABSPATH . WPINC . '/version.php';
|
|
}
|
|
|
|
return $wp_version;
|
|
}
|
|
}
|